Panda3D
|
00001 // Filename: ringEmitter.cxx 00002 // Created by: charles (22Jun00) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 #include "ringEmitter.h" 00016 00017 //////////////////////////////////////////////////////////////////// 00018 // Function : RingEmitter 00019 // Access : Public 00020 // Description : constructor 00021 //////////////////////////////////////////////////////////////////// 00022 RingEmitter:: 00023 RingEmitter() : 00024 _radius(1.0f), _radius_spread(0.0f), _aoe(0.0f), _uniform_emission(0), _theta(0.0f) 00025 { 00026 } 00027 00028 //////////////////////////////////////////////////////////////////// 00029 // Function : RingEmitter 00030 // Access : Public 00031 // Description : copy constructor 00032 //////////////////////////////////////////////////////////////////// 00033 RingEmitter:: 00034 RingEmitter(const RingEmitter ©) : 00035 BaseParticleEmitter(copy) { 00036 _radius = copy._radius; 00037 _aoe = copy._aoe; 00038 _radius_spread = copy._radius_spread; 00039 _uniform_emission = copy._uniform_emission; 00040 00041 _theta = copy._theta; 00042 _sin_theta = copy._sin_theta; 00043 _cos_theta = copy._cos_theta; 00044 } 00045 00046 //////////////////////////////////////////////////////////////////// 00047 // Function : ~RingEmitter 00048 // Access : Public 00049 // Description : destructor 00050 //////////////////////////////////////////////////////////////////// 00051 RingEmitter:: 00052 ~RingEmitter() { 00053 } 00054 00055 //////////////////////////////////////////////////////////////////// 00056 // Function : make_copy 00057 // Access : Public 00058 // Description : copier 00059 //////////////////////////////////////////////////////////////////// 00060 BaseParticleEmitter *RingEmitter:: 00061 make_copy() { 00062 return new RingEmitter(*this); 00063 } 00064 00065 //////////////////////////////////////////////////////////////////// 00066 // Function : RingEmitter::assign_initial_position 00067 // Access : Public 00068 // Description : Generates a location for a new particle 00069 //////////////////////////////////////////////////////////////////// 00070 void RingEmitter:: 00071 assign_initial_position(LPoint3& pos) { 00072 if (_uniform_emission > 0) 00073 { 00074 _theta = _theta + 1.0/_uniform_emission; 00075 if (_theta > 1.0) 00076 _theta = _theta - 1.0; 00077 } 00078 else 00079 { 00080 _theta = NORMALIZED_RAND(); 00081 } 00082 00083 _cos_theta = cosf(_theta * 2.0f * MathNumbers::pi_f); 00084 _sin_theta = sinf(_theta * 2.0f * MathNumbers::pi_f); 00085 00086 PN_stdfloat new_radius_spread = SPREAD(_radius_spread); 00087 PN_stdfloat new_x = _cos_theta * (_radius + new_radius_spread); 00088 PN_stdfloat new_y = _sin_theta * (_radius + new_radius_spread); 00089 00090 pos.set(new_x, new_y, 0.0f); 00091 } 00092 00093 //////////////////////////////////////////////////////////////////// 00094 // Function : RingEmitter::assign_initial_velocity 00095 // Access : Public 00096 // Description : Generates a velocity for a new particle 00097 //////////////////////////////////////////////////////////////////// 00098 void RingEmitter:: 00099 assign_initial_velocity(LVector3& vel) { 00100 PN_stdfloat vel_z = sinf(deg_2_rad(_aoe)); 00101 PN_stdfloat abs_diff = fabs(1.0f - (vel_z * vel_z)); 00102 PN_stdfloat root_mag_minus_z_squared = sqrtf(abs_diff); 00103 00104 PN_stdfloat vel_x = _cos_theta * root_mag_minus_z_squared; 00105 PN_stdfloat vel_y = _sin_theta * root_mag_minus_z_squared; 00106 00107 // quick and dirty 00108 if((_aoe > 90.0f) && (_aoe < 270.0f)) 00109 { 00110 vel_x = -vel_x; 00111 vel_y = -vel_y; 00112 } 00113 00114 vel.set(vel_x, vel_y, vel_z); 00115 } 00116 00117 //////////////////////////////////////////////////////////////////// 00118 // Function : output 00119 // Access : Public 00120 // Description : Write a string representation of this instance to 00121 // <out>. 00122 //////////////////////////////////////////////////////////////////// 00123 void RingEmitter:: 00124 output(ostream &out) const { 00125 #ifndef NDEBUG //[ 00126 out<<"RingEmitter"; 00127 #endif //] NDEBUG 00128 } 00129 00130 //////////////////////////////////////////////////////////////////// 00131 // Function : write 00132 // Access : Public 00133 // Description : Write a string representation of this instance to 00134 // <out>. 00135 //////////////////////////////////////////////////////////////////// 00136 void RingEmitter:: 00137 write(ostream &out, int indent) const { 00138 #ifndef NDEBUG //[ 00139 out.width(indent); out<<""; out<<"RingEmitter:\n"; 00140 out.width(indent+2); out<<""; out<<"_radius "<<_radius<<"\n"; 00141 out.width(indent+2); out<<""; out<<"_radius_spread "<<_radius_spread<<"\n"; 00142 out.width(indent+2); out<<""; out<<"_aoe "<<_aoe<<"\n"; 00143 out.width(indent+2); out<<""; out<<"_sin_theta "<<_sin_theta<<"\n"; 00144 out.width(indent+2); out<<""; out<<"_cos_theta "<<_cos_theta<<"\n"; 00145 BaseParticleEmitter::write(out, indent+2); 00146 #endif //] NDEBUG 00147 }