00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OpenSpace3D 00004 For the latest info, see http://www.openspace3d.com 00005 00006 Copyright (c) 2010 I-maginer 00007 00008 This program is free software; you can redistribute it and/or modify it under 00009 the terms of the GNU Lesser General Public License as published by the Free Software 00010 Foundation; either version 2 of the License, or (at your option) any later 00011 version. 00012 00013 This program is distributed in the hope that it will be useful, but WITHOUT 00014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00016 00017 You should have received a copy of the GNU Lesser General Public License along with 00018 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00019 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00020 http://www.gnu.org/copyleft/lesser.txt 00021 00022 You may alternatively use this source under the terms of a specific version of 00023 the OpenSpace3D Unrestricted License provided you have obtained such a license from 00024 I-maginer. 00025 ----------------------------------------------------------------------------- 00026 */ 00027 00028 #ifndef __SO3_COLOUR_GRADIENT_H__ 00029 #define __SO3_COLOUR_GRADIENT_H__ 00030 00031 #include "../SCOLBasic/SO3Std.h" 00032 00033 namespace SO3 00034 { 00035 00039 class _SO3_Export SColourGradient 00040 { 00041 public: 00042 protected: 00043 private: 00044 const bool fillBounds; 00045 typedef std::map<float, Ogre::ColourValue> ColourFrames; 00046 ColourFrames colourFrames; 00047 const Ogre::ColourValue minBoundDefaultColour; 00048 const Ogre::ColourValue maxBoundDefaultColour; 00049 public: 00050 typedef ColourFrames::value_type ColourFrame; 00051 00052 public: 00057 SColourGradient(bool fillBoundsWithDefault=true); 00058 00064 SColourGradient(const Ogre::ColourValue& overridedMinDefaultColour, const Ogre::ColourValue& overridedMaxDefaultColour); 00065 00069 ~SColourGradient(); 00070 00075 inline void AddColourFrame(const ColourFrame& colourFrame) 00076 { 00077 AddColourFrame(colourFrame.first, colourFrame.second); 00078 } 00079 00085 inline void AddColourFrame(const float& gradientPosition, const Ogre::ColourValue& colour) 00086 { 00087 assert((gradientPosition >= 0.0f)&&(gradientPosition<=1.0f)); 00088 if(colourFrames.find(gradientPosition) == colourFrames.end()) 00089 colourFrames.insert(ColourFrames::value_type(gradientPosition, colour)); 00090 else 00091 colourFrames[gradientPosition] = colour; 00092 } 00093 00097 inline void Clear() 00098 { 00099 colourFrames.clear(); 00100 } 00101 00107 const Ogre::ColourValue GetColour(float gradientPosition) const; 00108 protected: 00109 private: 00113 Ogre::ColourValue Interpolate(const ColourFrame& minColourFrame, const ColourFrame& maxColourFrame, const float& mediumRangeValue) const; 00114 }; 00115 00116 /****************/ 00117 /* Test cases */ 00118 /****************/ 00119 /* 00120 // Test filling bounds (white/red/green/blue/black) 00121 Ogre::ColourValue resultColour; 00122 SColourGradient myTest; 00123 myTest.AddColourFrame(0.3, Ogre::ColourValue::Red); 00124 myTest.AddColourFrame(0.5, Ogre::ColourValue::Green); 00125 myTest.AddColourFrame(0.7, Ogre::ColourValue::Blue); 00126 resultColour = myTest.GetColour(0.0); // (0.0, 0.0, 0.0, 1.0) 00127 resultColour = myTest.GetColour(0.15); // (0.5, 0.0, 0.0, 1.0) 00128 resultColour = myTest.GetColour(0.3); // (1.0, 0.0, 0.0, 1.0) 00129 resultColour = myTest.GetColour(0.4); // (0.5, 0.5, 0.0, 1.0) 00130 resultColour = myTest.GetColour(0.5); // (0.0, 1.0, 0.0, 1.0) 00131 resultColour = myTest.GetColour(0.6); // (0.0, 0.5, 0.5, 1.0) 00132 resultColour = myTest.GetColour(0.7); // (0.0, 0.0, 1.0, 1.0) 00133 resultColour = myTest.GetColour(0.85); // (0.5, 0.5, 1.0, 1.0) 00134 resultColour = myTest.GetColour(1.0); // (1.0, 1.0, 1.0, 1.0) 00135 00136 // Test no filling bounds (red/green/blue) 00137 SColourGradient myTest2(false); 00138 myTest2.AddColourFrame(0.3, Ogre::ColourValue::Red); 00139 myTest2.AddColourFrame(0.5, Ogre::ColourValue::Green); 00140 myTest2.AddColourFrame(0.7, Ogre::ColourValue::Blue); 00141 resultColour = myTest2.GetColour(0.0); // (1.0, 0.0, 0.0, 1.0) 00142 resultColour = myTest2.GetColour(0.15); // (1.0, 0.0, 0.0, 1.0) 00143 resultColour = myTest2.GetColour(0.3); // (1.0, 0.0, 0.0, 1.0) 00144 resultColour = myTest2.GetColour(0.4); // (0.5, 0.5, 0.0, 1.0) 00145 resultColour = myTest2.GetColour(0.5); // (0.0, 1.0, 0.0, 1.0) 00146 resultColour = myTest2.GetColour(0.6); // (0.0, 0.5, 0.5, 1.0) 00147 resultColour = myTest2.GetColour(0.7); // (0.0, 0.0, 1.0, 1.0) 00148 resultColour = myTest2.GetColour(0.85); // (0.0, 0.0, 1.0, 1.0) 00149 resultColour = myTest2.GetColour(1.0); // (0.0, 0.0, 1.0, 1.0) 00150 00151 // Test filling bounds 2 (red/green/blue) 00152 SColourGradient myTest3; 00153 myTest3.AddColourFrame(0.0, Ogre::ColourValue::Red); 00154 myTest3.AddColourFrame(0.5, Ogre::ColourValue::Green); 00155 myTest3.AddColourFrame(1.0, Ogre::ColourValue::Blue); 00156 resultColour = myTest3.GetColour(0.0); // (1.0, 0.0, 0.0, 1.0) 00157 resultColour = myTest3.GetColour(0.25); // (0.5, 0.5, 0.0, 1.0) 00158 resultColour = myTest3.GetColour(0.5); // (0.0, 1.0, 0.0, 1.0) 00159 resultColour = myTest3.GetColour(0.75); // (0.0, 0.5, 0.5, 1.0) 00160 resultColour = myTest3.GetColour(1.0); // (0.0, 0.0, 1.0, 1.0) 00161 00162 // Test no filling bounds 2 (red/green/blue) 00163 SColourGradient myTest4(false); 00164 myTest4.AddColourFrame(0.0, Ogre::ColourValue::Red); 00165 myTest4.AddColourFrame(0.5, Ogre::ColourValue::Green); 00166 myTest4.AddColourFrame(1.0, Ogre::ColourValue::Blue); 00167 resultColour = myTest4.GetColour(0.0); // (1.0, 0.0, 0.0, 1.0) 00168 resultColour = myTest4.GetColour(0.25); // (0.5, 0.5, 0.0, 1.0) 00169 resultColour = myTest4.GetColour(0.5); // (0.0, 1.0, 0.0, 1.0) 00170 resultColour = myTest4.GetColour(0.75); // (0.0, 0.5, 0.5, 1.0) 00171 resultColour = myTest4.GetColour(1.0); // (0.0, 0.0, 1.0, 1.0) 00172 00173 // Test filling bounds 3 (black/red/white) 00174 SColourGradient myTest5; 00175 myTest5.AddColourFrame(0.5, Ogre::ColourValue::Red); 00176 resultColour = myTest5.GetColour(0.0); // (0.0, 0.0, 0.0, 1.0) 00177 resultColour = myTest5.GetColour(0.25); // (0.5, 0.0, 0.0, 1.0) 00178 resultColour = myTest5.GetColour(0.5); // (1.0, 0.0, 0.0, 1.0) 00179 resultColour = myTest5.GetColour(0.75); // (1.0, 0.5, 0.5, 1.0) 00180 resultColour = myTest5.GetColour(1.0); // (1.0, 1.0, 1.0, 1.0) 00181 00182 // Test no filling bounds 3 (all red) 00183 SColourGradient myTest6(false); 00184 myTest6.AddColourFrame(0.5, Ogre::ColourValue::Red); 00185 resultColour = myTest6.GetColour(0.0); // (1.0, 0.0, 0.0, 1.0) 00186 resultColour = myTest6.GetColour(0.25); // (1.0, 0.0, 0.0, 1.0) 00187 resultColour = myTest6.GetColour(0.5); // (1.0, 0.0, 0.0, 1.0) 00188 resultColour = myTest6.GetColour(0.75); // (1.0, 0.0, 0.0, 1.0) 00189 resultColour = myTest6.GetColour(1.0); // (1.0, 0.0, 0.0, 1.0) 00190 00191 // Test filling bounds 4 (black/white) 00192 SColourGradient myTest7; 00193 resultColour = myTest7.GetColour(0.0); // (0.0, 0.0, 0.0, 1.0) 00194 resultColour = myTest7.GetColour(0.5); // (0.5, 0.5, 0.5, 1.0) 00195 resultColour = myTest7.GetColour(1.0); // (1.0, 1.0, 1.0, 1.0) 00196 00197 // Test no filling bounds 4 (no valid value, all black) 00198 SColourGradient myTest8(false); 00199 resultColour = myTest8.GetColour(0.0); // (0.0, 0.0, 0.0, 1.0) 00200 resultColour = myTest8.GetColour(0.5); // (0.0, 0.0, 0.0, 1.0) 00201 resultColour = myTest8.GetColour(1.0); // (0.0, 0.0, 0.0, 1.0) 00202 00203 // Test filling bounds 5 (red/green) 00204 SColourGradient myTest9(Ogre::ColourValue::Red, Ogre::ColourValue::Green); 00205 resultColour = myTest9.GetColour(0.0); // (1.0, 0.0, 0.0, 1.0) 00206 resultColour = myTest9.GetColour(0.5); // (0.5, 0.5, 0.0, 1.0) 00207 resultColour = myTest9.GetColour(1.0); // (0.0, 1.0, 0.0, 1.0) 00208 */ 00209 00210 } 00211 00212 #endif
1.6.3