/*************************************************************************/ /* particle_system_sw.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* http://www.godotengine.org */ /*************************************************************************/ /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ /* "Software"), to deal in the Software without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of the Software, and to */ /* permit persons to whom the Software is furnished to do so, subject to */ /* the following conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #ifndef PARTICLE_SYSTEM_SW_H #define PARTICLE_SYSTEM_SW_H /** @author Juan Linietsky */ #include "servers/visual_server.h" struct ParticleSystemSW { enum { MAX_PARTICLES = 1024 }; float particle_vars[VS::PARTICLE_VAR_MAX]; float particle_randomness[VS::PARTICLE_VAR_MAX]; Vector3 emission_half_extents; DVector emission_points; Vector3 gravity_normal; Vector3 emission_base_velocity; int amount; bool emitting; bool height_from_velocity; AABB visibility_aabb; bool sort; bool local_coordinates; struct ColorPhase { float pos; Color color; ColorPhase() { pos = 1.0; color = Color(0.0, 0.0, 1.0, 1.0); } }; int color_phase_count; ColorPhase color_phases[VS::MAX_PARTICLE_COLOR_PHASES]; struct Attractor { Vector3 pos; float force; }; int attractor_count; Attractor attractors[VS::MAX_PARTICLE_ATTRACTORS]; ParticleSystemSW(); ~ParticleSystemSW(); }; struct ParticleSystemProcessSW { enum { PARTICLE_RANDOM_NUMBERS = 8, }; struct ParticleData { Vector3 pos; Vector3 vel; float rot; bool active; float random[PARTICLE_RANDOM_NUMBERS]; ParticleData() { active = 0; rot = 0; } }; bool valid; float particle_system_time; uint32_t rand_seed; Vector particle_data; void process(const ParticleSystemSW *p_system, const Transform &p_transform, float p_time); ParticleSystemProcessSW(); }; struct ParticleSystemDrawInfoSW { struct ParticleDrawInfo { const ParticleSystemProcessSW::ParticleData *data; float d; Transform transform; Color color; }; ParticleDrawInfo draw_info[ParticleSystemSW::MAX_PARTICLES]; ParticleDrawInfo *draw_info_order[ParticleSystemSW::MAX_PARTICLES]; void prepare(const ParticleSystemSW *p_system, const ParticleSystemProcessSW *p_process, const Transform &p_system_transform, const Transform &p_camera_transform); }; #endif