open_toontown_panda3d/panda/src/particlesystem/ringEmitter.cxx

148 lines
4.6 KiB
C++

// Filename: ringEmitter.cxx
// Created by: charles (22Jun00)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) Carnegie Mellon University. All rights reserved.
//
// All use of this software is subject to the terms of the revised BSD
// license. You should have received a copy of this license along
// with this source code in a file named "LICENSE."
//
////////////////////////////////////////////////////////////////////
#include "ringEmitter.h"
////////////////////////////////////////////////////////////////////
// Function : RingEmitter
// Access : Public
// Description : constructor
////////////////////////////////////////////////////////////////////
RingEmitter::
RingEmitter() :
_radius(1.0f), _radius_spread(0.0f), _aoe(0.0f), _uniform_emission(0), _theta(0.0f)
{
}
////////////////////////////////////////////////////////////////////
// Function : RingEmitter
// Access : Public
// Description : copy constructor
////////////////////////////////////////////////////////////////////
RingEmitter::
RingEmitter(const RingEmitter &copy) :
BaseParticleEmitter(copy) {
_radius = copy._radius;
_aoe = copy._aoe;
_radius_spread = copy._radius_spread;
_uniform_emission = copy._uniform_emission;
_theta = copy._theta;
_sin_theta = copy._sin_theta;
_cos_theta = copy._cos_theta;
}
////////////////////////////////////////////////////////////////////
// Function : ~RingEmitter
// Access : Public
// Description : destructor
////////////////////////////////////////////////////////////////////
RingEmitter::
~RingEmitter() {
}
////////////////////////////////////////////////////////////////////
// Function : make_copy
// Access : Public
// Description : copier
////////////////////////////////////////////////////////////////////
BaseParticleEmitter *RingEmitter::
make_copy() {
return new RingEmitter(*this);
}
////////////////////////////////////////////////////////////////////
// Function : RingEmitter::assign_initial_position
// Access : Public
// Description : Generates a location for a new particle
////////////////////////////////////////////////////////////////////
void RingEmitter::
assign_initial_position(LPoint3f& pos) {
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_x = _cos_theta * (_radius + new_radius_spread);
float new_y = _sin_theta * (_radius + new_radius_spread);
pos.set(new_x, new_y, 0.0f);
}
////////////////////////////////////////////////////////////////////
// Function : RingEmitter::assign_initial_velocity
// Access : Public
// Description : Generates a velocity for a new particle
////////////////////////////////////////////////////////////////////
void RingEmitter::
assign_initial_velocity(LVector3f& vel) {
float vel_z = sinf(deg_2_rad(_aoe));
float abs_diff = fabs(1.0f - (vel_z * vel_z));
float root_mag_minus_z_squared = sqrtf(abs_diff);
float vel_x = _cos_theta * root_mag_minus_z_squared;
float vel_y = _sin_theta * root_mag_minus_z_squared;
// quick and dirty
if((_aoe > 90.0f) && (_aoe < 270.0f))
{
vel_x = -vel_x;
vel_y = -vel_y;
}
vel.set(vel_x, vel_y, vel_z);
}
////////////////////////////////////////////////////////////////////
// Function : output
// Access : Public
// Description : Write a string representation of this instance to
// <out>.
////////////////////////////////////////////////////////////////////
void RingEmitter::
output(ostream &out) const {
#ifndef NDEBUG //[
out<<"RingEmitter";
#endif //] NDEBUG
}
////////////////////////////////////////////////////////////////////
// Function : write
// Access : Public
// Description : Write a string representation of this instance to
// <out>.
////////////////////////////////////////////////////////////////////
void RingEmitter::
write(ostream &out, int indent) const {
#ifndef NDEBUG //[
out.width(indent); out<<""; out<<"RingEmitter:\n";
out.width(indent+2); out<<""; out<<"_radius "<<_radius<<"\n";
out.width(indent+2); out<<""; out<<"_radius_spread "<<_radius_spread<<"\n";
out.width(indent+2); out<<""; out<<"_aoe "<<_aoe<<"\n";
out.width(indent+2); out<<""; out<<"_sin_theta "<<_sin_theta<<"\n";
out.width(indent+2); out<<""; out<<"_cos_theta "<<_cos_theta<<"\n";
BaseParticleEmitter::write(out, indent+2);
#endif //] NDEBUG
}