diff options
-rw-r--r-- | scene/resources/color_ramp.cpp | 48 | ||||
-rw-r--r-- | scene/resources/color_ramp.h | 45 |
2 files changed, 44 insertions, 49 deletions
diff --git a/scene/resources/color_ramp.cpp b/scene/resources/color_ramp.cpp index df235e2f2c..97d3fafd58 100644 --- a/scene/resources/color_ramp.cpp +++ b/scene/resources/color_ramp.cpp @@ -112,54 +112,6 @@ Color ColorRamp::get_color(int pos) const { return Color(0,0,0,1); //TODO: Maybe throw some error instead? } -Color ColorRamp::get_color_at_offset(float p_offset) { - - if (points.empty()) - return Color(0,0,0,1); - - if (points.size() == 1) - return points[0].color; - - if(!is_sorted) - { - points.sort(); - is_sorted = true; - } - - //binary search - int low = 0; - int high = points.size() -1; - int middle; - - while( low <= high ) - { - middle = ( low + high ) / 2; - Point& point = points[middle]; - if( point.offset > p_offset ) { - high = middle - 1; //search low end of array - } else if ( point.offset < p_offset) { - low = middle + 1; //search high end of array - } else { - return point.color; - } - } - - //return interpolated value - if (points[middle].offset>p_offset) - { - middle--; - } - int first=middle; - int second=middle+1; - if(second>=points.size()) - return points[points.size()-1].color; - if(first<0) - return points[0].color; - Point& pointFirst = points[first]; - Point& pointSecond = points[second]; - return pointFirst.color.linear_interpolate(pointSecond.color, (p_offset-pointFirst.offset)/(pointSecond.offset - pointFirst.offset)); -} - int ColorRamp::get_points_count() const { return points.size(); } diff --git a/scene/resources/color_ramp.h b/scene/resources/color_ramp.h index 7db8b4f3b0..8f6ba2c3e5 100644 --- a/scene/resources/color_ramp.h +++ b/scene/resources/color_ramp.h @@ -47,7 +47,50 @@ public: void set_colors(const Vector<Color>& colors); Vector<Color> get_colors() const; - Color get_color_at_offset(float offset); + _FORCE_INLINE_ Color get_color_at_offset(float p_offset) { + + if (points.empty()) + return Color(0,0,0,1); + + if(!is_sorted) + { + points.sort(); + is_sorted = true; + } + + //binary search + int low = 0; + int high = points.size() -1; + int middle; + + while( low <= high ) + { + middle = ( low + high ) / 2; + Point& point = points[middle]; + if( point.offset > p_offset ) { + high = middle - 1; //search low end of array + } else if ( point.offset < p_offset) { + low = middle + 1; //search high end of array + } else { + return point.color; + } + } + + //return interpolated value + if (points[middle].offset>p_offset) + { + middle--; + } + int first=middle; + int second=middle+1; + if(second>=points.size()) + return points[points.size()-1].color; + if(first<0) + return points[0].color; + Point& pointFirst = points[first]; + Point& pointSecond = points[second]; + return pointFirst.color.linear_interpolate(pointSecond.color, (p_offset-pointFirst.offset)/(pointSecond.offset - pointFirst.offset)); + } int get_points_count() const; }; |