diff --git a/include/d3dx8math.h b/include/d3dx8math.h index 0c60b66f506..40081fd8d7c 100644 --- a/include/d3dx8math.h +++ b/include/d3dx8math.h @@ -220,6 +220,42 @@ typedef struct D3DXPLANE typedef struct D3DXCOLOR { +#ifdef __cplusplus + D3DXCOLOR(); + D3DXCOLOR(DWORD col); + D3DXCOLOR(CONST FLOAT *pf); + D3DXCOLOR(CONST D3DCOLORVALUE& col); + D3DXCOLOR(FLOAT fr, FLOAT fg, FLOAT fb, FLOAT fa); + + operator DWORD () const; + + operator FLOAT* (); + operator CONST FLOAT* () const; + + operator D3DCOLORVALUE* (); + operator CONST D3DCOLORVALUE* () const; + + operator D3DCOLORVALUE& (); + operator CONST D3DCOLORVALUE& () const; + + D3DXCOLOR& operator += (CONST D3DXCOLOR&); + D3DXCOLOR& operator -= (CONST D3DXCOLOR&); + D3DXCOLOR& operator *= (FLOAT); + D3DXCOLOR& operator /= (FLOAT); + + D3DXCOLOR operator + () const; + D3DXCOLOR operator - () const; + + D3DXCOLOR operator + (CONST D3DXCOLOR&) const; + D3DXCOLOR operator - (CONST D3DXCOLOR&) const; + D3DXCOLOR operator * (FLOAT) const; + D3DXCOLOR operator / (FLOAT) const; + + friend D3DXCOLOR operator * (FLOAT, CONST D3DXCOLOR&); + + BOOL operator == (CONST D3DXCOLOR&) const; + BOOL operator != (CONST D3DXCOLOR&) const; +#endif /* __cplusplus */ FLOAT r, g, b, a; } D3DXCOLOR, *LPD3DXCOLOR; diff --git a/include/d3dx8math.inl b/include/d3dx8math.inl index c04c9d1162a..01e7af35542 100644 --- a/include/d3dx8math.inl +++ b/include/d3dx8math.inl @@ -690,6 +690,167 @@ inline BOOL D3DXPLANE::operator != (CONST D3DXPLANE& pl) const return a != pl.a || b != pl.b || c != pl.c || d != pl.d; } +inline D3DXCOLOR::D3DXCOLOR() +{ +} + +inline D3DXCOLOR::D3DXCOLOR(DWORD col) +{ + CONST FLOAT f = 1.0f / 255.0f; + r = f * (FLOAT)(unsigned char)(col >> 16); + g = f * (FLOAT)(unsigned char)(col >> 8); + b = f * (FLOAT)(unsigned char)col; + a = f * (FLOAT)(unsigned char)(col >> 24); +} + +inline D3DXCOLOR::D3DXCOLOR(CONST FLOAT *pf) +{ + if(!pf) return; + r = pf[0]; + g = pf[1]; + b = pf[2]; + a = pf[3]; +} + +inline D3DXCOLOR::D3DXCOLOR(CONST D3DCOLORVALUE& col) +{ + r = col.r; + g = col.g; + b = col.b; + a = col.a; +} + +inline D3DXCOLOR::D3DXCOLOR(FLOAT fr, FLOAT fg, FLOAT fb, FLOAT fa) +{ + r = fr; + g = fg; + b = fb; + a = fa; +} + +inline D3DXCOLOR::operator DWORD () const +{ + DWORD _r = r >= 1.0f ? 0xff : r <= 0.0f ? 0x00 : (DWORD)(r * 255.0f + 0.5f); + DWORD _g = g >= 1.0f ? 0xff : g <= 0.0f ? 0x00 : (DWORD)(g * 255.0f + 0.5f); + DWORD _b = b >= 1.0f ? 0xff : b <= 0.0f ? 0x00 : (DWORD)(b * 255.0f + 0.5f); + DWORD _a = a >= 1.0f ? 0xff : a <= 0.0f ? 0x00 : (DWORD)(a * 255.0f + 0.5f); + + return (_a << 24) | (_r << 16) | (_g << 8) | _b; +} + +inline D3DXCOLOR::operator FLOAT * () +{ + return (FLOAT*)&r; +} + +inline D3DXCOLOR::operator CONST FLOAT * () const +{ + return (CONST FLOAT*)&r; +} + +inline D3DXCOLOR::operator D3DCOLORVALUE * () +{ + return (D3DCOLORVALUE*)&r; +} + +inline D3DXCOLOR::operator CONST D3DCOLORVALUE * () const +{ + return (CONST D3DCOLORVALUE*)&r; +} + +inline D3DXCOLOR::operator D3DCOLORVALUE& () +{ + return *((D3DCOLORVALUE*)&r); +} + +inline D3DXCOLOR::operator CONST D3DCOLORVALUE& () const +{ + return *((CONST D3DCOLORVALUE*)&r); +} + +inline D3DXCOLOR& D3DXCOLOR::operator += (CONST D3DXCOLOR& col) +{ + r += col.r; + g += col.g; + b += col.b; + a += col.a; + return *this; +} + +inline D3DXCOLOR& D3DXCOLOR::operator -= (CONST D3DXCOLOR& col) +{ + r -= col.r; + g -= col.g; + b -= col.b; + a -= col.a; + return *this; +} + +inline D3DXCOLOR& D3DXCOLOR::operator *= (FLOAT f) +{ + r *= f; + g *= f; + b *= f; + a *= f; + return *this; +} + +inline D3DXCOLOR& D3DXCOLOR::operator /= (FLOAT f) +{ + FLOAT inv = 1.0f / f; + r *= inv; + g *= inv; + b *= inv; + a *= inv; + return *this; +} + +inline D3DXCOLOR D3DXCOLOR::operator + () const +{ + return *this; +} + +inline D3DXCOLOR D3DXCOLOR::operator - () const +{ + return D3DXCOLOR(-r, -g, -b, -a); +} + +inline D3DXCOLOR D3DXCOLOR::operator + (CONST D3DXCOLOR& col) const +{ + return D3DXCOLOR(r + col.r, g + col.g, b + col.b, a + col.a); +} + +inline D3DXCOLOR D3DXCOLOR::operator - (CONST D3DXCOLOR& col) const +{ + return D3DXCOLOR(r - col.r, g - col.g, b - col.b, a - col.a); +} + +inline D3DXCOLOR D3DXCOLOR::operator * (FLOAT f) const +{ + return D3DXCOLOR(r * f, g * f, b * f, a * f); +} + +inline D3DXCOLOR D3DXCOLOR::operator / (FLOAT f) const +{ + FLOAT inv = 1.0f / f; + return D3DXCOLOR(r * inv, g * inv, b * inv, a * inv); +} + +inline D3DXCOLOR operator * (FLOAT f, CONST D3DXCOLOR& col) +{ + return D3DXCOLOR(f * col.r, f * col.g, f * col.b, f * col.a); +} + +inline BOOL D3DXCOLOR::operator == (CONST D3DXCOLOR& col) const +{ + return r == col.r && g == col.g && b == col.b && a == col.a; +} + +inline BOOL D3DXCOLOR::operator != (CONST D3DXCOLOR& col) const +{ + return r != col.r || g != col.g || b != col.b || a != col.a; +} + #endif /* __cplusplus */ /*_______________D3DXCOLOR_____________________*/