00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "SO3ColourGradient.h"
00029
00030 namespace SO3
00031 {
00032
00033 SColourGradient::SColourGradient(bool fillBoundsWithDefault) : fillBounds(fillBoundsWithDefault),
00034 minBoundDefaultColour(Ogre::ColourValue::Black),
00035 maxBoundDefaultColour(Ogre::ColourValue::White)
00036 {
00037 }
00038
00039 SColourGradient::SColourGradient(const Ogre::ColourValue& overridedMinDefaultColour, const Ogre::ColourValue& overridedMaxDefaultColour) : fillBounds(true),
00040 minBoundDefaultColour(overridedMinDefaultColour),
00041 maxBoundDefaultColour(overridedMaxDefaultColour)
00042 {
00043 }
00044
00045 SColourGradient::~SColourGradient()
00046 {
00047 }
00048
00049 const Ogre::ColourValue SColourGradient::GetColour(float gradientPosition) const
00050 {
00051
00052 if(gradientPosition < 0.0f)
00053 gradientPosition = 0.0f;
00054 if(gradientPosition > 1.0f)
00055 gradientPosition = 1.0f;
00056
00057
00058 if (colourFrames.size() == 0)
00059 {
00060 if(!fillBounds)
00061 return Ogre::ColourValue::Black;
00062 else
00063 return Interpolate(ColourFrame(0.0f, minBoundDefaultColour), ColourFrame(1.0f, maxBoundDefaultColour), gradientPosition);
00064 }
00065
00066
00067 ColourFrames::const_iterator iSearchedColourFrame = colourFrames.find(gradientPosition);
00068 if(iSearchedColourFrame != colourFrames.end())
00069 return iSearchedColourFrame->second;
00070
00071
00072 if (colourFrames.size() == 1)
00073 {
00074 if(!fillBounds)
00075 {
00076
00077 return colourFrames.begin()->second;
00078 }
00079 else
00080 {
00081 if(gradientPosition < colourFrames.begin()->first)
00082 {
00083
00084 return Interpolate(ColourFrame(0.0f, minBoundDefaultColour), *colourFrames.begin(), gradientPosition);
00085 }
00086 else
00087 {
00088
00089 return Interpolate(*colourFrames.begin(), ColourFrame(1.0f, maxBoundDefaultColour), gradientPosition);
00090 }
00091 }
00092 }
00093
00094
00095 ColourFrames::const_iterator iMinBound = colourFrames.lower_bound(gradientPosition);
00096 if(iMinBound != colourFrames.begin())
00097 iMinBound--;
00098
00099
00100 ColourFrames::const_iterator iMaxBound = colourFrames.upper_bound(gradientPosition);
00101
00102
00103 if(gradientPosition < iMinBound->first)
00104 {
00105 if(!fillBounds)
00106 {
00107
00108 return iMinBound->second;
00109 }
00110 else
00111 {
00112
00113 return Interpolate(ColourFrame(0.0f, minBoundDefaultColour), *iMinBound, gradientPosition);
00114 }
00115 }
00116
00117
00118 if(iMaxBound == colourFrames.end())
00119 {
00120 iMaxBound--;
00121 if(!fillBounds)
00122 {
00123
00124 return iMaxBound->second;
00125 }
00126 else
00127 {
00128
00129 return Interpolate(*iMaxBound, ColourFrame(1.0f, maxBoundDefaultColour), gradientPosition);
00130 }
00131 }
00132
00133
00134 return Interpolate(*iMinBound, *iMaxBound, gradientPosition);
00135 }
00136
00137 Ogre::ColourValue SColourGradient::Interpolate(const ColourFrame& minColourFrame, const ColourFrame& maxColourFrame, const float& mediumRangeValue) const
00138 {
00139 float range = maxColourFrame.first - minColourFrame.first;
00140 float rangePoint = (mediumRangeValue - minColourFrame.first) / range;
00141 return ((minColourFrame.second * (1.0f - rangePoint)) + (maxColourFrame.second * rangePoint));
00142 }
00143
00144 }