Browse Source

adding setUniformEmission function to ringEmitter

Przemyslaw Iwanowski 17 years ago
parent
commit
86ee18fd71

+ 24 - 0
panda/src/particlesystem/ringEmitter.I

@@ -45,6 +45,17 @@ set_radius_spread(float spread) {
   _radius_spread = 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
 //    Function : get_radius
 //      Access : public
 //      Access : public
@@ -78,3 +89,16 @@ get_radius_spread() const {
   return _radius_spread;
   return _radius_spread;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//    Function : get_uniform_emission
+//      Access : public
+// Description : uniform_emission get               
+////////////////////////////////////////////////////////////////////
+
+INLINE int RingEmitter::
+get_uniform_emission() const {
+  return _uniform_emission;
+}
+
+
+

+ 16 - 4
panda/src/particlesystem/ringEmitter.cxx

@@ -21,7 +21,7 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 RingEmitter::
 RingEmitter::
 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 &copy) :
   _radius = copy._radius;
   _radius = copy._radius;
   _aoe = copy._aoe;
   _aoe = copy._aoe;
   _radius_spread = copy._radius_spread;
   _radius_spread = copy._radius_spread;
+  _uniform_emission = copy._uniform_emission;
 
 
+  _theta = copy._theta;
   _sin_theta = copy._sin_theta;
   _sin_theta = copy._sin_theta;
   _cos_theta = copy._cos_theta;
   _cos_theta = copy._cos_theta;
 }
 }
@@ -67,9 +69,19 @@ make_copy() {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void RingEmitter::
 void RingEmitter::
 assign_initial_position(LPoint3f& pos) {
 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_radius_spread = SPREAD(_radius_spread);
   float new_x = _cos_theta * (_radius + new_radius_spread);
   float new_x = _cos_theta * (_radius + new_radius_spread);

+ 6 - 0
panda/src/particlesystem/ringEmitter.h

@@ -33,10 +33,12 @@ PUBLISHED:
   INLINE void set_radius(float r);
   INLINE void set_radius(float r);
   INLINE void set_angle(float angle);
   INLINE void set_angle(float angle);
   INLINE void set_radius_spread(float spread);
   INLINE void set_radius_spread(float spread);
+  INLINE void set_uniform_emission(int uniform_emission);
 
 
   INLINE float get_radius() const;
   INLINE float get_radius() const;
   INLINE float get_angle() const;
   INLINE float get_angle() const;
   INLINE float get_radius_spread() const;
   INLINE float get_radius_spread() const;
+  INLINE int get_uniform_emission() const;
 
 
   virtual void output(ostream &out) const;
   virtual void output(ostream &out) const;
   virtual void write(ostream &out, int indent=0) const;
   virtual void write(ostream &out, int indent=0) const;
@@ -48,6 +50,10 @@ protected:
   // CUSTOM EMISSION PARAMETERS
   // CUSTOM EMISSION PARAMETERS
   float _aoe;  // angle of elevation
   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
   // scratch variables that carry over from position calc to velocity calc
   float _sin_theta;
   float _sin_theta;