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

panda/src/testbed/test_sprite_particles.cxx

Go to the documentation of this file.
00001 // Filename: test_sprite_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 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 // particle factory selection
00083 #define POINT_PARTICLES
00084 
00085 // particle renderer selection
00086 #define POINT_PARTICLE_RENDERER
00087 //#define SPRITE_PARTICLE_RENDERER
00088 
00089 // particle emitter selection
00090 #define SPHERE_VOLUME_EMITTER
00091 
00092 /////////////////////////////////////////////////
00093 
00094 // particle factory params
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 //#define PARTICLE_RENDERER_ALPHA_MODE  BaseParticleRenderer::PR_ALPHA_IN
00100 //#define PARTICLE_RENDERER_ALPHA_MODE  BaseParticleRenderer::PR_ALPHA_OUT
00101 //#define PARTICLE_RENDERER_ALPHA_MODE  BaseParticleRenderer::PR_ALPHA_USER
00102 //#define PARTICLE_RENDERER_USER_ALPHA  1.0
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 //  #define SPRITE_PARTICLE_RENDERER_X_SCALE_FLAG       true
00110 //  #define SPRITE_PARTICLE_RENDERER_Y_SCALE_FLAG       true
00111   #define SPRITE_PARTICLE_RENDERER_ANIM_ANGLE_FLAG    true
00112 //  #define SPRITE_PARTICLE_RENDERER_INITIAL_X_SCALE    0.1
00113 //  #define SPRITE_PARTICLE_RENDERER_FINAL_X_SCALE      0.0
00114 //  #define SPRITE_PARTICLE_RENDERER_INITIAL_Y_SCALE    0.0
00115 //  #define SPRITE_PARTICLE_RENDERER_FINAL_Y_SCALE      0.5
00116   #define SPRITE_PARTICLE_RENDERER_NONANIMATED_THETA  45.0f
00117   #define SPRITE_PARTICLE_RENDERER_BLEND_METHOD        BaseParticleRenderer::PP_BLEND_LINEAR
00118 //  #define SPRITE_PARTICLE_RENDERER_BLEND_METHOD      BaseParticleRenderer::PP_BLEND_CUBIC
00119 //  #define SPRITE_PARTICLE_RENDERER_ALPHA_DISABLE     false
00120 #endif
00121 
00122 // particle emitter params
00123 
00124 #define EMISSION_TYPE_RADIATE
00125 //#define EMISSION_TYPE_EXPLICIT
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 //  #define EXPLICIT_LAUNCH_VEC LVector3f(0.0f, 0.0f, 0.0f)
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   // guard against additional "P" presses (bad things happen)
00174   if(initialized) return;
00175   initialized = 1;
00176 
00177   // renderer setup
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       //pr->set_alpha_blend_method(SPRITE_PARTICLE_RENDERER_BLEND_METHOD);
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   // factory setup
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   // emitter setup
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   // system setup
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 }

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