summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scene/resources/color_ramp.cpp48
-rw-r--r--scene/resources/color_ramp.h45
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;
};