00001 00032 #include "linden_common.h" 00033 00034 #include "v3color.h" 00035 #include "v4color.h" 00036 #include "v4math.h" 00037 00038 LLColor3 LLColor3::white(1.0f, 1.0f, 1.0f); 00039 LLColor3 LLColor3::black(0.0f, 0.0f, 0.0f); 00040 LLColor3 LLColor3::grey (0.5f, 0.5f, 0.5f); 00041 00042 LLColor3::LLColor3(const LLColor4 &a) 00043 { 00044 mV[0] = a.mV[0]; 00045 mV[1] = a.mV[1]; 00046 mV[2] = a.mV[2]; 00047 } 00048 00049 LLColor3::LLColor3(const LLVector4 &a) 00050 { 00051 mV[0] = a.mV[0]; 00052 mV[1] = a.mV[1]; 00053 mV[2] = a.mV[2]; 00054 } 00055 00056 LLColor3::LLColor3(const LLSD &sd) 00057 { 00058 mV[0] = (F32) sd[0].asReal(); 00059 mV[1] = (F32) sd[1].asReal(); 00060 mV[2] = (F32) sd[2].asReal(); 00061 } 00062 00063 const LLColor3& LLColor3::operator=(const LLColor4 &a) 00064 { 00065 mV[0] = a.mV[0]; 00066 mV[1] = a.mV[1]; 00067 mV[2] = a.mV[2]; 00068 return (*this); 00069 } 00070 00071 std::ostream& operator<<(std::ostream& s, const LLColor3 &a) 00072 { 00073 s << "{ " << a.mV[VX] << ", " << a.mV[VY] << ", " << a.mV[VZ] << " }"; 00074 return s; 00075 } 00076 00077 void LLColor3::calcHSL(F32* hue, F32* saturation, F32* luminance) const 00078 { 00079 F32 var_R = mV[VRED]; 00080 F32 var_G = mV[VGREEN]; 00081 F32 var_B = mV[VBLUE]; 00082 00083 F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) ); 00084 F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) ); 00085 00086 F32 del_Max = var_Max - var_Min; 00087 00088 F32 L = ( var_Max + var_Min ) / 2.0f; 00089 F32 H = 0.0f; 00090 F32 S = 0.0f; 00091 00092 if ( del_Max == 0.0f ) 00093 { 00094 H = 0.0f; 00095 S = 0.0f; 00096 } 00097 else 00098 { 00099 if ( L < 0.5 ) 00100 S = del_Max / ( var_Max + var_Min ); 00101 else 00102 S = del_Max / ( 2.0f - var_Max - var_Min ); 00103 00104 F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; 00105 F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; 00106 F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; 00107 00108 if ( var_R >= var_Max ) 00109 H = del_B - del_G; 00110 else 00111 if ( var_G >= var_Max ) 00112 H = ( 1.0f / 3.0f ) + del_R - del_B; 00113 else 00114 if ( var_B >= var_Max ) 00115 H = ( 2.0f / 3.0f ) + del_G - del_R; 00116 00117 if ( H < 0.0f ) H += 1.0f; 00118 if ( H > 1.0f ) H -= 1.0f; 00119 } 00120 00121 if (hue) *hue = H; 00122 if (saturation) *saturation = S; 00123 if (luminance) *luminance = L; 00124 }