00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "discEmitter.h"
00016
00017
00018
00019
00020
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
00032
00033
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
00052
00053
00054
00055 DiscEmitter::
00056 ~DiscEmitter() {
00057 }
00058
00059
00060
00061
00062
00063
00064 BaseParticleEmitter *DiscEmitter::
00065 make_copy() {
00066 return new DiscEmitter(*this);
00067 }
00068
00069
00070
00071
00072
00073
00074 void DiscEmitter::
00075 assign_initial_position(LPoint3& pos) {
00076
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
00093
00094
00095
00096 void DiscEmitter::
00097 assign_initial_velocity(LVector3& vel) {
00098 PN_stdfloat aoe, mag;
00099
00100
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
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
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
00129
00130
00131
00132
00133 void DiscEmitter::
00134 output(ostream &out) const {
00135 #ifndef NDEBUG //[
00136 out<<"DiscEmitter";
00137 #endif //] NDEBUG
00138 }
00139
00140
00141
00142
00143
00144
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 }