Browse Source

*** empty log message ***

Darren Ranalli 25 năm trước cách đây
mục cha
commit
88023b0709
2 tập tin đã thay đổi với 445 bổ sung34 xóa
  1. 1 0
      panda/src/testbed/Sources.pp
  2. 444 34
      panda/src/testbed/test_particles.cxx

+ 1 - 0
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
 

+ 444 - 34
panda/src/testbed/test_particles.cxx

@@ -31,6 +31,7 @@
 #include <forces.h>
 #include <sparkleParticleRenderer.h>
 #include <pointParticleRenderer.h>
+#include <lineParticleRenderer.h>
 #include <geomParticleRenderer.h>
 #include <spriteParticleRenderer.h>
 #include <colorTransition.h>
@@ -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);
+
+#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
+
+#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
 
-PT(Texture) smoke;
+#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(LinearVectorForce) wind_force = new LinearVectorForce(0.5, 0, 0);
-PT(LinearNoiseForce) noise_force = new LinearNoiseForce(0.02f);
+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);
 }