From eea0bf839e9582c911a0a9aeef2321ad4cebe5ce Mon Sep 17 00:00:00 2001 From: Josh Wilson Date: Sun, 23 Apr 2006 23:52:00 +0000 Subject: [PATCH] added choice of additive or modulated mode --- .../colorInterpolationManager.I | 24 +++++++++++++++++ .../colorInterpolationManager.cxx | 26 ++++++++++++++----- .../colorInterpolationManager.h | 3 +++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/panda/src/particlesystem/colorInterpolationManager.I b/panda/src/particlesystem/colorInterpolationManager.I index 08af20318b..6c0196dfdd 100755 --- a/panda/src/particlesystem/colorInterpolationManager.I +++ b/panda/src/particlesystem/colorInterpolationManager.I @@ -169,6 +169,17 @@ get_time_end() const { return _t_end; } +//////////////////////////////////////////////////////////////////// +// Function : ColorInterpolationSegment::is_modulated +// Access : public +// Description : Returns whether the function is additive or modulated. +//////////////////////////////////////////////////////////////////// + +INLINE bool ColorInterpolationSegment:: +is_modulated() const { + return _is_modulated; +} + //////////////////////////////////////////////////////////////////// // Function : ColorInterpolationSegment::is_enabled() // Access : public @@ -232,6 +243,19 @@ set_time_end(const float time) { _t_total = _t_end-_t_begin; } +//////////////////////////////////////////////////////////////////// +// Function : ColorInterpolationSegment::set_is_modulated +// Access : public +// Description : Sets how the function is applied to the final color. +// If true, the value is multiplied. If false, the value +// is simply added. Default is true. +//////////////////////////////////////////////////////////////////// + +INLINE void ColorInterpolationSegment:: +set_is_modulated(const bool flag) { + _is_modulated = flag; +} + //////////////////////////////////////////////////////////////////// // Function : ColorInterpolationSegment::set_enabled() // Access : public diff --git a/panda/src/particlesystem/colorInterpolationManager.cxx b/panda/src/particlesystem/colorInterpolationManager.cxx index 42d0bac26d..14d39b6721 100755 --- a/panda/src/particlesystem/colorInterpolationManager.cxx +++ b/panda/src/particlesystem/colorInterpolationManager.cxx @@ -208,6 +208,7 @@ ColorInterpolationSegment(ColorInterpolationFunction* function, _t_begin(time_begin), _t_end(time_end), _t_total(time_end-time_begin), + _is_modulated(true), _enabled(true), _id(id) { } @@ -224,6 +225,7 @@ ColorInterpolationSegment(const ColorInterpolationSegment ©) : _t_begin(copy._t_begin), _t_end(copy._t_end), _t_total(copy._t_total), + _is_modulated(copy._is_modulated), _enabled(copy._enabled), _id(copy._id) { } @@ -411,7 +413,7 @@ clear_to_initial() { Colorf ColorInterpolationManager:: generateColor(const float interpolated_time) { bool segment_found = false; - Colorf out(0.0f,0.0f,0.0f,0.0f); + Colorf out(_default_color); ColorInterpolationSegment *cur_seg; pvector::iterator iter; @@ -421,15 +423,27 @@ generateColor(const float interpolated_time) { interpolated_time >= cur_seg->get_time_begin() && interpolated_time <= cur_seg->get_time_end() ) { segment_found = true; - out += cur_seg->interpolateColor(interpolated_time); - out[0] = max(0.0f, min(out[0], 1.0f)); - out[1] = max(0.0f, min(out[1], 1.0f)); - out[2] = max(0.0f, min(out[2], 1.0f)); - out[3] = max(0.0f, min(out[3], 1.0f)); + Colorf cur_color = cur_seg->interpolateColor(interpolated_time); + if( cur_seg->is_modulated() ) { + out[0] *= cur_color[0]; + out[1] *= cur_color[1]; + out[2] *= cur_color[2]; + out[3] *= cur_color[3]; + } + else { + out[0] += cur_color[0]; + out[1] += cur_color[1]; + out[2] += cur_color[2]; + out[3] += cur_color[3]; + } } } if(segment_found) { + out[0] = max(0.0f, min(out[0], 1.0f)); + out[1] = max(0.0f, min(out[1], 1.0f)); + out[2] = max(0.0f, min(out[2], 1.0f)); + out[3] = max(0.0f, min(out[3], 1.0f)); return out; } diff --git a/panda/src/particlesystem/colorInterpolationManager.h b/panda/src/particlesystem/colorInterpolationManager.h index 27d379187f..b6de1add58 100755 --- a/panda/src/particlesystem/colorInterpolationManager.h +++ b/panda/src/particlesystem/colorInterpolationManager.h @@ -252,12 +252,14 @@ PUBLISHED: INLINE TypedReferenceCount* get_function() const; INLINE float get_time_begin() const; INLINE float get_time_end() const; + INLINE bool is_modulated() const; INLINE int get_id() const; INLINE bool is_enabled() const; INLINE void set_function(ColorInterpolationFunction* function); INLINE void set_time_begin(const float time); INLINE void set_time_end(const float time); + INLINE void set_is_modulated(const bool flag); INLINE void set_enabled(const bool enabled); public: @@ -268,6 +270,7 @@ protected: float _t_begin; float _t_end; float _t_total; + bool _is_modulated; bool _enabled; const int _id; };