すいません、見落としていました
ライトの色( R,G,B )を輝度、彩度、色相で表現しているだけで、最終的には R,G,B の値に変換して
SetLightDifColor などを使用しています
H( 色相 ),L( 輝度 ),S( 彩度 )の値をR,G,Bの値に変換する関数は以下のようになっています
それぞれ HLS を RGB に変換する関数と、RGB を HLS に変換する関数です
例:色相0.5 輝度1.0 彩度0.5 のHLS値からRGB値を求める
float r, g, b ;
ToolHLSToRGB( 0.5f, 1.0f, 0.5f, &r, &g, &b ) ;
// HLSカラーからRGBカラーに変換( 0.0f 〜 1.0f )
extern int ToolHLSToRGB( float H, float L, float S, float *dr, float *dg, float *db )
{
float r, g, b ;
// 色相選択処理
H = fmod( H, 1.0f ) ;
if( H >= 0.0f && H <= 1.0f / 6.0f )
{
H = H * 6.0f ; r = 1.0f ; g = H ; b = 0.0f ;
}
else
if( H > 1.0f / 6.0f && H <= 2.0f / 6.0f )
{
H = H * 6.0f - 1.0f ; r = 1.0f - H ; g = 1.0f ; b = 0.0f ;
}
else
if( H > 2.0f / 6.0f && H <= 3.0f / 6.0f )
{
H = H * 6.0f - 2.0f ; r = 0.0f ; g = 1.0f ; b = H ;
}
else
if( H > 3.0f / 6.0f && H <= 4.0f / 6.0f )
{
H = H * 6.0f - 3.0f ; r = 0.0f ; g = 1.0f - H ; b = 1.0f ;
}
else
if( H > 4.0f / 6.0f && H <= 5.0f / 6.0f )
{
H = H * 6.0f - 4.0f ; r = H ; g = 0.0f ; b = 1.0f ;
}
else
if( H > 5.0f / 6.0f && H <= 6.0f / 6.0f )
{
H = H * 6.0f - 5.0f ; r = 1.0f ; g = 0.0f ; b = 1.0f - H ;
}
// 彩度と輝度の計算を行う
{
// 彩度が加わる
r += ( 0.5f - r ) * ( 1.0f - S ) ;
g += ( 0.5f - g ) * ( 1.0f - S ) ;
b += ( 0.5f - b ) * ( 1.0f - S ) ;
// 輝度が加わる
if( L <= 0.5f )
{
r *= L * 2.0f ;
g *= L * 2.0f ;
b *= L * 2.0f ;
}
else
{
r += ( 1.0f - r ) * ( ( L - 0.5f ) * 2.0f ) ;
g += ( 1.0f - g ) * ( ( L - 0.5f ) * 2.0f ) ;
b += ( 1.0f - b ) * ( ( L - 0.5f ) * 2.0f ) ;
}
}
// 代入
if( dr ) *dr = r ;
if( dg ) *dg = g ;
if( db ) *db = b ;
// 終了
return 0 ;
}
// RGBカラーからHLSカラーに変換( 0.0f 〜 1.0f )
extern int ToolRGBToHLS( float R, float G, float B, float *dh, float *dl, float *ds )
{
float h, l, s, c, min, max ;
// 最小値と最大値を得る
max = R >= G ? ( R >= B ? R : B ) : ( G >= B ? G : B ) ;
min = R <= G ? ( R <= B ? R : B ) : ( G <= B ? G : B ) ;
// 最大値と最小値の差を得る
c = max - min ;
// 初期チェック
if( R == 0.0f && G == 0.0f && B == 0.0f )
{
h = 0.0f ;
l = 0.0f ;
s = 0.0f ;
}
else
if( R == 1.0f && G == 1.0f && B == 1.0f )
{
h = 0.0f ;
l = 1.0f ;
s = 0.0f ;
}
else
if( R == G && G == B )
{
h = 0.0f ;
l = R ;
s = 0.0f ;
}
else
{
// 色相を得る
{
float r, g, b, mx ;
r = R - min ;
g = G - min ;
b = B - min ;
mx = r >= g ? ( r >= b ? r : b ) : ( g >= b ? g : b ) ;
r /= mx ;
g /= mx ;
b /= mx ;
if( r == 1.0f )
{
if( b == 0.0f )
{
h = ( 0.0f + g ) / 6.0f ;
}
else
{
h = ( 6.0f - b ) / 6.0f ;
}
}
else
if( g == 1.0f )
{
if( r == 0.0f )
{
h = ( 2.0f + b ) / 6.0f ;
}
else
{
h = ( 2.0f - r ) / 6.0f ;
}
}
else
if( b == 1.0f )
{
if( g == 0.0f )
{
h = ( 4.0f + r ) / 6.0f ;
}
else
{
h = ( 4.0f - g ) / 6.0f ;
}
}
}
// 輝度を求める
{
l = ( min + max ) / 2.0f ;
}
// 彩度を求める
{
float w ;
w = l > 0.5f ? ( 1.0f - l ) * 2 : l * 2 ;
s = c / w ;
}
}
if( dh != NULL ) *dh = h ;
if( dl != NULL ) *dl = l ;
if( ds != NULL ) *ds = s ;
// 終了
return 0 ;
}