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 1024
00075 #define PARTICLE_SYSTEM_BIRTH_RATE 0.02f
00076 #define PARTICLE_SYSTEM_LITTER_SIZE 10
00077 #define PARTICLE_SYSTEM_LITTER_SPREAD 0
00078
00079
00080
00081
00082
00083 #define POINT_PARTICLES
00084
00085
00086 #define POINT_PARTICLE_RENDERER
00087
00088
00089
00090 #define SPHERE_VOLUME_EMITTER
00091
00092
00093
00094
00095 #define PARTICLE_FACTORY_LIFESPAN_BASE 0.5f
00096
00097 #define SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE false
00098 #define PARTICLE_RENDERER_ALPHA_MODE BaseParticleRenderer::PR_ALPHA_NONE
00099
00100
00101
00102
00103
00104 #if defined POINT_PARTICLE_RENDERER
00105 #define POINT_PARTICLE_RENDERER_POINT_SIZE 1.0f
00106 #elif defined SPRITE_PARTICLE_RENDERER
00107 #define SPRITE_PARTICLE_RENDERER_TEXTURE_FILE "rock-floor.rgb"
00108 #define SPRITE_PARTICLE_RENDERER_COLOR Colorf(1.0f, 1.0f, 1.0f, 1.0f)
00109
00110
00111 #define SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG true
00112
00113
00114
00115
00116 #define SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA 45.0f
00117 #define SPRITE_PARTICLE_RENDERER_BLEND_METHOD BaseParticleRenderer::PP_BLEND_LINEAR
00118
00119
00120 #endif
00121
00122
00123
00124 #define EMISSION_TYPE_RADIATE
00125
00126
00127 #define EMITTER_AMPLITUDE 1.0
00128
00129 #if defined EMISSION_TYPE_EXPLICIT
00130 #define EXPLICIT_LAUNCH_VEC LVector3f(-1.0f, -1.0f, 1.0f)
00131
00132 #elif defined EMISSION_TYPE_RADIATE
00133 #define RADIATE_ORIGIN LPoint3f(0.0f, 0.0f, 0.0f)
00134 #endif
00135
00136 #if defined SPHERE_VOLUME_EMITTER
00137 #define SPHERE_VOLUME_EMITTER_RADIUS 1.0f
00138 #endif
00139
00140
00141
00142
00143 PhysicsManager physics_manager;
00144 ParticleSystemManager ps_manager;
00145
00146 PT(ParticleSystem) particle_system = new ParticleSystem(1024);
00147 PT(PointParticleFactory) pf = new PointParticleFactory;
00148 PT(SphereVolumeEmitter) pe = new SphereVolumeEmitter;
00149
00150 #if defined POINT_PARTICLE_RENDERER
00151 PT(PointParticleRenderer) pr = new PointParticleRenderer;
00152 #elif defined SPRITE_PARTICLE_RENDERER
00153 PT(SpriteParticleRenderer) pr = new SpriteParticleRenderer;
00154 #endif
00155
00156 PT(Texture) texture;
00157
00158 PT(PhysicalNode) pn = new PhysicalNode;
00159 PT(ForceNode) fn = new ForceNode;
00160
00161 static void
00162 event_csn_update(CPT_Event) {
00163 float dt = ClockObject::get_global_clock()->get_dt();
00164
00165 physics_manager.do_physics(dt);
00166 ps_manager.do_particles(dt);
00167 }
00168
00169 static void
00170 event_add_particles(CPT_Event) {
00171 static initialized = 0;
00172
00173
00174 if(initialized) return;
00175 initialized = 1;
00176
00177
00178 pr->set_alpha_mode(BaseParticleRenderer::PR_ALPHA_USER);
00179 pr->set_user_alpha(1.0);
00180
00181 #if defined POINT_PARTICLE_RENDERER
00182 pr->set_point_size(1.0);
00183 #elif defined SPRITE_PARTICLE_RENDERER
00184 pr->set_texture(texture);
00185 #ifdef SPRITE_PARTICLE_RENDERER_COLOR
00186 pr->set_color(SPRITE_PARTICLE_RENDERER_COLOR);
00187 #endif
00188 #ifdef SPRITE_PARTICLE_RENDERER_X_SCALE_FLAG
00189 pr->set_x_scale_flag(SPRITE_PARTICLE_RENDERER_X_SCALE_FLAG);
00190 #endif
00191 #ifdef SPRITE_PARTICLE_RENDERER_Y_SCALE_FLAG
00192 pr->set_y_scale_flag(SPRITE_PARTICLE_RENDERER_Y_SCALE_FLAG);
00193 #endif
00194 #ifdef SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG
00195 pr->set_anim_angle_flag(SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG);
00196 #endif
00197 #ifdef SPRITE_PARTICLE_RENDERER_INITIAL_X_SCALE
00198 pr->set_initial_x_scale(SPRITE_PARTICLE_RENDERER_INITIAL_X_SCALE);
00199 #endif
00200 #ifdef SPRITE_PARTICLE_RENDERER_FINAL_X_SCALE
00201 pr->set_final_x_scale(SPRITE_PARTICLE_RENDERER_FINAL_X_SCALE);
00202 #endif
00203 #ifdef SPRITE_PARTICLE_RENDERER_INITIAL_Y_SCALE
00204 pr->set_initial_y_scale(SPRITE_PARTICLE_RENDERER_INITIAL_Y_SCALE);
00205 #endif
00206 #ifdef SPRITE_PARTICLE_RENDERER_FINAL_Y_SCALE
00207 pr->set_final_y_scale(SPRITE_PARTICLE_RENDERER_FINAL_Y_SCALE);
00208 #endif
00209 #ifdef SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA
00210 pr->set_nonanimated_theta(SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA);
00211 #endif
00212 #ifdef SPRITE_PARTICLE_RENDERER_BLEND_METHOD
00213
00214 #endif
00215 #define SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE false
00216 #ifdef SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE
00217 pr->set_alpha_disable(SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE);
00218 #endif
00219 #endif
00220
00221
00222 #ifdef PARTICLE_FACTORY_LIFESPAN_BASE
00223 pf->set_lifespan_base(PARTICLE_FACTORY_LIFESPAN_BASE);
00224 #endif
00225 #ifdef PARTICLE_FACTORY_LIFESPAN_SPREAD
00226 pf->set_lifespan_spread(PARTICLE_FACTORY_LIFESPAN_SPREAD);
00227 #endif
00228 #ifdef PARTICLE_FACTORY_MASS_BASE
00229 pf->set_mass_base(PARTICLE_FACTORY_MASS_BASE);
00230 #endif
00231 #ifdef PARTICLE_FACTORY_MASS_SPREAD
00232 pf->set_mass_spread(PARTICLE_FACTORY_MASS_SPREAD);
00233 #endif
00234 #ifdef PARTICLE_FACTORY_TERMINAL_VELOCITY_BASE
00235 pf->set_terminal_velocity_base(PARTICLE_FACTORY_TERMINAL_VELOCITY_BASE);
00236 #endif
00237 #ifdef PARTICLE_FACTORY_TERMINAL_VELOCITY_SPREAD
00238 pf->set_terminal_velocity_spread(PARTICLE_FACTORY_TERMINAL_VELOCITY_SPREAD);
00239 #endif
00240
00241
00242 #ifdef EMITTER_AMPLITUDE
00243 pe->set_amplitude(EMITTER_AMPLITUDE);
00244 #endif
00245 #ifdef EMITTER_AMPLITUDE_SPREAD
00246 pe->set_amplitude_spread(EMITTER_AMPLITUDE_SPREAD);
00247 #endif
00248 #ifdef EMITTER_OFFSET_FORCE
00249 pe->set_offset_force(EMITTER_OFFSET_FORCE);
00250 #endif
00251
00252 #if defined EMISSION_TYPE_EXPLICIT
00253 pe->set_emission_type(BaseParticleEmitter::ET_EXPLICIT);
00254 #ifdef EXPLICIT_LAUNCH_VEC
00255 pe->set_explicit_launch_vector(EXPLICIT_LAUNCH_VEC);
00256 #endif
00257 #elif defined EMISSION_TYPE_RADIATE
00258 pe->set_emission_type(BaseParticleEmitter::ET_RADIATE);
00259 #ifdef RADIATE_ORIGIN
00260 pe->set_radiate_origin(RADIATE_ORIGIN);
00261 #endif
00262 #endif
00263
00264 pe->set_radius(SPHERE_VOLUME_EMITTER_RADIUS);
00265
00266
00267 particle_system->set_birth_rate(PARTICLE_SYSTEM_BIRTH_RATE);
00268 particle_system->set_litter_size(PARTICLE_SYSTEM_LITTER_SIZE);
00269 particle_system->set_litter_spread(PARTICLE_SYSTEM_LITTER_SPREAD);
00270 particle_system->set_emitter(pe);
00271 particle_system->set_renderer(pr);
00272 particle_system->set_factory(pf);
00273
00274 particle_system->set_render_parent(render);
00275
00276 pn->add_physical(particle_system);
00277 new RenderRelation(render, pn);
00278
00279 new RenderRelation(render, fn);
00280
00281 physics_manager.attach_linear_integrator(new LinearEulerIntegrator);
00282 physics_manager.attach_physical(particle_system);
00283
00284 #ifdef PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING
00285 ps_manager.set_frame_stepping(PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING);
00286 #endif
00287 ps_manager.attach_particlesystem(particle_system);
00288
00289 nout << "Added particles." << endl;
00290 event_handler.add_hook("NewFrame", event_csn_update);
00291 }
00292
00293 void demo_keys(EventHandler&) {
00294 new RenderRelation( lights, dlight );
00295 have_dlight = true;
00296
00297 event_handler.add_hook("p", event_add_particles);
00298 }
00299
00300 int main(int argc, char *argv[]) {
00301 define_keys = &demo_keys;
00302
00303 #ifdef SPRITE_PARTICLE_RENDERER
00304 texture = TexturePool::load_texture(SPRITE_PARTICLE_RENDERER_TEXTURE_FILE);
00305 #endif
00306
00307 return framework_main(argc, argv);
00308 }