mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 18:31:55 -04:00
Added spread value for ring and alpha in out mode for particles
This commit is contained in:
parent
43fa6e3a0c
commit
acf25fe6ad
@ -79,6 +79,10 @@ get_cur_alpha(BaseParticle* bp) {
|
|||||||
case PR_ALPHA_IN:
|
case PR_ALPHA_IN:
|
||||||
return bp->get_parameterized_age();
|
return bp->get_parameterized_age();
|
||||||
|
|
||||||
|
case PR_ALPHA_IN_OUT:
|
||||||
|
return 2.0 * min(bp->get_parameterized_age(),
|
||||||
|
1.0f - bp->get_parameterized_age());
|
||||||
|
|
||||||
case PR_ALPHA_USER:
|
case PR_ALPHA_USER:
|
||||||
return _user_alpha;
|
return _user_alpha;
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@ PUBLISHED:
|
|||||||
PR_ALPHA_NONE,
|
PR_ALPHA_NONE,
|
||||||
PR_ALPHA_OUT,
|
PR_ALPHA_OUT,
|
||||||
PR_ALPHA_IN,
|
PR_ALPHA_IN,
|
||||||
|
PR_ALPHA_IN_OUT,
|
||||||
PR_ALPHA_USER,
|
PR_ALPHA_USER,
|
||||||
PR_NOT_INITIALIZED_YET
|
PR_NOT_INITIALIZED_YET
|
||||||
};
|
};
|
||||||
|
@ -191,6 +191,8 @@ render(pvector< PT(PhysicsObject) >& po_vector, int ttl_particles) {
|
|||||||
alpha_scalar = cur_particle->get_parameterized_age();
|
alpha_scalar = cur_particle->get_parameterized_age();
|
||||||
if (_alpha_mode == PR_ALPHA_OUT)
|
if (_alpha_mode == PR_ALPHA_OUT)
|
||||||
alpha_scalar = 1.0f - alpha_scalar;
|
alpha_scalar = 1.0f - alpha_scalar;
|
||||||
|
else if (_alpha_mode == PR_ALPHA_IN_OUT)
|
||||||
|
alpha_scalar = 2.0f * min(alpha_scalar, 1.0f - alpha_scalar);
|
||||||
alpha_scalar *= get_user_alpha();
|
alpha_scalar *= get_user_alpha();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,6 +212,8 @@ render(pvector< PT(PhysicsObject) >& po_vector, int ttl_particles) {
|
|||||||
alpha = cur_particle->get_parameterized_age();
|
alpha = cur_particle->get_parameterized_age();
|
||||||
if (_alpha_mode == PR_ALPHA_OUT)
|
if (_alpha_mode == PR_ALPHA_OUT)
|
||||||
alpha = 1.0f - alpha;
|
alpha = 1.0f - alpha;
|
||||||
|
else if (_alpha_mode == PR_ALPHA_IN_OUT)
|
||||||
|
alpha = 2.0f * min(alpha, 1.0f - alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
head_color[3] = alpha;
|
head_color[3] = alpha;
|
||||||
|
@ -201,6 +201,9 @@ create_color(const BaseParticle *p) {
|
|||||||
|
|
||||||
if(_alpha_mode==PR_ALPHA_OUT) {
|
if(_alpha_mode==PR_ALPHA_OUT) {
|
||||||
parameterized_age = 1.0f - parameterized_age;
|
parameterized_age = 1.0f - parameterized_age;
|
||||||
|
} else if(_alpha_mode==PR_ALPHA_IN_OUT) {
|
||||||
|
parameterized_age = 2.0f * min(parameterized_age,
|
||||||
|
1.0f - parameterized_age);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
color[3] = parameterized_age * get_user_alpha();
|
color[3] = parameterized_age * get_user_alpha();
|
||||||
|
@ -38,6 +38,17 @@ set_angle(float angle) {
|
|||||||
_aoe = angle;
|
_aoe = angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function : set_radius_spread
|
||||||
|
// Access : public
|
||||||
|
// Description : radius_spread set
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
INLINE void RingEmitter::
|
||||||
|
set_radius_spread(float spread) {
|
||||||
|
_radius_spread = spread;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function : get_radius
|
// Function : get_radius
|
||||||
// Access : public
|
// Access : public
|
||||||
@ -59,3 +70,15 @@ INLINE float RingEmitter::
|
|||||||
get_angle() const {
|
get_angle() const {
|
||||||
return _aoe;
|
return _aoe;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function : get_radius_spread
|
||||||
|
// Access : public
|
||||||
|
// Description : radius_spread get
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
INLINE float RingEmitter::
|
||||||
|
get_radius_spread() const {
|
||||||
|
return _radius_spread;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
RingEmitter::
|
RingEmitter::
|
||||||
RingEmitter() :
|
RingEmitter() :
|
||||||
_radius(1.0f), _aoe(0.0f) {
|
_radius(1.0f), _aoe(0.0f), _radius_spread(0.0f) {
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -38,6 +38,7 @@ RingEmitter(const RingEmitter ©) :
|
|||||||
BaseParticleEmitter(copy) {
|
BaseParticleEmitter(copy) {
|
||||||
_radius = copy._radius;
|
_radius = copy._radius;
|
||||||
_aoe = copy._aoe;
|
_aoe = copy._aoe;
|
||||||
|
_radius_spread = copy._radius_spread;
|
||||||
|
|
||||||
_sin_theta = copy._sin_theta;
|
_sin_theta = copy._sin_theta;
|
||||||
_cos_theta = copy._cos_theta;
|
_cos_theta = copy._cos_theta;
|
||||||
@ -73,8 +74,9 @@ assign_initial_position(LPoint3f& pos) {
|
|||||||
_cos_theta = cosf(theta);
|
_cos_theta = cosf(theta);
|
||||||
_sin_theta = sinf(theta);
|
_sin_theta = sinf(theta);
|
||||||
|
|
||||||
float new_x = _cos_theta * _radius;
|
float new_radius_spread = SPREAD(_radius_spread);
|
||||||
float new_y = _sin_theta * _radius;
|
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);
|
pos.set(new_x, new_y, 0.0f);
|
||||||
}
|
}
|
||||||
@ -127,6 +129,7 @@ write(ostream &out, int indent) const {
|
|||||||
#ifndef NDEBUG //[
|
#ifndef NDEBUG //[
|
||||||
out.width(indent); out<<""; out<<"RingEmitter:\n";
|
out.width(indent); out<<""; out<<"RingEmitter:\n";
|
||||||
out.width(indent+2); out<<""; out<<"_radius "<<_radius<<"\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<<"_aoe "<<_aoe<<"\n";
|
||||||
out.width(indent+2); out<<""; out<<"_sin_theta "<<_sin_theta<<"\n";
|
out.width(indent+2); out<<""; out<<"_sin_theta "<<_sin_theta<<"\n";
|
||||||
out.width(indent+2); out<<""; out<<"_cos_theta "<<_cos_theta<<"\n";
|
out.width(indent+2); out<<""; out<<"_cos_theta "<<_cos_theta<<"\n";
|
||||||
|
@ -36,15 +36,18 @@ PUBLISHED:
|
|||||||
|
|
||||||
INLINE void set_radius(float r);
|
INLINE void set_radius(float r);
|
||||||
INLINE void set_angle(float angle);
|
INLINE void set_angle(float angle);
|
||||||
|
INLINE void set_radius_spread(float spread);
|
||||||
|
|
||||||
INLINE float get_radius() const;
|
INLINE float get_radius() const;
|
||||||
INLINE float get_angle() const;
|
INLINE float get_angle() const;
|
||||||
|
INLINE float get_radius_spread() const;
|
||||||
|
|
||||||
virtual void output(ostream &out) const;
|
virtual void output(ostream &out) const;
|
||||||
virtual void write(ostream &out, int indent=0) const;
|
virtual void write(ostream &out, int indent=0) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float _radius;
|
float _radius;
|
||||||
|
float _radius_spread;
|
||||||
|
|
||||||
// CUSTOM EMISSION PARAMETERS
|
// CUSTOM EMISSION PARAMETERS
|
||||||
float _aoe; // angle of elevation
|
float _aoe; // angle of elevation
|
||||||
|
@ -211,6 +211,8 @@ render(pvector< PT(PhysicsObject) >& po_vector, int ttl_particles) {
|
|||||||
alpha = cur_particle->get_parameterized_age();
|
alpha = cur_particle->get_parameterized_age();
|
||||||
if (_alpha_mode == PR_ALPHA_OUT)
|
if (_alpha_mode == PR_ALPHA_OUT)
|
||||||
alpha = 1.0f - alpha;
|
alpha = 1.0f - alpha;
|
||||||
|
else if (_alpha_mode == PR_ALPHA_IN_OUT)
|
||||||
|
alpha = 2.0f * min(alpha, 1.0f - alpha);
|
||||||
|
|
||||||
alpha *= get_user_alpha();
|
alpha *= get_user_alpha();
|
||||||
}
|
}
|
||||||
|
@ -330,6 +330,9 @@ render(pvector< PT(PhysicsObject) >& po_vector, int ttl_particles) {
|
|||||||
c[3] = (1.0f - t) * get_user_alpha();
|
c[3] = (1.0f - t) * get_user_alpha();
|
||||||
else if (alphamode == PR_ALPHA_IN)
|
else if (alphamode == PR_ALPHA_IN)
|
||||||
c[3] = t * get_user_alpha();
|
c[3] = t * get_user_alpha();
|
||||||
|
else if (alphamode == PR_ALPHA_IN_OUT) {
|
||||||
|
c[3] = 2.0f * min(t, 1.0f - t) * get_user_alpha();
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
assert(alphamode == PR_ALPHA_USER);
|
assert(alphamode == PR_ALPHA_USER);
|
||||||
c[3] = get_user_alpha();
|
c[3] = get_user_alpha();
|
||||||
|
@ -25,6 +25,15 @@ set_radius(float r) {
|
|||||||
_radius = r;
|
_radius = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function : set_radius_spread
|
||||||
|
// Access : public
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void TangentRingEmitter::
|
||||||
|
set_radius_spread(float spread) {
|
||||||
|
_radius_spread = spread;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function : get_radius
|
// Function : get_radius
|
||||||
// Access : public
|
// Access : public
|
||||||
@ -33,3 +42,12 @@ INLINE float TangentRingEmitter::
|
|||||||
get_radius(void) const {
|
get_radius(void) const {
|
||||||
return _radius;
|
return _radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function : get_radius_spread
|
||||||
|
// Access : public
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float TangentRingEmitter::
|
||||||
|
get_radius_spread(void) const {
|
||||||
|
return _radius_spread;
|
||||||
|
}
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
TangentRingEmitter::
|
TangentRingEmitter::
|
||||||
TangentRingEmitter() {
|
TangentRingEmitter() {
|
||||||
_radius = 1.0f;
|
_radius = 1.0f;
|
||||||
|
_radius_spread = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -37,6 +38,7 @@ TangentRingEmitter::
|
|||||||
TangentRingEmitter(const TangentRingEmitter ©) :
|
TangentRingEmitter(const TangentRingEmitter ©) :
|
||||||
BaseParticleEmitter(copy) {
|
BaseParticleEmitter(copy) {
|
||||||
_radius = copy._radius;
|
_radius = copy._radius;
|
||||||
|
_radius_spread = copy._radius_spread;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -70,7 +72,8 @@ assign_initial_position(LPoint3f& pos) {
|
|||||||
_x = cosf(theta);
|
_x = cosf(theta);
|
||||||
_y = sinf(theta);
|
_y = sinf(theta);
|
||||||
|
|
||||||
pos.set(_radius * _x, _radius * _y, 0.0f);
|
float new_radius = _radius + SPREAD(_radius_spread);
|
||||||
|
pos.set(new_radius * _x, new_radius * _y, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -107,6 +110,7 @@ write(ostream &out, int indent) const {
|
|||||||
#ifndef NDEBUG //[
|
#ifndef NDEBUG //[
|
||||||
out.width(indent); out<<""; out<<"TangentRingEmitter:\n";
|
out.width(indent); out<<""; out<<"TangentRingEmitter:\n";
|
||||||
out.width(indent+2); out<<""; out<<"_radius "<<_radius<<"\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<<"_x "<<_x<<"\n";
|
out.width(indent+2); out<<""; out<<"_x "<<_x<<"\n";
|
||||||
out.width(indent+2); out<<""; out<<"_y "<<_y<<"\n";
|
out.width(indent+2); out<<""; out<<"_y "<<_y<<"\n";
|
||||||
BaseParticleEmitter::write(out, indent+2);
|
BaseParticleEmitter::write(out, indent+2);
|
||||||
|
@ -36,13 +36,17 @@ PUBLISHED:
|
|||||||
virtual BaseParticleEmitter *make_copy();
|
virtual BaseParticleEmitter *make_copy();
|
||||||
|
|
||||||
INLINE void set_radius(float r);
|
INLINE void set_radius(float r);
|
||||||
|
INLINE void set_radius_spread(float spread);
|
||||||
|
|
||||||
INLINE float get_radius() const;
|
INLINE float get_radius() const;
|
||||||
|
INLINE float get_radius_spread() const;
|
||||||
|
|
||||||
virtual void output(ostream &out) const;
|
virtual void output(ostream &out) const;
|
||||||
virtual void write(ostream &out, int indent=0) const;
|
virtual void write(ostream &out, int indent=0) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float _radius;
|
float _radius;
|
||||||
|
float _radius_spread;
|
||||||
|
|
||||||
// CUSTOM EMISSION PARAMETERS
|
// CUSTOM EMISSION PARAMETERS
|
||||||
// none
|
// none
|
||||||
|
Loading…
x
Reference in New Issue
Block a user