Inline get_color_at_offset(). Delete unnecessary check.
This commit is contained in:
parent
3f975965e9
commit
dc1940d3e8
2 changed files with 44 additions and 49 deletions
|
@ -112,54 +112,6 @@ Color ColorRamp::get_color(int pos) const {
|
||||||
return Color(0,0,0,1); //TODO: Maybe throw some error instead?
|
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 {
|
int ColorRamp::get_points_count() const {
|
||||||
return points.size();
|
return points.size();
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,50 @@ public:
|
||||||
void set_colors(const Vector<Color>& colors);
|
void set_colors(const Vector<Color>& colors);
|
||||||
Vector<Color> get_colors() const;
|
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;
|
int get_points_count() const;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue