diff --git a/panda/src/particlesystem/ringEmitter.I b/panda/src/particlesystem/ringEmitter.I index 3b9151050d..4949abc125 100644 --- a/panda/src/particlesystem/ringEmitter.I +++ b/panda/src/particlesystem/ringEmitter.I @@ -45,6 +45,17 @@ set_radius_spread(float spread) { _radius_spread = spread; } +//////////////////////////////////////////////////////////////////// +// Function : set_uniform_emission +// Access : public +// Description : uniform_emission set +//////////////////////////////////////////////////////////////////// + +INLINE void RingEmitter:: +set_uniform_emission(int uniform_emission) { + _uniform_emission = uniform_emission; +} + //////////////////////////////////////////////////////////////////// // Function : get_radius // Access : public @@ -78,3 +89,16 @@ get_radius_spread() const { return _radius_spread; } +//////////////////////////////////////////////////////////////////// +// Function : get_uniform_emission +// Access : public +// Description : uniform_emission get +//////////////////////////////////////////////////////////////////// + +INLINE int RingEmitter:: +get_uniform_emission() const { + return _uniform_emission; +} + + + diff --git a/panda/src/particlesystem/ringEmitter.cxx b/panda/src/particlesystem/ringEmitter.cxx index 55bdee2ff0..9074ba69af 100644 --- a/panda/src/particlesystem/ringEmitter.cxx +++ b/panda/src/particlesystem/ringEmitter.cxx @@ -21,7 +21,7 @@ //////////////////////////////////////////////////////////////////// RingEmitter:: RingEmitter() : - _radius(1.0f), _radius_spread(0.0f), _aoe(0.0f) + _radius(1.0f), _radius_spread(0.0f), _aoe(0.0f), _uniform_emission(0), _theta(0.0f) { } @@ -36,7 +36,9 @@ RingEmitter(const RingEmitter ©) : _radius = copy._radius; _aoe = copy._aoe; _radius_spread = copy._radius_spread; + _uniform_emission = copy._uniform_emission; + _theta = copy._theta; _sin_theta = copy._sin_theta; _cos_theta = copy._cos_theta; } @@ -67,9 +69,19 @@ make_copy() { //////////////////////////////////////////////////////////////////// void RingEmitter:: assign_initial_position(LPoint3f& pos) { - float theta = NORMALIZED_RAND() * 2.0f * MathNumbers::pi_f; - _cos_theta = cosf(theta); - _sin_theta = sinf(theta); + if (_uniform_emission > 0) + { + _theta = _theta + 1.0/_uniform_emission; + if (_theta > 1.0) + _theta = _theta - 1.0; + } + else + { + _theta = NORMALIZED_RAND(); + } + + _cos_theta = cosf(_theta * 2.0f * MathNumbers::pi_f); + _sin_theta = sinf(_theta * 2.0f * MathNumbers::pi_f); float new_radius_spread = SPREAD(_radius_spread); float new_x = _cos_theta * (_radius + new_radius_spread); diff --git a/panda/src/particlesystem/ringEmitter.h b/panda/src/particlesystem/ringEmitter.h index 200cb9b33c..feab3a1b60 100644 --- a/panda/src/particlesystem/ringEmitter.h +++ b/panda/src/particlesystem/ringEmitter.h @@ -33,10 +33,12 @@ PUBLISHED: INLINE void set_radius(float r); INLINE void set_angle(float angle); INLINE void set_radius_spread(float spread); + INLINE void set_uniform_emission(int uniform_emission); INLINE float get_radius() const; INLINE float get_angle() const; INLINE float get_radius_spread() const; + INLINE int get_uniform_emission() const; virtual void output(ostream &out) const; virtual void write(ostream &out, int indent=0) const; @@ -48,6 +50,10 @@ protected: // CUSTOM EMISSION PARAMETERS float _aoe; // angle of elevation + // viariables used for uniform particle emission + int _uniform_emission; + float _theta; + /////////////////////////////// // scratch variables that carry over from position calc to velocity calc float _sin_theta;