Panda3D
|
00001 // Filename: discEmitter.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 "discEmitter.h" 00016 00017 //////////////////////////////////////////////////////////////////// 00018 // Function : DiscEmitter::DiscEmitter 00019 // Access : Public 00020 // Description : constructor 00021 //////////////////////////////////////////////////////////////////// 00022 DiscEmitter:: 00023 DiscEmitter() { 00024 _radius = 1.0f; 00025 _inner_aoe = _outer_aoe = 0.0f; 00026 _inner_magnitude = _outer_magnitude = 1.0f; 00027 _cubic_lerping = false; 00028 } 00029 00030 //////////////////////////////////////////////////////////////////// 00031 // Function : DiscEmitter::DiscEmitter 00032 // Access : Public 00033 // Description : copy constructor 00034 //////////////////////////////////////////////////////////////////// 00035 DiscEmitter:: 00036 DiscEmitter(const DiscEmitter ©) : 00037 BaseParticleEmitter(copy) { 00038 _radius = copy._radius; 00039 _inner_aoe = copy._inner_aoe; 00040 _outer_aoe = copy._outer_aoe; 00041 _inner_magnitude = copy._inner_magnitude; 00042 _outer_magnitude = copy._outer_magnitude; 00043 _cubic_lerping = copy._cubic_lerping; 00044 00045 _distance_from_center = copy._distance_from_center; 00046 _sinf_theta = copy._sinf_theta; 00047 _cosf_theta = copy._cosf_theta; 00048 } 00049 00050 //////////////////////////////////////////////////////////////////// 00051 // Function : DiscEmitter::~DiscEmitter 00052 // Access : Public 00053 // Description : destructor 00054 //////////////////////////////////////////////////////////////////// 00055 DiscEmitter:: 00056 ~DiscEmitter() { 00057 } 00058 00059 //////////////////////////////////////////////////////////////////// 00060 // Function : make_copy 00061 // Access : Public 00062 // Description : copier 00063 //////////////////////////////////////////////////////////////////// 00064 BaseParticleEmitter *DiscEmitter:: 00065 make_copy() { 00066 return new DiscEmitter(*this); 00067 } 00068 00069 //////////////////////////////////////////////////////////////////// 00070 // Function : DiscEmitter::assign_initial_position 00071 // Access : Public 00072 // Description : Generates a location for a new particle 00073 //////////////////////////////////////////////////////////////////// 00074 void DiscEmitter:: 00075 assign_initial_position(LPoint3& pos) { 00076 // position 00077 PN_stdfloat theta = NORMALIZED_RAND() * 2.0f * MathNumbers::pi_f; 00078 00079 _distance_from_center = NORMALIZED_RAND(); 00080 PN_stdfloat r_scalar = _distance_from_center * _radius; 00081 00082 _sinf_theta = sinf(theta); 00083 _cosf_theta = cosf(theta); 00084 00085 PN_stdfloat new_x = _cosf_theta * r_scalar; 00086 PN_stdfloat new_y = _sinf_theta * r_scalar; 00087 00088 pos.set(new_x, new_y, 0.0f); 00089 } 00090 00091 //////////////////////////////////////////////////////////////////// 00092 // Function : DiscEmitter::assign_initial_velocity 00093 // Access : Public 00094 // Description : Generates a velocity for a new particle 00095 //////////////////////////////////////////////////////////////////// 00096 void DiscEmitter:: 00097 assign_initial_velocity(LVector3& vel) { 00098 PN_stdfloat aoe, mag; 00099 00100 // lerp type 00101 if (_cubic_lerping == true) { 00102 aoe = CLERP(_distance_from_center, _inner_aoe, _outer_aoe); 00103 mag = CLERP(_distance_from_center, _inner_magnitude, _outer_magnitude); 00104 } 00105 else { 00106 aoe = LERP(_distance_from_center, _inner_aoe, _outer_aoe); 00107 mag = LERP(_distance_from_center, _inner_magnitude, _outer_magnitude); 00108 } 00109 00110 // velocity 00111 PN_stdfloat vel_z = mag * sinf(deg_2_rad(aoe)); 00112 PN_stdfloat abs_diff = fabs((mag * mag) - (vel_z * vel_z)); 00113 PN_stdfloat root_mag_minus_z_squared = sqrtf(abs_diff); 00114 PN_stdfloat vel_x = _cosf_theta * root_mag_minus_z_squared; 00115 PN_stdfloat vel_y = _sinf_theta * root_mag_minus_z_squared; 00116 00117 // quick and dirty 00118 if((aoe > 90.0f) && (aoe < 270.0f)) 00119 { 00120 vel_x = -vel_x; 00121 vel_y = -vel_y; 00122 } 00123 00124 vel.set(vel_x, vel_y, vel_z); 00125 } 00126 00127 //////////////////////////////////////////////////////////////////// 00128 // Function : output 00129 // Access : Public 00130 // Description : Write a string representation of this instance to 00131 // <out>. 00132 //////////////////////////////////////////////////////////////////// 00133 void DiscEmitter:: 00134 output(ostream &out) const { 00135 #ifndef NDEBUG //[ 00136 out<<"DiscEmitter"; 00137 #endif //] NDEBUG 00138 } 00139 00140 //////////////////////////////////////////////////////////////////// 00141 // Function : write 00142 // Access : Public 00143 // Description : Write a string representation of this instance to 00144 // <out>. 00145 //////////////////////////////////////////////////////////////////// 00146 void DiscEmitter:: 00147 write(ostream &out, int indent) const { 00148 #ifndef NDEBUG //[ 00149 out.width(indent); out<<""; out<<"DiscEmitter:\n"; 00150 out.width(indent+2); out<<""; out<<"_radius "<<_radius<<"\n"; 00151 out.width(indent+2); out<<""; out<<"_outer_aoe "<<_outer_aoe<<"\n"; 00152 out.width(indent+2); out<<""; out<<"_inner_aoe "<<_inner_aoe<<"\n"; 00153 out.width(indent+2); out<<""; out<<"_outer_magnitude "<<_outer_magnitude<<"\n"; 00154 out.width(indent+2); out<<""; out<<"_inner_magnitude "<<_inner_magnitude<<"\n"; 00155 out.width(indent+2); out<<""; out<<"_cubic_lerping "<<_cubic_lerping<<"\n"; 00156 out.width(indent+2); out<<""; out<<"_distance_from_center "<<_distance_from_center<<"\n"; 00157 out.width(indent+2); out<<""; out<<"_sinf_theta "<<_sinf_theta<<"\n"; 00158 out.width(indent+2); out<<""; out<<"_cosf_theta "<<_cosf_theta<<"\n"; 00159 BaseParticleEmitter::write(out, indent+2); 00160 #endif //] NDEBUG 00161 }