Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

panda/src/testbed/test_particles.cxx

Go to the documentation of this file.
00001 // Filename: test_particles.cxx
00002 // Created by:  
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
00008 //
00009 // All use of this software is subject to the terms of the Panda 3d
00010 // Software license.  You should have received a copy of this license
00011 // along with this source code; you will also find a current copy of
00012 // the license at http://www.panda3d.org/license.txt .
00013 //
00014 // To contact the maintainers of this program write to
00015 // panda3d@yahoogroups.com .
00016 //
00017 ////////////////////////////////////////////////////////////////////
00018 
00019 #include <framework.h>
00020 
00021 #include <eventHandler.h>
00022 #include <chancfg.h>
00023 #include <string>
00024 #include <renderModeTransition.h>
00025 #include <colorTransition.h>
00026 #include <cullFaceTransition.h>
00027 #include <depthTestTransition.h>
00028 #include <depthWriteTransition.h>
00029 #include <textureTransition.h>
00030 #include <lightTransition.h>
00031 #include <materialTransition.h>
00032 #include <transformTransition.h>
00033 #include <get_rel_pos.h>
00034 #include <boundingSphere.h>
00035 #include <geomSphere.h>
00036 #include <geomNode.h>
00037 #include <notify.h>
00038 #include <directionalLight.h>
00039 #include <renderRelation.h>
00040 #include <camera.h>
00041 #include <frustum.h>
00042 #include <orthoProjection.h>
00043 #include <perspectiveProjection.h>
00044 #include <textNode.h>
00045 #include <physicsManager.h>
00046 #include <particleSystem.h>
00047 #include <emitters.h>
00048 #include <particlefactories.h>
00049 #include <forces.h>
00050 #include <sparkleParticleRenderer.h>
00051 #include <pointParticleRenderer.h>
00052 #include <lineParticleRenderer.h>
00053 #include <geomParticleRenderer.h>
00054 #include <spriteParticleRenderer.h>
00055 #include <colorTransition.h>
00056 #include <particleSystemManager.h>
00057 #include <clockObject.h>
00058 #include <nodePath.h>
00059 #include <pointShapeTransition.h>
00060 #include <texture.h>
00061 #include <texturePool.h>
00062 #include <physicalNode.h>
00063 #include <forceNode.h>
00064 #include <linearEulerIntegrator.h>
00065 
00066 // physics.  particle systems.
00067 
00068 /////////////////////////////////////////////////
00069 
00070 // particle system manager params
00071 #define PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING 1
00072 
00073 // particle system params
00074 #define PARTICLE_SYSTEM_POOL_SIZE 1000
00075 #define PARTICLE_SYSTEM_BIRTH_RATE  0.01f
00076 //#define PARTICLE_SYSTEM_BIRTH_RATE  0.5f
00077 #define PARTICLE_SYSTEM_LITTER_SIZE 10
00078 #define PARTICLE_SYSTEM_LITTER_SPREAD 0
00079 
00080 
00081 //#define WIND_FORCE  0.5, 0, 0
00082 //#define NOISE_FORCE 0.02f
00083 
00084 /////////////////////////////////////////////////
00085 
00086 // particle factory selection
00087 #define POINT_PARTICLES
00088 //#define ZSPIN_PARTICLES
00089 //#define ORIENTED_PARTICLES
00090 
00091 // particle renderer selection
00092 //#define POINT_PARTICLE_RENDERER
00093 #define LINE_PARTICLE_RENDERER
00094 //#define SPARKLE_PARTICLE_RENDERER
00095 //#define SPRITE_PARTICLE_RENDERER
00096 //#define GEOM_PARTICLE_RENDERER
00097 
00098 // particle emitter selection
00099 //#define BOX_EMITTER
00100 //#define DISC_EMITTER
00101 //#define LINE_EMITTER
00102 //#define POINT_EMITTER
00103 //#define RECTANGLE_EMITTER
00104 //#define RING_EMITTER
00105 //#define SPHERE_SURFACE_EMITTER
00106 #define SPHERE_VOLUME_EMITTER
00107 //#define TANGENT_RING_EMITTER
00108 
00109 /////////////////////////////////////////////////
00110 
00111 // particle factory params
00112 #define PARTICLE_FACTORY_LIFESPAN_BASE   5.0f
00113 //#define PARTICLE_FACTORY_LIFESPAN_BASE   3.0f
00114 //#define PARTICLE_FACTORY_LIFESPAN_SPREAD 1.0f
00115 //#define PARTICLE_FACTORY_MASS_BASE       1.0f
00116 //#define PARTICLE_FACTORY_MASS_SPREAD     0.2f
00117 //#define PARTICLE_FACTORY_TERMINAL_VELOCITY_BASE   PhysicsObject::_default_terminal_velocity
00118 //#define PARTICLE_FACTORY_TERMINAL_VELOCITY_SPREAD 0.0f
00119 
00120 #ifdef ZSPIN_PARTICLES
00121   #define ZSPIN_PARTICLES_INITIAL_ANGLE         0.0f
00122   #define ZSPIN_PARTICLES_FINAL_ANGLE           0.0f
00123   #define ZSPIN_PARTICLES_INITIAL_ANGLE_SPREAD  90.0f
00124   #define ZSPIN_PARTICLES_FINAL_ANGLE_SPREAD    90.0f
00125 #endif
00126 
00127 // particle renderer params
00128 #define SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE      false
00129 #define PARTICLE_RENDERER_ALPHA_MODE  BaseParticleRenderer::PR_ALPHA_NONE
00130 //#define PARTICLE_RENDERER_ALPHA_MODE  BaseParticleRenderer::PR_ALPHA_IN
00131 //#define PARTICLE_RENDERER_ALPHA_MODE  BaseParticleRenderer::PR_ALPHA_OUT
00132 //#define PARTICLE_RENDERER_ALPHA_MODE  BaseParticleRenderer::PR_ALPHA_USER
00133 //#define PARTICLE_RENDERER_USER_ALPHA  1.0
00134 
00135 #ifdef GEOM_PARTICLE_RENDERER
00136 #elif defined POINT_PARTICLE_RENDERER
00137   #define POINT_PARTICLE_RENDERER_POINT_SIZE    1.0f
00138 //  #define POINT_PARTICLE_RENDERER_STARTCOLOR    Colorf(1.0f, 0.0f, 0.0f, 1.0f)
00139 //  #define POINT_PARTICLE_RENDERER_ENDCOLOR      Colorf(1.0f, 1.0f, 0.0f, 1.0f)
00140 //  #define POINT_PARTICLE_RENDERER_BLEND_TYPE    BaseParticleRenderer::PP_BLEND_LIFE
00141 //  #define POINT_PARTICLE_RENDERER_BLEND_METHOD  BaseParticleRenderer::PP_BLEND_LINEAR
00142 //  #define POINT_PARTICLE_RENDERER_BLEND_METHOD  BaseParticleRenderer::PP_BLEND_CUBIC
00143 
00144 #elif defined LINE_PARTICLE_RENDERER
00145   #define LINE_PARTICLE_RENDERER_HEAD_COLOR   Colorf(1.0f, 1.0f, 1.0f, 1.0f)
00146   #define LINE_PARTICLE_RENDERER_TAIL_COLOR   Colorf(1.0f, 1.0f, 1.0f, 1.0f)
00147 #elif defined SPARKLE_PARTICLE_RENDERER
00148 //  #define SPARKLE_PARTICLE_RENDERER_CENTER_COLOR  Colorf(1.0f, 0.0f, 0.0f, 1.0f)
00149 //  #define SPARKLE_PARTICLE_RENDERER_EDGE_COLOR    Colorf(0.0f, 0.0f, 1.0f, 1.0f)
00150 //  #define SPARKLE_PARTICLE_RENDERER_BIRTH_RADIUS  0.004f
00151 //  #define SPARKLE_PARTICLE_RENDERER_DEATH_RADIUS  1.0f
00152 //  #define SPARKLE_PARTICLE_RENDERER_LIFE_SCALE    SP_SCALE
00153 #elif defined SPRITE_PARTICLE_RENDERER
00154 //  #define SPRITE_PARTICLE_RENDERER_TEXTURE_FILE       "smoke.rgba"
00155 //  #define SPRITE_PARTICLE_RENDERER_TEXTURE_FILE       "lilsmiley.rgba"
00156   #define SPRITE_PARTICLE_RENDERER_TEXTURE_FILE       "rock-floor.rgb"
00157   #define SPRITE_PARTICLE_RENDERER_COLOR              Colorf(1.0f, 1.0f, 1.0f, 1.0f)
00158 //  #define SPRITE_PARTICLE_RENDERER_X_SCALE_FLAG       true
00159 //  #define SPRITE_PARTICLE_RENDERER_Y_SCALE_FLAG       true
00160   #define SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG    true
00161 //  #define SPRITE_PARTICLE_RENDERER_INITIAL_X_SCALE    0.1
00162 //  #define SPRITE_PARTICLE_RENDERER_FINAL_X_SCALE      0.0
00163 //  #define SPRITE_PARTICLE_RENDERER_INITIAL_Y_SCALE    0.0
00164 //  #define SPRITE_PARTICLE_RENDERER_FINAL_Y_SCALE      0.5
00165   #define SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA  45.0f
00166   #define SPRITE_PARTICLE_RENDERER_BLEND_METHOD       BaseParticleRenderer::PP_BLEND_LINEAR
00167 //  #define SPRITE_PARTICLE_RENDERER_BLEND_METHOD       BaseParticleRenderer::PP_BLEND_CUBIC
00168 //  #define SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE      false
00169 #endif
00170 
00171 // particle emitter params
00172 
00173 #define EMISSION_TYPE_EXPLICIT
00174 //#define EMISSION_TYPE_RADIATE
00175 //#define EMISSION_TYPE_CUSTOM
00176 
00177 //#define EMITTER_AMPLITUDE 10.0
00178 #define EMITTER_AMPLITUDE 1.0
00179 //#define EMITTER_AMPLITUDE 0.5
00180 //#define EMITTER_AMPLITUDE_SPREAD 2.0
00181 //#define EMITTER_OFFSET_FORCE LVector3f(1.0, 1.0, 1.0)
00182 
00183 #if defined EMISSION_TYPE_EXPLICIT
00184   #define EXPLICIT_LAUNCH_VEC LVector3f(-1.0f, -1.0f, 1.0f)
00185 //  #define EXPLICIT_LAUNCH_VEC LVector3f(0.0f, 0.0f, 0.0f)
00186 #elif defined EMISSION_TYPE_RADIATE
00187 //  #define RADIATE_ORIGIN LPoint3f(0.0f, 0.0f, 0.5f)
00188   #define RADIATE_ORIGIN LPoint3f(0.0f, 0.0f, 0.0f)
00189 #endif
00190 
00191 #ifdef BOX_EMITTER
00192   #define BOX_EMITTER_MINBOUND LPoint3f(-1.0f, -1.0f, -1.0f)
00193   #define BOX_EMITTER_MAXBOUND LPoint3f(1.0f, 1.0f, 1.0f)
00194 #elif defined DISC_EMITTER
00195   #define DISC_EMITTER_RADIUS           1.0f
00196   #ifdef EMISSION_TYPE_CUSTOM
00197     #define DISC_EMITTER_OUTER_ANGLE      45.0f
00198     #define DISC_EMITTER_INNER_ANGLE      90.0f
00199     #define DISC_EMITTER_OUTER_MAGNITUDE  1.5f
00200     #define DISC_EMITTER_INNER_MAGNITUDE  1.5f
00201     #define DISC_EMITTER_CUBIC_LERPING    false
00202   #endif
00203 #elif defined LINE_EMITTER
00204   #define LINE_EMITTER_ENDPOINT1 LPoint3f(-2.0f, 0.0f, 2.0f)
00205   #define LINE_EMITTER_ENDPOINT2 LPoint3f(2.0f, 0.0f, 2.0f)
00206 #elif defined POINT_EMITTER
00207   #define POINT_EMITTER_LOCATION LPoint3f(1.0f, 1.0f, 1.0f)
00208 #elif defined RECTANGLE_EMITTER
00209   #define RECTANGLE_EMITTER_MINBOUND LPoint2f(-1.0f, -1.0f)
00210   #define RECTANGLE_EMITTER_MAXBOUND LPoint2f(1.0f, 1.0f)
00211 #elif defined RING_EMITTER
00212   #define RING_EMITTER_RADIUS     0.5f
00213   #ifdef EMISSION_TYPE_CUSTOM
00214     #define RING_EMITTER_ANGLE      90.0f
00215   #endif
00216 #elif defined SPHERE_SURFACE_EMITTER
00217   #define SPHERE_SURFACE_EMITTER_RADIUS 1.0f
00218 #elif defined SPHERE_VOLUME_EMITTER
00219   #define SPHERE_VOLUME_EMITTER_RADIUS 1.0f
00220 #elif defined TANGENT_RING_EMITTER
00221   #define TANGENT_RING_EMITTER_RADIUS 1.0f
00222 #endif
00223 
00224 /////////////////////////////////////////////////
00225 
00226 
00227 PhysicsManager physics_manager;
00228 ParticleSystemManager ps_manager;
00229 
00230 PT(ParticleSystem) particle_system = new ParticleSystem(PARTICLE_SYSTEM_POOL_SIZE);
00231 
00232 static int particles_added = 0;
00233 
00234 /*
00235 #if defined POINT_PARTICLES
00236   PT(PointParticleFactory) pf = new PointParticleFactory;
00237 #elif defined ZSPIN_PARTICLES
00238   PT(ZSpinParticleFactory) pf = new ZSpinParticleFactory;
00239 #elif defined ORIENTED_PARTICLES
00240   PT(OrientedParticleFactory) pf = new OrientedParticleFactory;
00241 #endif
00242 */
00243 #if defined POINT_PARTICLES
00244   PT(BaseParticleFactory) pf = new PointParticleFactory;
00245 #elif defined ZSPIN_PARTICLES
00246   PT(BaseParticleFactory) pf = new ZSpinParticleFactory;
00247 #elif defined ORIENTED_PARTICLES
00248   PT(BaseParticleFactory) pf = new OrientedParticleFactory;
00249 #endif
00250 
00251 #if defined GEOM_PARTICLE_RENDERER
00252   PT(GeomParticleRenderer) pr = new GeomParticleRenderer;
00253 #elif defined POINT_PARTICLE_RENDERER
00254   PT(PointParticleRenderer) pr = new PointParticleRenderer;
00255 #elif defined LINE_PARTICLE_RENDERER
00256   PT(LineParticleRenderer) pr = new LineParticleRenderer;
00257 #elif defined SPARKLE_PARTICLE_RENDERER
00258   PT(SparkleParticleRenderer) pr = new SparkleParticleRenderer;
00259 #elif defined SPRITE_PARTICLE_RENDERER
00260   PT(SpriteParticleRenderer) pr = new SpriteParticleRenderer;
00261 #endif
00262 
00263 #if defined BOX_EMITTER
00264   PT(BoxEmitter) pe = new BoxEmitter;
00265 #elif defined DISC_EMITTER
00266   PT(DiscEmitter) pe = new DiscEmitter;
00267 #elif defined LINE_EMITTER
00268   PT(LineEmitter) pe = new LineEmitter;
00269 #elif defined POINT_EMITTER
00270   PT(PointEmitter) pe = new PointEmitter;
00271 #elif defined RECTANGLE_EMITTER
00272   PT(RectangleEmitter) pe = new RectangleEmitter;
00273 #elif defined RING_EMITTER
00274   PT(RingEmitter) pe = new RingEmitter;
00275 #elif defined SPHERE_SURFACE_EMITTER
00276   PT(SphereSurfaceEmitter) pe = new SphereSurfaceEmitter;
00277 #elif defined TANGENT_RING_EMITTER
00278   PT(TangentRingEmitter) pe = new TangentRingEmitter;
00279 #elif defined SPHERE_VOLUME_EMITTER
00280   PT(SphereVolumeEmitter) pe = new SphereVolumeEmitter;
00281 #endif
00282 
00283 PT(Texture) texture;
00284 
00285 #ifdef WIND_FORCE
00286 PT(LinearVectorForce) wind_force = new LinearVectorForce(WIND_FORCE);
00287 #endif
00288 #ifdef NOISE_FORCE
00289 PT(LinearNoiseForce) noise_force = new LinearNoiseForce(NOISE_FORCE);
00290 #endif
00291 
00292 PT(PhysicalNode) pn = new PhysicalNode;
00293 PT(ForceNode) fn = new ForceNode;
00294 
00295 static void
00296 event_csn_update(CPT_Event) {
00297   float dt = ClockObject::get_global_clock()->get_dt();
00298 
00299   physics_manager.do_physics(dt);
00300   ps_manager.do_particles(dt);
00301 }
00302 
00303 static void
00304 event_add_particles(CPT_Event) {
00305 
00306   // guard against additional "P" presses (bad things happen)
00307   if(particles_added) return;
00308   particles_added = 1;
00309 
00310   // renderer setup
00311   #ifdef PARTICLE_RENDERER_ALPHA_MODE
00312     pr->set_alpha_mode(PARTICLE_RENDERER_ALPHA_MODE);
00313   #endif
00314   #ifdef PARTICLE_RENDERER_USER_ALPHA
00315     pr->set_user_alpha(PARTICLE_RENDERER_USER_ALPHA);
00316   #endif
00317 
00318   #ifdef GEOM_PARTICLE_RENDERER
00319   #elif defined POINT_PARTICLE_RENDERER
00320     #ifdef POINT_PARTICLE_RENDERER_POINT_SIZE
00321       pr->set_point_size(POINT_PARTICLE_RENDERER_POINT_SIZE);
00322     #endif
00323     #ifdef POINT_PARTICLE_RENDERER_STARTCOLOR
00324       pr->set_color1(POINT_PARTICLE_RENDERER_STARTCOLOR);
00325     #endif
00326     #ifdef POINT_PARTICLE_RENDERER_ENDCOLOR
00327       pr->set_color2(POINT_PARTICLE_RENDERER_ENDCOLOR);
00328     #endif
00329     #ifdef POINT_PARTICLE_RENDERER_BLEND_TYPE
00330       pr->set_blend_type(POINT_PARTICLE_RENDERER_BLEND_TYPE);
00331     #endif
00332     #ifdef POINT_PARTICLE_RENDERER_BLEND_METHOD
00333       pr->set_blend_method(POINT_PARTICLE_RENDERER_BLEND_METHOD);
00334     #endif
00335   #elif defined LINE_PARTICLE_RENDERER
00336     #ifdef LINE_PARTICLE_RENDERER_HEAD_COLOR
00337       pr->set_head_color(LINE_PARTICLE_RENDERER_HEAD_COLOR);
00338     #endif
00339     #ifdef LINE_PARTICLE_RENDERER_TAIL_COLOR
00340       pr->set_tail_color(LINE_PARTICLE_RENDERER_TAIL_COLOR);
00341     #endif
00342   #elif defined SPARKLE_PARTICLE_RENDERER
00343     #ifdef SPARKLE_PARTICLE_RENDERER_CENTER_COLOR
00344       pr->set_center_color(SPARKLE_PARTICLE_RENDERER_CENTER_COLOR);
00345     #endif
00346     #ifdef SPARKLE_PARTICLE_RENDERER_EDGE_COLOR
00347       pr->set_edge_color(SPARKLE_PARTICLE_RENDERER_EDGE_COLOR);
00348     #endif
00349     #ifdef SPARKLE_PARTICLE_RENDERER_LIFE_SCALE
00350       pr->set_life_scale(SPARKLE_PARTICLE_RENDERER_LIFE_SCALE);
00351     #endif
00352     #ifdef SPARKLE_PARTICLE_RENDERER_BIRTH_RADIUS
00353       pr->set_birth_mag(SPARKLE_PARTICLE_RENDERER_BIRTH_RADIUS);
00354     #endif
00355     #ifdef SPARKLE_PARTICLE_RENDERER_DEATH_RADIUS
00356       pr->set_death_mag(SPARKLE_PARTICLE_RENDERER_DEATH_RADIUS);
00357     #endif
00358   #elif defined SPRITE_PARTICLE_RENDERER
00359     pr->set_texture(texture);
00360     #ifdef SPRITE_PARTICLE_RENDERER_COLOR
00361       pr->set_color(SPRITE_PARTICLE_RENDERER_COLOR);
00362     #endif
00363     #ifdef SPRITE_PARTICLE_RENDERER_X_SCALE_FLAG
00364       pr->set_x_scale_flag(SPRITE_PARTICLE_RENDERER_X_SCALE_FLAG);
00365     #endif
00366     #ifdef SPRITE_PARTICLE_RENDERER_Y_SCALE_FLAG
00367       pr->set_y_scale_flag(SPRITE_PARTICLE_RENDERER_Y_SCALE_FLAG);
00368     #endif
00369     #ifdef SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG
00370       pr->set_anim_angle_flag(SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG);
00371     #endif
00372     #ifdef SPRITE_PARTICLE_RENDERER_INITIAL_X_SCALE
00373       pr->set_initial_x_scale(SPRITE_PARTICLE_RENDERER_INITIAL_X_SCALE);
00374     #endif
00375     #ifdef SPRITE_PARTICLE_RENDERER_FINAL_X_SCALE
00376       pr->set_final_x_scale(SPRITE_PARTICLE_RENDERER_FINAL_X_SCALE);
00377     #endif
00378     #ifdef SPRITE_PARTICLE_RENDERER_INITIAL_Y_SCALE
00379       pr->set_initial_y_scale(SPRITE_PARTICLE_RENDERER_INITIAL_Y_SCALE);
00380     #endif
00381     #ifdef SPRITE_PARTICLE_RENDERER_FINAL_Y_SCALE
00382       pr->set_final_y_scale(SPRITE_PARTICLE_RENDERER_FINAL_Y_SCALE);
00383     #endif
00384     #ifdef SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA
00385       pr->set_nonanimated_theta(SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA);
00386     #endif
00387     #ifdef SPRITE_PARTICLE_RENDERER_BLEND_METHOD
00388       pr->set_alpha_blend_method(SPRITE_PARTICLE_RENDERER_BLEND_METHOD);
00389     #endif
00390     #ifdef SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE
00391       pr->set_alpha_disable(SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE);
00392     #endif
00393   #endif
00394 
00395   // factory setup
00396 
00397   #ifdef PARTICLE_FACTORY_LIFESPAN_BASE
00398     pf->set_lifespan_base(PARTICLE_FACTORY_LIFESPAN_BASE);
00399   #endif
00400   #ifdef PARTICLE_FACTORY_LIFESPAN_SPREAD
00401     pf->set_lifespan_spread(PARTICLE_FACTORY_LIFESPAN_SPREAD);
00402   #endif
00403   #ifdef PARTICLE_FACTORY_MASS_BASE
00404     pf->set_mass_base(PARTICLE_FACTORY_MASS_BASE);
00405   #endif
00406   #ifdef PARTICLE_FACTORY_MASS_SPREAD
00407     pf->set_mass_spread(PARTICLE_FACTORY_MASS_SPREAD);
00408   #endif
00409   #ifdef PARTICLE_FACTORY_TERMINAL_VELOCITY_BASE
00410     pf->set_terminal_velocity_base(PARTICLE_FACTORY_TERMINAL_VELOCITY_BASE);
00411   #endif
00412   #ifdef PARTICLE_FACTORY_TERMINAL_VELOCITY_SPREAD
00413     pf->set_terminal_velocity_spread(PARTICLE_FACTORY_TERMINAL_VELOCITY_SPREAD);
00414   #endif
00415 
00416   #if defined ZSPIN_PARTICLES
00417     #ifdef ZSPIN_PARTICLES_INITIAL_ANGLE
00418       pf->set_initial_angle(ZSPIN_PARTICLES_INITIAL_ANGLE);
00419     #endif
00420     #ifdef ZSPIN_PARTICLES_FINAL_ANGLE
00421       pf->set_final_angle(ZSPIN_PARTICLES_FINAL_ANGLE);
00422     #endif
00423     #ifdef ZSPIN_PARTICLES_INITIAL_ANGLE_SPREAD
00424       pf->set_initial_angle_spread(ZSPIN_PARTICLES_INITIAL_ANGLE_SPREAD);
00425     #endif
00426     #ifdef ZSPIN_PARTICLES_FINAL_ANGLE_SPREAD
00427       pf->set_final_angle_spread(ZSPIN_PARTICLES_FINAL_ANGLE_SPREAD);
00428     #endif
00429   #elif defined ORIENTED_PARTICLES
00430   #endif
00431 
00432   // emitter setup
00433   #ifdef EMITTER_AMPLITUDE
00434     pe->set_amplitude(EMITTER_AMPLITUDE);
00435   #endif
00436   #ifdef EMITTER_AMPLITUDE_SPREAD
00437     pe->set_amplitude_spread(EMITTER_AMPLITUDE_SPREAD);
00438   #endif
00439   #ifdef EMITTER_OFFSET_FORCE
00440     pe->set_offset_force(EMITTER_OFFSET_FORCE);
00441   #endif
00442 
00443   #if defined EMISSION_TYPE_EXPLICIT
00444     pe->set_emission_type(BaseParticleEmitter::ET_EXPLICIT);
00445     #ifdef EXPLICIT_LAUNCH_VEC
00446     pe->set_explicit_launch_vector(EXPLICIT_LAUNCH_VEC);
00447     #endif
00448   #elif defined EMISSION_TYPE_RADIATE
00449     pe->set_emission_type(BaseParticleEmitter::ET_RADIATE);
00450     #ifdef RADIATE_ORIGIN
00451       pe->set_radiate_origin(RADIATE_ORIGIN);
00452     #endif
00453   #elif defined EMISSION_TYPE_CUSTOM
00454     pe->set_emission_type(BaseParticleEmitter::ET_CUSTOM);
00455   #endif
00456 
00457   #ifdef BOX_EMITTER
00458     #ifdef BOX_EMITTER_MINBOUND
00459       pe->set_min_bound(BOX_EMITTER_MINBOUND);
00460     #endif
00461     #ifdef BOX_EMITTER_MAXBOUND
00462       pe->set_max_bound(BOX_EMITTER_MAXBOUND);
00463     #endif
00464   #elif defined DISC_EMITTER
00465     #ifdef DISC_EMITTER_RADIUS
00466       pe->set_radius(DISC_EMITTER_RADIUS);
00467     #endif
00468     #ifdef EMISSION_TYPE_CUSTOM
00469       #ifdef DISC_EMITTER_OUTER_ANGLE
00470         pe->set_outer_angle(DISC_EMITTER_OUTER_ANGLE);
00471       #endif
00472       #ifdef DISC_EMITTER_INNER_ANGLE
00473         pe->set_inner_angle(DISC_EMITTER_INNER_ANGLE);
00474       #endif
00475       #ifdef DISC_EMITTER_OUTER_MAGNITUDE
00476         pe->set_outer_magnitude(DISC_EMITTER_OUTER_MAGNITUDE);
00477       #endif
00478       #ifdef DISC_EMITTER_INNER_MAGNITUDE
00479         pe->set_inner_magnitude(DISC_EMITTER_INNER_MAGNITUDE);
00480       #endif
00481       #ifdef DISC_EMITTER_CUBIC_LERPING
00482         pe->set_cubic_lerping(DISC_EMITTER_CUBIC_LERPING);
00483       #endif
00484     #endif
00485   #elif defined LINE_EMITTER
00486     #ifdef LINE_EMITTER_ENDPOINT1
00487       pe->set_endpoint1(LINE_EMITTER_ENDPOINT1);
00488     #endif
00489     #ifdef LINE_EMITTER_ENDPOINT2
00490       pe->set_endpoint2(LINE_EMITTER_ENDPOINT2);
00491     #endif
00492   #elif defined POINT_EMITTER
00493     #ifdef POINT_EMITTER_LOCATION
00494       pe->set_location(POINT_EMITTER_LOCATION);
00495     #endif
00496   #elif defined RECTANGLE_EMITTER
00497     #ifdef RECTANGLE_EMITTER_MINBOUND
00498       pe->set_min_bound(RECTANGLE_EMITTER_MINBOUND);
00499     #endif
00500     #ifdef RECTANGLE_EMITTER_MAXBOUND
00501       pe->set_max_bound(RECTANGLE_EMITTER_MAXBOUND);
00502     #endif
00503   #elif defined RING_EMITTER
00504     #ifdef RING_EMITTER_RADIUS
00505       pe->set_radius(RING_EMITTER_RADIUS);
00506     #endif
00507     #ifdef EMISSION_TYPE_CUSTOM
00508       #ifdef RING_EMITTER_ANGLE
00509         pe->set_aoe(RING_EMITTER_ANGLE);
00510       #endif
00511     #endif
00512   #elif defined SPHERE_SURFACE_EMITTER
00513     #ifdef SPHERE_SURFACE_EMITTER_RADIUS
00514       pe->set_radius(SPHERE_SURFACE_EMITTER_RADIUS);
00515     #endif
00516   #elif defined TANGENT_RING_EMITTER
00517     #ifdef TANGENT_RING_EMITTER_RADIUS
00518       pe->set_radius(TANGENT_RING_EMITTER_RADIUS);
00519     #endif
00520   #elif defined SPHERE_VOLUME_EMITTER
00521     #ifdef SPHERE_VOLUME_EMITTER_RADIUS
00522       pe->set_radius(SPHERE_VOLUME_EMITTER_RADIUS);
00523     #endif
00524   #endif // emitter type
00525 
00526   // system setup
00527   particle_system->set_birth_rate(PARTICLE_SYSTEM_BIRTH_RATE);
00528   particle_system->set_litter_size(PARTICLE_SYSTEM_LITTER_SIZE);
00529   particle_system->set_litter_spread(PARTICLE_SYSTEM_LITTER_SPREAD);
00530   particle_system->set_emitter(pe);
00531   particle_system->set_renderer(pr);
00532   particle_system->set_factory(pf);
00533 
00534   particle_system->set_render_parent(render);
00535 
00536   pn->add_physical(particle_system);
00537   new RenderRelation(render, pn);
00538 
00539 #ifdef WIND_FORCE
00540   fn->add_force(wind_force);
00541 #endif
00542 #ifdef NOISE_FORCE
00543   fn->add_force(noise_force);
00544 #endif
00545   new RenderRelation(render, fn);
00546 
00547   physics_manager.attach_linear_integrator(new LinearEulerIntegrator);
00548   physics_manager.attach_physical(particle_system);
00549 #ifdef WIND_FORCE
00550   physics_manager.add_linear_force(wind_force);
00551 #endif
00552 
00553 #ifdef PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING
00554   ps_manager.set_frame_stepping(PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING);
00555 #endif
00556   ps_manager.attach_particlesystem(particle_system);
00557 
00558 #ifdef NOISE_FORCE
00559   particle_system->add_linear_force(noise_force);
00560 #endif
00561 
00562   nout << "Added particles." << endl;
00563   event_handler.add_hook("NewFrame", event_csn_update);
00564 }
00565 
00566 static void set_pool_size(int size) {
00567   nout << "setting pool size to " << size << endl;
00568   particle_system->set_pool_size(size);
00569 }
00570 
00571 static void
00572 event_more_particles(CPT_Event) {
00573   static int index = 0;
00574   static int sizes[] = {
00575     10,
00576     999,
00577     998,
00578     999,
00579     1000,
00580     1001,
00581     1002,
00582     1003,
00583     1004,
00584     1000,
00585     16*1000,
00586     4*1000,
00587     3*1000,
00588     2*1000,
00589     1000,
00590     0,
00591   };
00592 
00593   if(!particles_added) return;
00594 
00595   if (0 == sizes[index]) index = 0;
00596   set_pool_size(sizes[index]);
00597   index++;
00598 }
00599 
00600 static void
00601 event_switch_particle_factory_type(CPT_Event) {
00602   static int index = 0;
00603 
00604   if(!particles_added) return;
00605 
00606   cout << "Switching to a";
00607 
00608   switch (index) {
00609     case 0:
00610       cout << " point";
00611       pf = new PointParticleFactory;
00612       particle_system->set_factory(pf);
00613       break;
00614     case 1:
00615       cout << " z-spin";
00616       pf = new ZSpinParticleFactory;
00617       particle_system->set_factory(pf);
00618       break;
00619     case 2:
00620       cout << "n oriented";
00621       pf = new OrientedParticleFactory;
00622       particle_system->set_factory(pf);
00623       break;
00624   }
00625 
00626   cout << " particle factory" << endl;
00627 
00628   index++;
00629   if (index > 2) index = 0;
00630 }
00631 
00632 void demo_keys(EventHandler&) {
00633   new RenderRelation( lights, dlight );
00634   have_dlight = true;
00635 
00636   event_handler.add_hook("p", event_add_particles);
00637   event_handler.add_hook("m", event_more_particles);
00638   event_handler.add_hook(",", event_switch_particle_factory_type);
00639 }
00640 
00641 int main(int argc, char *argv[]) {
00642   define_keys = &demo_keys;
00643 
00644 #ifdef SPRITE_PARTICLE_RENDERER
00645   texture = TexturePool::load_texture(SPRITE_PARTICLE_RENDERER_TEXTURE_FILE);
00646 #endif
00647 
00648   return framework_main(argc, argv);
00649 }

Generated on Fri May 2 00:44:12 2003 for Panda by doxygen1.3