From 88023b0709bdebb2b7d0ed241f816d761f30cc3e Mon Sep 17 00:00:00 2001 From: Darren Ranalli Date: Thu, 12 Oct 2000 00:10:46 +0000 Subject: [PATCH] *** empty log message *** --- panda/src/testbed/Sources.pp | 1 + panda/src/testbed/test_particles.cxx | 478 +++++++++++++++++++++++++-- 2 files changed, 445 insertions(+), 34 deletions(-) diff --git a/panda/src/testbed/Sources.pp b/panda/src/testbed/Sources.pp index 8ac806bbc5..471bb646d2 100644 --- a/panda/src/testbed/Sources.pp +++ b/panda/src/testbed/Sources.pp @@ -100,6 +100,7 @@ #define SOURCES \ test_particles.cxx + #define LOCAL_LIBS $[LOCAL_LIBS] physics particlesystem #end test_bin_target diff --git a/panda/src/testbed/test_particles.cxx b/panda/src/testbed/test_particles.cxx index f6323bfc2f..c1aa1f02b7 100644 --- a/panda/src/testbed/test_particles.cxx +++ b/panda/src/testbed/test_particles.cxx @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -46,18 +47,213 @@ // physics. particle systems. +///////////////////////////////////////////////// + +// particle system manager params +#define PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING 1 + +// particle system params +#define PARTICLE_SYSTEM_POOL_SIZE 1024 +#define PARTICLE_SYSTEM_BIRTH_RATE 0.02f +//#define PARTICLE_SYSTEM_BIRTH_RATE 0.5f +#define PARTICLE_SYSTEM_LITTER_SIZE 10 +#define PARTICLE_SYSTEM_LITTER_SPREAD 0 + + +//#define WIND_FORCE 0.5, 0, 0 +//#define NOISE_FORCE 0.02f + +///////////////////////////////////////////////// + +// particle factory selection +//#define POINT_PARTICLES +#define ZSPIN_PARTICLES +//#define ORIENTED_PARTICLES + +// particle renderer selection +#define POINT_PARTICLE_RENDERER +//#define LINE_PARTICLE_RENDERER +//#define SPARKLE_PARTICLE_RENDERER +//#define SPRITE_PARTICLE_RENDERER +//#define GEOM_PARTICLE_RENDERER + +// particle emitter selection +//#define BOX_EMITTER +//#define DISC_EMITTER +//#define LINE_EMITTER +//#define POINT_EMITTER +//#define RECTANGLE_EMITTER +#define RING_EMITTER +//#define SPHERE_SURFACE_EMITTER +//#define SPHERE_VOLUME_EMITTER +//#define TANGENT_RING_EMITTER + +///////////////////////////////////////////////// + +// particle factory params +#define PARTICLE_FACTORY_LIFESPAN_BASE 0.5f +//#define PARTICLE_FACTORY_LIFESPAN_BASE 3.0f +//#define PARTICLE_FACTORY_LIFESPAN_SPREAD 1.0f +//#define PARTICLE_FACTORY_MASS_BASE 1.0f +//#define PARTICLE_FACTORY_MASS_SPREAD 0.2f +//#define PARTICLE_FACTORY_TERMINAL_VELOCITY_BASE PhysicsObject::_default_terminal_velocity +//#define PARTICLE_FACTORY_TERMINAL_VELOCITY_SPREAD 0.0f + +#ifdef ZSPIN_PARTICLES + #define ZSPIN_PARTICLES_INITIAL_ANGLE 0.0f + #define ZSPIN_PARTICLES_FINAL_ANGLE 0.0f + #define ZSPIN_PARTICLES_INITIAL_ANGLE_SPREAD 90.0f + #define ZSPIN_PARTICLES_FINAL_ANGLE_SPREAD 90.0f +#endif + +// particle renderer params +//#define PARTICLE_RENDERER_ALPHA_MODE PR_NO_ALPHA +#define PARTICLE_RENDERER_ALPHA_MODE PR_ALPHA_IN +#define PARTICLE_RENDERER_USER_ALPHA 1.0 + +#ifdef GEOM_PARTICLE_RENDERER +#elif defined POINT_PARTICLE_RENDERER + #define POINT_PARTICLE_RENDERER_POINT_SIZE 1.0f +// #define POINT_PARTICLE_RENDERER_STARTCOLOR Colorf(1.0f, 0.0f, 0.0f, 1.0f) +// #define POINT_PARTICLE_RENDERER_ENDCOLOR Colorf(1.0f, 1.0f, 0.0f, 1.0f) +// #define POINT_PARTICLE_RENDERER_BLEND_TYPE PP_BLEND_LIFE +// #define POINT_PARTICLE_RENDERER_BLEND_METHOD PP_BLEND_LINEAR +// #define POINT_PARTICLE_RENDERER_BLEND_METHOD PP_BLEND_CUBIC +#elif defined LINE_PARTICLE_RENDERER + #define LINE_PARTICLE_RENDERER_HEAD_COLOR Colorf(1.0f, 1.0f, 1.0f, 1.0f) + #define LINE_PARTICLE_RENDERER_TAIL_COLOR Colorf(1.0f, 1.0f, 1.0f, 1.0f) +#elif defined SPARKLE_PARTICLE_RENDERER +// #define SPARKLE_PARTICLE_RENDERER_CENTER_COLOR Colorf(1.0f, 0.0f, 0.0f, 1.0f) +// #define SPARKLE_PARTICLE_RENDERER_EDGE_COLOR Colorf(0.0f, 0.0f, 1.0f, 1.0f) +// #define SPARKLE_PARTICLE_RENDERER_BIRTH_RADIUS 0.004f +// #define SPARKLE_PARTICLE_RENDERER_DEATH_RADIUS 1.0f +// #define SPARKLE_PARTICLE_RENDERER_LIFE_SCALE SP_SCALE +#elif defined SPRITE_PARTICLE_RENDERER +// #define SPRITE_PARTICLE_RENDERER_TEXTURE_FILE "smoke.rgba" + #define SPRITE_PARTICLE_RENDERER_TEXTURE_FILE "lilsmiley.rgba" + #define SPRITE_PARTICLE_RENDERER_COLOR Colorf(1.0f, 1.0f, 1.0f, 1.0f) +// #define SPRITE_PARTICLE_RENDERER_X_SCALE_FLAG true +// #define SPRITE_PARTICLE_RENDERER_Y_SCALE_FLAG true +// #define SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG true +// #define SPRITE_PARTICLE_RENDERER_INITIAL_X_SCALE 0.1 +// #define SPRITE_PARTICLE_RENDERER_FINAL_X_SCALE 0.0 +// #define SPRITE_PARTICLE_RENDERER_INITIAL_Y_SCALE 0.0 +// #define SPRITE_PARTICLE_RENDERER_FINAL_Y_SCALE 0.5 +// #define SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA 45.0f + #define SPRITE_PARTICLE_RENDERER_BLEND_METHOD PP_BLEND_LINEAR +// #define SPRITE_PARTICLE_RENDERER_BLEND_METHOD PP_BLEND_CUBIC +// #define SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE false +#endif + +// particle emitter params + +#define EMISSION_TYPE_EXPLICIT +//#define EMISSION_TYPE_RADIATE +//#define EMISSION_TYPE_CUSTOM + +//#define EMITTER_AMPLITUDE 10.0 +#define EMITTER_AMPLITUDE 1.0 +//#define EMITTER_AMPLITUDE 0.5 +//#define EMITTER_AMPLITUDE_SPREAD 2.0 +//#define EMITTER_OFFSET_FORCE LVector3f(1.0, 1.0, 1.0) + +#if defined EMISSION_TYPE_EXPLICIT + #define EXPLICIT_LAUNCH_VEC LVector3f(-1.0f, -1.0f, 1.0f) +// #define EXPLICIT_LAUNCH_VEC LVector3f(0.0f, 0.0f, 0.0f) +#elif defined EMISSION_TYPE_RADIATE +// #define RADIATE_ORIGIN LPoint3f(0.0f, 0.0f, 0.5f) + #define RADIATE_ORIGIN LPoint3f(0.0f, 0.0f, 0.0f) +#endif + +#ifdef BOX_EMITTER + #define BOX_EMITTER_MINBOUND LPoint3f(-1.0f, -1.0f, -1.0f) + #define BOX_EMITTER_MAXBOUND LPoint3f(1.0f, 1.0f, 1.0f) +#elif defined DISC_EMITTER + #define DISC_EMITTER_RADIUS 1.0f + #ifdef EMISSION_TYPE_CUSTOM + #define DISC_EMITTER_OUTER_ANGLE 45.0f + #define DISC_EMITTER_INNER_ANGLE 90.0f + #define DISC_EMITTER_OUTER_MAGNITUDE 1.5f + #define DISC_EMITTER_INNER_MAGNITUDE 1.5f + #define DISC_EMITTER_CUBIC_LERPING false + #endif +#elif defined LINE_EMITTER + #define LINE_EMITTER_ENDPOINT1 LPoint3f(-2.0f, 0.0f, 2.0f) + #define LINE_EMITTER_ENDPOINT2 LPoint3f(2.0f, 0.0f, 2.0f) +#elif defined POINT_EMITTER + #define POINT_EMITTER_LOCATION LPoint3f(1.0f, 1.0f, 1.0f) +#elif defined RECTANGLE_EMITTER + #define RECTANGLE_EMITTER_MINBOUND LPoint2f(-1.0f, -1.0f) + #define RECTANGLE_EMITTER_MAXBOUND LPoint2f(1.0f, 1.0f) +#elif defined RING_EMITTER + #define RING_EMITTER_RADIUS 0.5f + #ifdef EMISSION_TYPE_CUSTOM + #define RING_EMITTER_ANGLE 90.0f + #endif +#elif defined SPHERE_SURFACE_EMITTER + #define SPHERE_SURFACE_EMITTER_RADIUS 1.0f +#elif defined SPHERE_VOLUME_EMITTER + #define SPHERE_VOLUME_EMITTER_RADIUS 1.0f +#elif defined TANGENT_RING_EMITTER + #define TANGENT_RING_EMITTER_RADIUS 1.0f +#endif + +///////////////////////////////////////////////// + + PhysicsManager physics_manager; ParticleSystemManager ps_manager; -PT(ParticleSystem) smoke_system = new ParticleSystem(768); -PT(ZSpinParticleFactory) zpf = new ZSpinParticleFactory; -PT(SpriteParticleRenderer) spr = new SpriteParticleRenderer; -PT(DiscEmitter) de = new DiscEmitter; +PT(ParticleSystem) particle_system = new ParticleSystem(PARTICLE_SYSTEM_POOL_SIZE); -PT(Texture) smoke; +#if defined POINT_PARTICLES + PT(PointParticleFactory) pf = new PointParticleFactory; +#elif defined ZSPIN_PARTICLES + PT(ZSpinParticleFactory) pf = new ZSpinParticleFactory; +#elif defined ORIENTED_PARTICLES + PT(OrientedParticleFactory) pf = new OrientedParticleFactory; +#endif -PT(LinearVectorForce) wind_force = new LinearVectorForce(0.5, 0, 0); -PT(LinearNoiseForce) noise_force = new LinearNoiseForce(0.02f); +#if defined GEOM_PARTICLE_RENDERER + PT(GeomParticleRenderer) pr = new GeomParticleRenderer; +#elif defined POINT_PARTICLE_RENDERER + PT(PointParticleRenderer) pr = new PointParticleRenderer; +#elif defined LINE_PARTICLE_RENDERER + PT(LineParticleRenderer) pr = new LineParticleRenderer; +#elif defined SPARKLE_PARTICLE_RENDERER + PT(SparkleParticleRenderer) pr = new SparkleParticleRenderer; +#elif defined SPRITE_PARTICLE_RENDERER + PT(SpriteParticleRenderer) pr = new SpriteParticleRenderer; +#endif + +#if defined BOX_EMITTER + PT(BoxEmitter) pe = new BoxEmitter; +#elif defined DISC_EMITTER + PT(DiscEmitter) pe = new DiscEmitter; +#elif defined LINE_EMITTER + PT(LineEmitter) pe = new LineEmitter; +#elif defined POINT_EMITTER + PT(PointEmitter) pe = new PointEmitter; +#elif defined RECTANGLE_EMITTER + PT(RectangleEmitter) pe = new RectangleEmitter; +#elif defined RING_EMITTER + PT(RingEmitter) pe = new RingEmitter; +#elif defined SPHERE_SURFACE_EMITTER + PT(SphereSurfaceEmitter) pe = new SphereSurfaceEmitter; +#elif defined TANGENT_RING_EMITTER + PT(TangentRingEmitter) pe = new TangentRingEmitter; +#elif defined SPHERE_VOLUME_EMITTER + PT(SphereVolumeEmitter) pe = new SphereVolumeEmitter; +#endif + +PT(Texture) texture; + +#ifdef WIND_FORCE +PT(LinearVectorForce) wind_force = new LinearVectorForce(WIND_FORCE); +#endif +#ifdef NOISE_FORCE +PT(LinearNoiseForce) noise_force = new LinearNoiseForce(NOISE_FORCE); +#endif PT(PhysicalNode) pn = new PhysicalNode; PT(ForceNode) fn = new ForceNode; @@ -72,51 +268,263 @@ event_csn_update(CPT_Event) { static void event_add_particles(CPT_Event) { + static initialized = 0; + + // guard against additional "P" presses (bad things happen) + if(initialized) return; + initialized = 1; + // renderer setup - spr->set_texture(smoke); - spr->set_animation_flags(true, true, true); - spr->set_x_ratios(0.02f, 0.4f); - spr->set_y_ratios(0.02f, 0.4f); - spr->set_alpha_decay(PR_ALPHA_OUT); + #ifdef PARTICLE_RENDERER_ALPHA_MODE + pr->set_alpha_mode(PARTICLE_RENDERER_ALPHA_MODE); + #endif + #ifdef PARTICLE_RENDERER_USER_ALPHA + pr->set_user_alpha(PARTICLE_RENDERER_USER_ALPHA); + #endif + + #ifdef GEOM_PARTICLE_RENDERER + #elif defined POINT_PARTICLE_RENDERER + #ifdef POINT_PARTICLE_RENDERER_POINT_SIZE + pr->set_point_size(POINT_PARTICLE_RENDERER_POINT_SIZE); + #endif + #ifdef POINT_PARTICLE_RENDERER_STARTCOLOR + pr->set_color1(POINT_PARTICLE_RENDERER_STARTCOLOR); + #endif + #ifdef POINT_PARTICLE_RENDERER_ENDCOLOR + pr->set_color2(POINT_PARTICLE_RENDERER_ENDCOLOR); + #endif + #ifdef POINT_PARTICLE_RENDERER_BLEND_TYPE + pr->set_blend_type(POINT_PARTICLE_RENDERER_BLEND_TYPE); + #endif + #ifdef POINT_PARTICLE_RENDERER_BLEND_METHOD + pr->set_blend_method(POINT_PARTICLE_RENDERER_BLEND_METHOD); + #endif + #elif defined LINE_PARTICLE_RENDERER + #ifdef LINE_PARTICLE_RENDERER_HEAD_COLOR + pr->set_head_color(LINE_PARTICLE_RENDERER_HEAD_COLOR); + #endif + #ifdef LINE_PARTICLE_RENDERER_TAIL_COLOR + pr->set_tail_color(LINE_PARTICLE_RENDERER_TAIL_COLOR); + #endif + #elif defined SPARKLE_PARTICLE_RENDERER + #ifdef SPARKLE_PARTICLE_RENDERER_CENTER_COLOR + pr->set_center_color(SPARKLE_PARTICLE_RENDERER_CENTER_COLOR); + #endif + #ifdef SPARKLE_PARTICLE_RENDERER_EDGE_COLOR + pr->set_edge_color(SPARKLE_PARTICLE_RENDERER_EDGE_COLOR); + #endif + #ifdef SPARKLE_PARTICLE_RENDERER_LIFE_SCALE + pr->set_life_scale(SPARKLE_PARTICLE_RENDERER_LIFE_SCALE); + #endif + #ifdef SPARKLE_PARTICLE_RENDERER_BIRTH_RADIUS + pr->set_birth_mag(SPARKLE_PARTICLE_RENDERER_BIRTH_RADIUS); + #endif + #ifdef SPARKLE_PARTICLE_RENDERER_DEATH_RADIUS + pr->set_death_mag(SPARKLE_PARTICLE_RENDERER_DEATH_RADIUS); + #endif + #elif defined SPRITE_PARTICLE_RENDERER + pr->set_texture(texture); + #ifdef SPRITE_PARTICLE_RENDERER_COLOR + pr->set_color(SPRITE_PARTICLE_RENDERER_COLOR); + #endif + #ifdef SPRITE_PARTICLE_RENDERER_X_SCALE_FLAG + pr->set_x_scale_flag(SPRITE_PARTICLE_RENDERER_X_SCALE_FLAG); + #endif + #ifdef SPRITE_PARTICLE_RENDERER_Y_SCALE_FLAG + pr->set_y_scale_flag(SPRITE_PARTICLE_RENDERER_Y_SCALE_FLAG); + #endif + #ifdef SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG + pr->set_anim_angle_flag(SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG); + #endif + #ifdef SPRITE_PARTICLE_RENDERER_INITIAL_X_SCALE + pr->set_initial_x_scale(SPRITE_PARTICLE_RENDERER_INITIAL_X_SCALE); + #endif + #ifdef SPRITE_PARTICLE_RENDERER_FINAL_X_SCALE + pr->set_final_x_scale(SPRITE_PARTICLE_RENDERER_FINAL_X_SCALE); + #endif + #ifdef SPRITE_PARTICLE_RENDERER_INITIAL_Y_SCALE + pr->set_initial_y_scale(SPRITE_PARTICLE_RENDERER_INITIAL_Y_SCALE); + #endif + #ifdef SPRITE_PARTICLE_RENDERER_FINAL_Y_SCALE + pr->set_final_y_scale(SPRITE_PARTICLE_RENDERER_FINAL_Y_SCALE); + #endif + #ifdef SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA + pr->set_nonanimated_theta(SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA); + #endif + #ifdef SPRITE_PARTICLE_RENDERER_BLEND_METHOD + pr->set_alpha_blend_method(SPRITE_PARTICLE_RENDERER_BLEND_METHOD); + #endif + #define SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE false + #ifdef SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE + pr->set_alpha_disable(SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE); + #endif + #endif // factory setup - zpf->set_lifespan_base(5.0f); - zpf->set_mass_base(1.0f); - zpf->set_mass_delta(0.25f); - zpf->set_initial_theta(0.0f); - zpf->set_final_theta(0.0f); - zpf->set_theta_delta(90.0f); + #ifdef PARTICLE_FACTORY_LIFESPAN_BASE + pf->set_lifespan_base(PARTICLE_FACTORY_LIFESPAN_BASE); + #endif + #ifdef PARTICLE_FACTORY_LIFESPAN_SPREAD + pf->set_lifespan_spread(PARTICLE_FACTORY_LIFESPAN_SPREAD); + #endif + #ifdef PARTICLE_FACTORY_MASS_BASE + pf->set_mass_base(PARTICLE_FACTORY_MASS_BASE); + #endif + #ifdef PARTICLE_FACTORY_MASS_SPREAD + pf->set_mass_spread(PARTICLE_FACTORY_MASS_SPREAD); + #endif + #ifdef PARTICLE_FACTORY_TERMINAL_VELOCITY_BASE + pf->set_terminal_velocity_base(PARTICLE_FACTORY_TERMINAL_VELOCITY_BASE); + #endif + #ifdef PARTICLE_FACTORY_TERMINAL_VELOCITY_SPREAD + pf->set_terminal_velocity_spread(PARTICLE_FACTORY_TERMINAL_VELOCITY_SPREAD); + #endif + + #if defined ZSPIN_PARTICLES + #ifdef ZSPIN_PARTICLES_INITIAL_ANGLE + pf->set_initial_angle(ZSPIN_PARTICLES_INITIAL_ANGLE); + #endif + #ifdef ZSPIN_PARTICLES_FINAL_ANGLE + pf->set_final_angle(ZSPIN_PARTICLES_FINAL_ANGLE); + #endif + #ifdef ZSPIN_PARTICLES_INITIAL_ANGLE_SPREAD + pf->set_initial_angle_spread(ZSPIN_PARTICLES_INITIAL_ANGLE_SPREAD); + #endif + #ifdef ZSPIN_PARTICLES_FINAL_ANGLE_SPREAD + pf->set_final_angle_spread(ZSPIN_PARTICLES_FINAL_ANGLE_SPREAD); + #endif + #elif defined ORIENTED_PARTICLES + #endif // emitter setup - de->set_radius(0.2f); - de->set_outer_aoe(70.0f); - de->set_inner_aoe(90.0f); - de->set_inner_magnitude(3.0f); - de->set_outer_magnitude(2.5f); + #ifdef EMITTER_AMPLITUDE + pe->set_amplitude(EMITTER_AMPLITUDE); + #endif + #ifdef EMITTER_AMPLITUDE_SPREAD + pe->set_amplitude_spread(EMITTER_AMPLITUDE_SPREAD); + #endif + #ifdef EMITTER_OFFSET_FORCE + pe->set_offset_force(EMITTER_OFFSET_FORCE); + #endif + + #if defined EMISSION_TYPE_EXPLICIT + pe->set_emission_type(BaseParticleEmitter::ET_EXPLICIT); + #ifdef EXPLICIT_LAUNCH_VEC + pe->set_explicit_launch_vector(EXPLICIT_LAUNCH_VEC); + #endif + #elif defined EMISSION_TYPE_RADIATE + pe->set_emission_type(BaseParticleEmitter::ET_RADIATE); + #ifdef RADIATE_ORIGIN + pe->set_radiate_origin(RADIATE_ORIGIN); + #endif + #elif defined EMISSION_TYPE_CUSTOM + pe->set_emission_type(BaseParticleEmitter::ET_CUSTOM); + #endif + + #ifdef BOX_EMITTER + #ifdef BOX_EMITTER_MINBOUND + pe->set_min_bound(BOX_EMITTER_MINBOUND); + #endif + #ifdef BOX_EMITTER_MAXBOUND + pe->set_max_bound(BOX_EMITTER_MAXBOUND); + #endif + #elif defined DISC_EMITTER + #ifdef DISC_EMITTER_RADIUS + pe->set_radius(DISC_EMITTER_RADIUS); + #endif + #ifdef EMISSION_TYPE_CUSTOM + #ifdef DISC_EMITTER_OUTER_ANGLE + pe->set_outer_aoe(DISC_EMITTER_OUTER_ANGLE); + #endif + #ifdef DISC_EMITTER_INNER_ANGLE + pe->set_inner_aoe(DISC_EMITTER_INNER_ANGLE); + #endif + #ifdef DISC_EMITTER_OUTER_MAGNITUDE + pe->set_outer_magnitude(DISC_EMITTER_OUTER_MAGNITUDE); + #endif + #ifdef DISC_EMITTER_INNER_MAGNITUDE + pe->set_inner_magnitude(DISC_EMITTER_INNER_MAGNITUDE); + #endif + #ifdef DISC_EMITTER_CUBIC_LERPING + pe->set_cubic_lerping(DISC_EMITTER_CUBIC_LERPING); + #endif + #endif + #elif defined LINE_EMITTER + #ifdef LINE_EMITTER_ENDPOINT1 + pe->set_endpoint1(LINE_EMITTER_ENDPOINT1); + #endif + #ifdef LINE_EMITTER_ENDPOINT2 + pe->set_endpoint2(LINE_EMITTER_ENDPOINT2); + #endif + #elif defined POINT_EMITTER + #ifdef POINT_EMITTER_LOCATION + pe->set_location(POINT_EMITTER_LOCATION); + #endif + #elif defined RECTANGLE_EMITTER + #ifdef RECTANGLE_EMITTER_MINBOUND + pe->set_min_bound(RECTANGLE_EMITTER_MINBOUND); + #endif + #ifdef RECTANGLE_EMITTER_MAXBOUND + pe->set_max_bound(RECTANGLE_EMITTER_MAXBOUND); + #endif + #elif defined RING_EMITTER + #ifdef RING_EMITTER_RADIUS + pe->set_radius(RING_EMITTER_RADIUS); + #endif + #ifdef EMISSION_TYPE_CUSTOM + #ifdef RING_EMITTER_ANGLE + pe->set_aoe(RING_EMITTER_ANGLE); + #endif + #endif + #elif defined SPHERE_SURFACE_EMITTER + #ifdef SPHERE_SURFACE_EMITTER_RADIUS + pe->set_radius(SPHERE_SURFACE_EMITTER_RADIUS); + #endif + #elif defined TANGENT_RING_EMITTER + #ifdef TANGENT_RING_EMITTER_RADIUS + pe->set_radius(TANGENT_RING_EMITTER_RADIUS); + #endif + #elif defined SPHERE_VOLUME_EMITTER + #ifdef SPHERE_VOLUME_EMITTER_RADIUS + pe->set_radius(SPHERE_VOLUME_EMITTER_RADIUS); + #endif + #endif // emitter type // system setup - smoke_system->set_birth_rate(0.15f); - smoke_system->set_litter_size(2); - smoke_system->set_emitter(de); - smoke_system->set_renderer(spr); - smoke_system->set_factory(zpf); + particle_system->set_birth_rate(PARTICLE_SYSTEM_BIRTH_RATE); + particle_system->set_litter_size(PARTICLE_SYSTEM_LITTER_SIZE); + particle_system->set_litter_spread(PARTICLE_SYSTEM_LITTER_SPREAD); + particle_system->set_emitter(pe); + particle_system->set_renderer(pr); + particle_system->set_factory(pf); - smoke_system->set_render_parent(render); + particle_system->set_render_parent(render); - pn->add_physical(smoke_system); + pn->add_physical(particle_system); new RenderRelation(render, pn); +#ifdef WIND_FORCE fn->add_force(wind_force); +#endif +#ifdef NOISE_FORCE fn->add_force(noise_force); +#endif new RenderRelation(render, fn); physics_manager.attach_linear_integrator(new LinearEulerIntegrator); - physics_manager.attach_physical(smoke_system); + physics_manager.attach_physical(particle_system); +#ifdef WIND_FORCE physics_manager.add_linear_force(wind_force); +#endif - ps_manager.attach_particlesystem(smoke_system); +#ifdef PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING + ps_manager.set_frame_stepping(PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING); +#endif + ps_manager.attach_particlesystem(particle_system); - smoke_system->add_linear_force(noise_force); +#ifdef NOISE_FORCE + particle_system->add_linear_force(noise_force); +#endif nout << "Added particles." << endl; event_handler.add_hook("NewFrame", event_csn_update); @@ -132,7 +540,9 @@ void demo_keys(EventHandler&) { int main(int argc, char *argv[]) { define_keys = &demo_keys; - smoke = TexturePool::load_texture("smoke.rgba"); +#ifdef SPRITE_PARTICLE_RENDERER + texture = TexturePool::load_texture(SPRITE_PARTICLE_RENDERER_TEXTURE_FILE); +#endif return framework_main(argc, argv); }