Panda3D
 All Classes Functions Variables Enumerations
discEmitter.cxx
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 &copy) :
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 }
 All Classes Functions Variables Enumerations