61bool ParticleEmitterClass::DebugDisable =
false;
68bool ParticleEmitterClass::DefaultRemoveOnComplete =
true;
73 float vel_inherit_factor,
81 int max_buffer_size,
bool pingpong,
int render_mode,
int frame_mode,
85 EmitRate(emit_rate > 0.0f ? (unsigned int)(1000.0f / emit_rate) : 1000U),
86 BurstSize(burst_size != 0 ? burst_size : 1),
90 BaseVel(base_vel * 0.001f),
92 OutwardVel(out_vel * 0.001f),
93 VelInheritFactor(vel_inherit_factor),
96 PrevOrig(0.0, 0.0, 0.0),
99 BufferSceneNeeded(
true),
100 ParticlesLeft(max_particles),
101 MaxParticles(max_particles),
103 NameString(::_strdup (
"ParticleEmitter")),
105 RemoveOnComplete(DefaultRemoveOnComplete),
111 max_age = max_age > 0.0f ? max_age : 1.0f;
112 VelRand->Scale(0.001f);
117 int max_num = BurstSize * emit_rate * (max_age + 1);
118 if (max_particles > 0) max_num =
MIN(max_num, max_particles);
119 if (max_buffer_size > 0) max_num =
MIN(max_num, max_buffer_size);
120 max_num =
MAX(max_num, 2);
123 frames, blur_times, accel/1000000.0f,max_age, future_start, tex, shader, pingpong, render_mode, frame_mode,
131 EmitRate(src.EmitRate),
132 BurstSize(src.BurstSize),
133 OneTimeBurstSize(src.OneTimeBurstSize),
134 OneTimeBurst(src.OneTimeBurst),
135 PosRand(src.PosRand ? src.PosRand->
Clone() :
NULL),
136 BaseVel(src.BaseVel),
137 VelRand(src.VelRand ? src.VelRand->
Clone() :
NULL),
138 OutwardVel(src.OutwardVel),
139 VelInheritFactor(src.VelInheritFactor),
140 EmitRemain(src.EmitRemain),
142 PrevOrig(src.PrevOrig),
145 BufferSceneNeeded(
true),
146 ParticlesLeft(src.ParticlesLeft),
147 MaxParticles(src.MaxParticles),
149 NameString(::_strdup (src.NameString)),
150 UserString(::_strdup (src.UserString)),
151 RemoveOnComplete(src.RemoveOnComplete),
155 IsInvisible(src.IsInvisible)
158 Buffer->Set_Emitter(
this);
177 Buffer->Emitter_Is_Dead();
178 Buffer->Release_Ref();
180 if (PosRand !=
NULL) {
185 if (VelRand !=
NULL) {
190 if (NameString !=
NULL) {
195 if (UserString !=
NULL) {
213 if (ptexture_filename && ptexture_filename[0]) {
325 if (FirstTime ==
false) {
346 if (PosRand) PosRand->Scale(
scale);
348 if (VelRand) VelRand->Scale(
scale);
352 Buffer->Scale(
scale);
359 WWPROFILE(
"ParticleEmitterClass::On_Frame_Update");
360 if (Active && !IsComplete) {
367 if ( BufferSceneNeeded ) {
371 BufferSceneNeeded =
false;
377 BufferSceneNeeded =
false;
409 ParticlesLeft = MaxParticles;
428 if (IsComplete ==
true) {
429 ParticlesLeft = MaxParticles;
436 Buffer->Set_Current_GroupID(GroupID);
448 return (Active ==
false);
470 VelRand->Scale(0.001f);
478 if (PosRand !=
NULL) {
479 randomizer = PosRand->
Clone ();
489 if (VelRand !=
NULL) {
490 randomizer = VelRand->
Clone ();
491 randomizer->
Scale (1000.0F);
498 BaseVel = base_vel * 0.001f;
504 OutwardVel = out_vel * 0.001f;
510 VelInheritFactor = inh_factor;
520 if (DebugDisable ==
true) {
525 if (Active && !IsComplete) {
533 Create_New_Particles(curr_quat, curr_orig);
536 PrevOrig = curr_orig;
548void ParticleEmitterClass::Update_Cached_Bounding_Volumes(
void)
const
564void ParticleEmitterClass::Create_New_Particles(
const Quaternion & curr_quat,
const Vector3 & curr_orig)
577 if (frametime > 100 * EmitRate) {
578 unsigned int buf_size = Buffer->Get_Buffer_Size();
580 unsigned int bursts = buf_size / gcd;
581 unsigned int cycle_time = EmitRate * bursts;
582 if (cycle_time > 1) {
583 frametime = frametime % cycle_time;
589 EmitRemain += frametime;
594 float fl_frametime = (float)frametime;
595 float alpha = 1 - ((float)EmitRemain / fl_frametime);
596 float d_alpha = (float)EmitRate / fl_frametime;
599 SlerpInfoStruct slerp_info;
606 if (VelInheritFactor) {
612 for (; EmitRemain > EmitRate;) {
615 EmitRemain -= EmitRate;
620 quat =
Cached_Slerp(PrevQ, curr_quat, alpha, &slerp_info);
627 unsigned int burst_size = BurstSize;
629 burst_size = OneTimeBurstSize;
630 OneTimeBurst =
false;
633 if ( ParticlesLeft > 0 ) {
634 if (burst_size > (
unsigned int)ParticlesLeft) {
635 burst_size = (
unsigned int)ParticlesLeft;
638 ParticlesLeft -= burst_size;
640 if ( ParticlesLeft <= 0 ) {
645 for (
unsigned int i = 0; i < burst_size; i++) {
646 Initialize_Particle(Buffer->Add_Uninitialized_New_Particle(), age, quat, orig);
649 if (IsComplete)
break;
666 PosRand->Get_Vector(rand_pos);
668 rand_pos.
Set(0.0, 0.0, 0.0);
678 VelRand->Get_Vector(rand_vel);
680 rand_vel.
Set(0.0, 0.0, 0.0);
687 float pos_l2 = rand_pos.
Length2();
691 outwards.
X = OutwardVel;
696 rand_vel += outwards;
716 if (pdefinition !=
NULL) {
720 if (ptexture !=
NULL) {
779 if (sizes.KeyTimes !=
NULL)
delete [] sizes.KeyTimes;
780 if (sizes.Values !=
NULL)
delete [] sizes.Values;
840 if (pdefinition !=
NULL) {
841 ret_val = pdefinition->
Save_W3D (chunk_save);
853 if (NameString !=
NULL) {
859 NameString = ::_strdup (pname);
890 if (texture !=
NULL) {
Color scale(const Color &a, const Color &b)
bool Add(T const &object)
WWINLINE Vector3 Get_Translation(void) const
virtual RenderObjClass * Clone(void) const
bool Is_Remove_On_Complete_Enabled(void)
virtual void Notify_Added(SceneClass *scene)
int Get_Render_Mode(void) const
void Set_Outwards_Velocity(float out_vel)
void Set_Base_Velocity(const Vector3 &base_vel)
float Get_Fade_Time(void) const
float Get_Future_Start_Time(void) const
ShaderClass Get_Shader(void) const
void Get_Rotation_Key_Frames(ParticlePropertyStruct< float > &rotations) const
int Get_Line_Texture_Mapping_Mode(void) const
virtual void Add_Dependencies_To_List(DynamicVectorClass< StringClass > &file_list, bool textures_only=false)
float Get_Texture_Tile_Factor(void) const
TextureClass * Get_Texture(void) const
Vector3 Get_Acceleration(void) const
virtual void Scale(float scale)
WW3DErrorType Save(ChunkSaveClass &chunk_save) const
float Get_Velocity_Inherit(void) const
float Get_Noise_Amplitude(void) const
int Is_Sorting_Disabled(void) const
virtual void Set_Name(const char *pname)
static ParticleEmitterClass * Create_From_Definition(const ParticleEmitterDefClass &definition)
int Are_End_Caps_Enabled(void) const
float Get_Emission_Rate(void) const
float Get_Lifetime(void) const
int Get_Max_Particles(void) const
void Get_Color_Key_Frames(ParticlePropertyStruct< Vector3 > &colors) const
int Get_Frame_Mode(void) const
void Get_Frame_Key_Frames(ParticlePropertyStruct< float > &frames) const
int Get_Burst_Size(void) const
int Is_Merge_Intersections(void) const
virtual void Update_On_Visibilty(void)
void Get_Blur_Time_Key_Frames(ParticlePropertyStruct< float > &blurtimes) const
float Get_Outwards_Vel(void) const
virtual bool Is_Complete(void)
void Get_Opacity_Key_Frames(ParticlePropertyStruct< float > &opacities) const
ParticleEmitterDefClass * Build_Definition(void) const
float Get_Merge_Abort_Factor(void) const
void Set_Velocity_Inheritance_Factor(float inh_factor)
Vector3Randomizer * Get_Velocity_Random(void) const
virtual const char * Get_Name(void) const
virtual RenderObjClass * Clone(void) const
void Set_Velocity_Randomizer(Vector3Randomizer *rand)
ParticleEmitterClass & operator=(const ParticleEmitterClass &)
void Set_Position_Randomizer(Vector3Randomizer *rand)
float Get_Initial_Orientation_Random(void) const
Vector3Randomizer * Get_Creation_Volume(void) const
void Get_Size_Key_Frames(ParticlePropertyStruct< float > &sizes) const
virtual void Notify_Removed(SceneClass *scene)
int Get_Subdivision_Level(void) const
Vector2 Get_UV_Offset_Rate(void) const
int Is_Freeze_Random(void) const
virtual ~ParticleEmitterClass(void)
Vector3 Get_Start_Velocity(void) const
virtual void On_Frame_Update(void)
ParticleEmitterClass(float emit_rate, unsigned int burst_size, Vector3Randomizer *pos_rnd, Vector3 base_vel, Vector3Randomizer *vel_rnd, float out_vel, float vel_inherit_factor, ParticlePropertyStruct< Vector3 > &color, ParticlePropertyStruct< float > &opacity, ParticlePropertyStruct< float > &size, ParticlePropertyStruct< float > &rotation, float orient_rnd, ParticlePropertyStruct< float > &frames, ParticlePropertyStruct< float > &blur_times, Vector3 accel, float max_age, float future_start, TextureClass *tex, ShaderClass shader=ShaderClass::_PresetAdditiveSpriteShader, int max_particles=0, int max_buffer_size=-1, bool pingpong=false, int render_mode=W3D_EMITTER_RENDER_MODE_TRI_PARTICLES, int frame_mode=W3D_EMITTER_FRAME_MODE_1x1, const W3dEmitterLinePropertiesStruct *line_props=NULL)
virtual void Restart(void)
virtual WW3DErrorType Save_W3D(ChunkSaveClass &chunk_save)
float Get_Future_Start_Time(void) const
virtual void Get_Size_Keyframes(ParticlePropertyStruct< float > &keyframes) const
float Get_Max_Emissions(void) const
int Get_Render_Mode(void) const
virtual void Set_Texture_Filename(const char *pname)
const char * Get_Name(void) const
virtual void Set_Velocity(const Vector3 &value)
virtual void Set_Frame_Keyframes(ParticlePropertyStruct< float > &keyframes)
virtual void Set_Size_Keyframes(ParticlePropertyStruct< float > &keyframes)
virtual void Set_Frame_Mode(int mode)
float Get_Vel_Inherit(void) const
virtual void Set_End_Caps(int onoff)
virtual void Get_Opacity_Keyframes(ParticlePropertyStruct< float > &keyframes) const
virtual void Set_Lifetime(float value)
virtual void Set_Name(const char *pname)
virtual void Get_Color_Keyframes(ParticlePropertyStruct< Vector3 > &keyframes) const
unsigned int Get_Burst_Size(void) const
virtual void Set_Velocity_Random(Vector3Randomizer *randomizer)
virtual void Set_Merge_Intersections(int onoff)
virtual void Set_Disable_Sorting(int onoff)
virtual void Set_Merge_Abort_Factor(float k)
virtual void Set_Max_Emissions(float value)
const char * Get_Texture_Filename(void) const
virtual void Set_Noise_Amplitude(float k)
Vector3Randomizer * Get_Creation_Volume(void) const
virtual float Get_Initial_Orientation_Random(void) const
virtual void Get_Rotation_Keyframes(ParticlePropertyStruct< float > &rotationframes) const
void Get_Shader(ShaderClass &shader) const
virtual void Set_Shader(const ShaderClass &shader)
virtual void Set_Line_Texture_Mapping_Mode(int mode)
virtual void Set_Color_Keyframes(ParticlePropertyStruct< Vector3 > &keyframes)
virtual void Set_UV_Offset_Rate(const Vector2 &rate)
virtual void Set_Acceleration(const Vector3 &value)
int Get_Frame_Mode(void) const
virtual void Set_Gravity(float value)
virtual void Set_Subdivision_Level(int lvl)
float Get_Outward_Vel(void) const
virtual void Set_Rotation_Keyframes(ParticlePropertyStruct< float > &keyframes, float orient_rnd)
virtual void Set_Render_Mode(int mode)
virtual void Set_Emission_Rate(float value)
Vector3 Get_Acceleration(void) const
Vector3Randomizer * Get_Velocity_Random(void) const
virtual void Set_Freeze_Random(int onoff)
virtual void Set_Outward_Vel(float value)
float Get_Emission_Rate(void) const
virtual void Set_Blur_Time_Keyframes(ParticlePropertyStruct< float > &keyframes)
virtual void Set_Opacity_Keyframes(ParticlePropertyStruct< float > &keyframes)
virtual void Set_Fade_Time(float value)
virtual void Set_Future_Start_Time(float value)
virtual void Get_Frame_Keyframes(ParticlePropertyStruct< float > &frameframes) const
virtual void Set_Creation_Volume(Vector3Randomizer *randomizer)
virtual void Get_Blur_Time_Keyframes(ParticlePropertyStruct< float > &blurtimeframes) const
virtual void Set_Elasticity(float value)
virtual void Set_Texture_Tile_Factor(float k)
const W3dEmitterLinePropertiesStruct * Get_Line_Properties(void) const
Vector3 Get_Velocity(void) const
float Get_Lifetime(void) const
virtual void Set_Vel_Inherit(float value)
virtual void Set_Burst_Size(unsigned int count)
WWINLINE Vector3 Rotate_Vector(const Vector3 &v) const
Vector3 Get_Position(void) const
void Validate_Cached_Bounding_Volumes(void) const
virtual int Is_Not_Hidden_At_All(void)
AABoxClass CachedBoundingBox
virtual void Notify_Added(SceneClass *scene)
RenderObjClass & operator=(const RenderObjClass &)
virtual bool Is_In_Scene(void)
virtual void Add_Dependencies_To_List(DynamicVectorClass< StringClass > &file_list, bool textures_only=false)
virtual void Notify_Removed(SceneClass *scene)
const Matrix3D & Get_Transform(void) const
SphereClass CachedBoundingSphere
virtual void Register(RenderObjClass *obj, RegType for_what)=0
virtual void Unregister(RenderObjClass *obj, RegType for_what)=0
void Enable_Fog(const char *source)
void Init(const Vector3 &pos, float radius)
const StringClass & Get_Texture_Name(void) const
const StringClass & Get_Full_Path(void) const
WWINLINE float Length2(void) const
WWINLINE void Set(float x, float y, float z)
static void Lerp(const Vector3 &a, const Vector3 &b, float alpha, Vector3 *set_result)
virtual void Scale(float scale)=0
virtual Vector3Randomizer * Clone(void) const =0
virtual TextureClass * Get_Texture(const char *filename, MipCountType mip_level_count=MIP_LEVELS_ALL, WW3DFormat texture_format=WW3D_FORMAT_UNKNOWN, bool allow_compression=true, TextureBaseClass::TexAssetType type=TextureBaseClass::TEX_REGULAR, bool allow_reduction=true)
static WW3DAssetManager * Get_Instance(void)
static unsigned int Get_Sync_Time(void)
static unsigned int Get_Frame_Time(void)
static float Inv_Sqrt(float a)
unsigned int Greatest_Common_Divisor(unsigned int a, unsigned int b)
Vector3 InheritedWorldSpaceEmitterVel
Quaternion Cached_Slerp(const Quaternion &p, const Quaternion &q, float alpha, SlerpInfoStruct *slerpinfo)
void Slerp_Setup(const Quaternion &p, const Quaternion &q, SlerpInfoStruct *slerpinfo)
Quaternion Build_Quaternion(const Matrix3D &mat)
#define REF_PTR_RELEASE(x)