From 80d34ce1a02739a84757137f1f1d5ce9279315c0 Mon Sep 17 00:00:00 2001 From: Mike Goslin Date: Thu, 25 Jan 2001 02:49:24 +0000 Subject: [PATCH] *** empty log message *** --- panda/src/testbed/Sources.pp | 9 + panda/src/testbed/test_sprite_particles.cxx | 283 ++++++++++++++++++++ 2 files changed, 292 insertions(+) create mode 100644 panda/src/testbed/test_sprite_particles.cxx diff --git a/panda/src/testbed/Sources.pp b/panda/src/testbed/Sources.pp index 517a66d110..efa8562f9c 100644 --- a/panda/src/testbed/Sources.pp +++ b/panda/src/testbed/Sources.pp @@ -119,6 +119,15 @@ #end test_bin_target +#begin test_bin_target + #define TARGET test_sprite_particles + + #define SOURCES \ + test_sprite_particles.cxx + #define LOCAL_LIBS $[LOCAL_LIBS] physics particlesystem + +#end test_bin_target + #begin test_bin_target #define TARGET test_recparticles diff --git a/panda/src/testbed/test_sprite_particles.cxx b/panda/src/testbed/test_sprite_particles.cxx new file mode 100644 index 0000000000..1d76deb8c5 --- /dev/null +++ b/panda/src/testbed/test_sprite_particles.cxx @@ -0,0 +1,283 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// 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_LITTER_SIZE 10 +#define PARTICLE_SYSTEM_LITTER_SPREAD 0 + + +///////////////////////////////////////////////// + +// particle factory selection +#define POINT_PARTICLES + +// particle renderer selection +#define POINT_PARTICLE_RENDERER +//#define SPRITE_PARTICLE_RENDERER + +// particle emitter selection +#define SPHERE_VOLUME_EMITTER + +///////////////////////////////////////////////// + +// particle factory params +#define PARTICLE_FACTORY_LIFESPAN_BASE 0.5f + +#if defined POINT_PARTICLE_RENDERER + #define POINT_PARTICLE_RENDERER_POINT_SIZE 1.0f +#elif defined SPRITE_PARTICLE_RENDERER + #define SPRITE_PARTICLE_RENDERER_TEXTURE_FILE "rose.jpg" + #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_RADIATE +//#define EMISSION_TYPE_EXPLICIT + +#define EMITTER_AMPLITUDE 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.0f) +#endif + +#if defined SPHERE_VOLUME_EMITTER + #define SPHERE_VOLUME_EMITTER_RADIUS 1.0f +#endif + +///////////////////////////////////////////////// + + +PhysicsManager physics_manager; +ParticleSystemManager ps_manager; + +PT(ParticleSystem) particle_system = new ParticleSystem(1024); +PT(PointParticleFactory) pf = new PointParticleFactory; +PT(SphereVolumeEmitter) pe = new SphereVolumeEmitter; + +#if defined POINT_PARTICLE_RENDERER + PT(PointParticleRenderer) pr = new PointParticleRenderer; +#elif defined SPRITE_PARTICLE_RENDERER + PT(SpriteParticleRenderer) pr = new SpriteParticleRenderer; +#endif + +PT(Texture) texture; + +PT(PhysicalNode) pn = new PhysicalNode; +PT(ForceNode) fn = new ForceNode; + +static void +event_csn_update(CPT_Event) { + float dt = ClockObject::get_global_clock()->get_dt(); + + physics_manager.do_physics(dt); + ps_manager.do_particles(dt); +} + +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 + pr->set_alpha_mode(BaseParticleRenderer::PR_ALPHA_USER); + pr->set_user_alpha(1.0); + + #if defined POINT_PARTICLE_RENDERER + pr->set_point_size(1.0); + #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 + #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 + + // emitter setup + #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 + #endif + + pe->set_radius(SPHERE_VOLUME_EMITTER_RADIUS); + + // system setup + 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); + + particle_system->set_render_parent(render); + + pn->add_physical(particle_system); + new RenderRelation(render, pn); + + new RenderRelation(render, fn); + + physics_manager.attach_linear_integrator(new LinearEulerIntegrator); + physics_manager.attach_physical(particle_system); + +#ifdef PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING + ps_manager.set_frame_stepping(PARTICLE_SYSTEM_MANAGER_FRAME_STEPPING); +#endif + ps_manager.attach_particlesystem(particle_system); + + nout << "Added particles." << endl; + event_handler.add_hook("NewFrame", event_csn_update); +} + +void demo_keys(EventHandler&) { + new RenderRelation( lights, dlight ); + have_dlight = true; + + event_handler.add_hook("p", event_add_particles); +} + +int main(int argc, char *argv[]) { + define_keys = &demo_keys; + +#ifdef SPRITE_PARTICLE_RENDERER + texture = TexturePool::load_texture(SPRITE_PARTICLE_RENDERER_TEXTURE_FILE); +#endif + + return framework_main(argc, argv); +}