00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
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
00067
00068
00069
00070
00071 #define PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING 1
00072
00073
00074 #define PARTICLE_SYSTEM_POOL_SIZE 1000
00075 #define PARTICLE_SYSTEM_BIRTH_RATE 0.01f
00076
00077 #define PARTICLE_SYSTEM_LITTER_SIZE 10
00078 #define PARTICLE_SYSTEM_LITTER_SPREAD 0
00079
00080
00081
00082
00083
00084
00085
00086
00087 #define POINT_PARTICLES
00088
00089
00090
00091
00092
00093 #define LINE_PARTICLE_RENDERER
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 #define SPHERE_VOLUME_EMITTER
00107
00108
00109
00110
00111
00112 #define PARTICLE_FACTORY_LIFESPAN_BASE 5.0f
00113
00114
00115
00116
00117
00118
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
00128 #define SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE false
00129 #define PARTICLE_RENDERER_ALPHA_MODE BaseParticleRenderer::PR_ALPHA_NONE
00130
00131
00132
00133
00134
00135 #ifdef GEOM_PARTICLE_RENDERER
00136 #elif defined POINT_PARTICLE_RENDERER
00137 #define POINT_PARTICLE_RENDERER_POINT_SIZE 1.0f
00138
00139
00140
00141
00142
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
00149
00150
00151
00152
00153 #elif defined SPRITE_PARTICLE_RENDERER
00154
00155
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
00159
00160 #define SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG true
00161
00162
00163
00164
00165 #define SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA 45.0f
00166 #define SPRITE_PARTICLE_RENDERER_BLEND_METHOD BaseParticleRenderer::PP_BLEND_LINEAR
00167
00168
00169 #endif
00170
00171
00172
00173 #define EMISSION_TYPE_EXPLICIT
00174
00175
00176
00177
00178 #define EMITTER_AMPLITUDE 1.0
00179
00180
00181
00182
00183 #if defined EMISSION_TYPE_EXPLICIT
00184 #define EXPLICIT_LAUNCH_VEC LVector3f(-1.0f, -1.0f, 1.0f)
00185
00186 #elif defined EMISSION_TYPE_RADIATE
00187
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
00236
00237
00238
00239
00240
00241
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
00307 if(particles_added) return;
00308 particles_added = 1;
00309
00310
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
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
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
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 }