188 lines
5.4 KiB
C++
188 lines
5.4 KiB
C++
/**
|
|
* PANDA 3D SOFTWARE
|
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
*
|
|
* All use of this software is subject to the terms of the revised BSD
|
|
* license. You should have received a copy of this license along
|
|
* with this source code in a file named "LICENSE."
|
|
*
|
|
* @file particleSystem.h
|
|
* @author charles
|
|
* @date 2000-06-14
|
|
*/
|
|
|
|
#ifndef NDEBUG
|
|
// #define PSDEBUG
|
|
#endif
|
|
|
|
// #define PSSANITYCHECK
|
|
|
|
#ifndef PARTICLESYSTEM_H
|
|
#define PARTICLESYSTEM_H
|
|
|
|
#include "pandabase.h"
|
|
#include "pointerTo.h"
|
|
#include "physical.h"
|
|
#include "pandaNode.h"
|
|
#include "referenceCount.h"
|
|
#include "pdeque.h"
|
|
#include "pStatTimer.h"
|
|
#include "baseParticle.h"
|
|
#include "baseParticleRenderer.h"
|
|
#include "baseParticleEmitter.h"
|
|
#include "baseParticleFactory.h"
|
|
|
|
class ParticleSystemManager;
|
|
|
|
/**
|
|
* Contains and manages a particle system.
|
|
*/
|
|
class EXPCL_PANDA_PARTICLESYSTEM ParticleSystem : public Physical {
|
|
PUBLISHED:
|
|
// constructordestructor
|
|
|
|
explicit ParticleSystem(int pool_size = 0);
|
|
ParticleSystem(const ParticleSystem& copy);
|
|
~ParticleSystem();
|
|
|
|
// accessqueries
|
|
INLINE void set_pool_size(int size);
|
|
INLINE void set_birth_rate(PN_stdfloat new_br);
|
|
INLINE void set_soft_birth_rate(PN_stdfloat new_br);
|
|
INLINE void set_litter_size(int new_ls);
|
|
INLINE void set_litter_spread(int new_ls);
|
|
INLINE void set_local_velocity_flag(bool lv);
|
|
INLINE void set_system_grows_older_flag(bool sgo);
|
|
INLINE void set_system_lifespan(PN_stdfloat sl);
|
|
INLINE void set_system_age(PN_stdfloat age);
|
|
INLINE void set_active_system_flag(bool a);
|
|
INLINE void set_spawn_on_death_flag(bool sod);
|
|
INLINE void set_spawn_render_node(PandaNode *node);
|
|
INLINE void set_spawn_render_node_path(const NodePath &node);
|
|
INLINE void set_template_system_flag(bool tsf);
|
|
INLINE void set_render_parent(PandaNode *node);
|
|
INLINE void set_render_parent(const NodePath &node);
|
|
INLINE void set_renderer(BaseParticleRenderer *r);
|
|
INLINE void set_emitter(BaseParticleEmitter *e);
|
|
INLINE void set_factory(BaseParticleFactory *f);
|
|
INLINE void set_floor_z(PN_stdfloat z);
|
|
|
|
INLINE void clear_floor_z();
|
|
|
|
INLINE int get_pool_size() const;
|
|
INLINE PN_stdfloat get_birth_rate() const;
|
|
INLINE PN_stdfloat get_soft_birth_rate() const;
|
|
INLINE int get_litter_size() const;
|
|
INLINE int get_litter_spread() const;
|
|
INLINE bool get_local_velocity_flag() const;
|
|
INLINE bool get_system_grows_older_flag() const;
|
|
INLINE PN_stdfloat get_system_lifespan() const;
|
|
INLINE PN_stdfloat get_system_age() const;
|
|
INLINE bool get_active_system_flag() const;
|
|
INLINE bool get_spawn_on_death_flag() const;
|
|
INLINE PandaNode *get_spawn_render_node() const;
|
|
INLINE NodePath get_spawn_render_node_path() const;
|
|
INLINE bool get_i_was_spawned_flag() const;
|
|
INLINE int get_living_particles() const;
|
|
INLINE NodePath get_render_parent() const;
|
|
INLINE BaseParticleRenderer *get_renderer() const;
|
|
INLINE BaseParticleEmitter *get_emitter() const;
|
|
INLINE BaseParticleFactory *get_factory() const;
|
|
INLINE PN_stdfloat get_floor_z() const;
|
|
|
|
// particle template vector
|
|
|
|
INLINE void add_spawn_template(ParticleSystem *ps);
|
|
INLINE void clear_spawn_templates();
|
|
|
|
// methods
|
|
|
|
INLINE void render();
|
|
INLINE void induce_labor();
|
|
INLINE void clear_to_initial();
|
|
INLINE void soft_stop(PN_stdfloat br = 0.0);
|
|
INLINE void soft_start(PN_stdfloat br = 0.0);
|
|
void update(PN_stdfloat dt);
|
|
|
|
virtual void output(std::ostream &out) const;
|
|
virtual void write_free_particle_fifo(std::ostream &out, int indent=0) const;
|
|
virtual void write_spawn_templates(std::ostream &out, int indent=0) const;
|
|
virtual void write(std::ostream &out, int indent=0) const;
|
|
|
|
private:
|
|
#ifdef PSSANITYCHECK
|
|
int sanity_check();
|
|
#endif
|
|
|
|
bool birth_particle();
|
|
void kill_particle(int pool_index);
|
|
void birth_litter();
|
|
void resize_pool(int size);
|
|
|
|
pdeque< int > _free_particle_fifo;
|
|
|
|
int _particle_pool_size;
|
|
int _living_particles;
|
|
PN_stdfloat _cur_birth_rate;
|
|
PN_stdfloat _birth_rate;
|
|
PN_stdfloat _soft_birth_rate;
|
|
PN_stdfloat _tics_since_birth;
|
|
int _litter_size;
|
|
int _litter_spread;
|
|
PN_stdfloat _system_age;
|
|
PN_stdfloat _system_lifespan;
|
|
PN_stdfloat _floor_z;
|
|
|
|
PT(BaseParticleFactory) _factory;
|
|
PT(BaseParticleEmitter) _emitter;
|
|
PT(BaseParticleRenderer) _renderer;
|
|
ParticleSystemManager *_manager;
|
|
|
|
bool _template_system_flag;
|
|
|
|
// _render_parent is the ALREADY ALLOC'D node under which this system will
|
|
// render its particles.
|
|
|
|
NodePath _render_parent;
|
|
NodePath _render_node_path;
|
|
|
|
bool _active_system_flag;
|
|
bool _local_velocity_flag;
|
|
bool _system_grows_older_flag;
|
|
|
|
// information for systems that will spawn
|
|
|
|
bool _spawn_on_death_flag;
|
|
NodePath _spawn_render_node_path;
|
|
pvector< PT(ParticleSystem) > _spawn_templates;
|
|
|
|
void spawn_child_system(BaseParticle *bp);
|
|
|
|
// information for spawned systems
|
|
bool _i_was_spawned_flag;
|
|
|
|
public:
|
|
static TypeHandle get_class_type() {
|
|
return _type_handle;
|
|
}
|
|
static void init_type() {
|
|
Physical::init_type();
|
|
register_type(_type_handle, "ParticleSystem",
|
|
Physical::get_class_type());
|
|
}
|
|
virtual TypeHandle get_type() const {
|
|
return get_class_type();
|
|
}
|
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
|
|
|
private:
|
|
static TypeHandle _type_handle;
|
|
|
|
friend class ParticleSystemManager; // particleSystemManager.h
|
|
|
|
static PStatCollector _update_collector;
|
|
};
|
|
|
|
#include "particleSystem.I"
|
|
|
|
#endif // PARTICLESYSTEM_H
|