VCRA-SZCZERBACKI-PointBasedRendering/color.h

00001 #ifndef COLOR_H
00002 #define COLOR_H
00003 
00004 //==============================================================
00005 //==============================================================
00006 
00007 #include "def.h"
00008 #include "ssVector.hpp"
00009 
00010 //==============================================================
00011 //==============================================================
00012 
00013 #pragma pack( push, 1 )
00014 class Color
00015 {
00016 public:
00017         inline Color( )                                                                                                 { r=0; g=0; b=0; a=255; }
00018         inline Color( UINT32 argb )                                                                             { set(argb); }
00019         inline Color( UINT8 ri, UINT8 gi, UINT8 bi, UINT8 ai=255 )              { r=ri; g=gi; b=bi; a=ai; }
00020         inline Color( const Vector3 &v )                                                                { set( v ); }
00021         inline Color( const Vector4 &v )                                                                { set( v ); }
00022         inline void set( UINT8 ri, UINT8 gi, UINT8 bi, UINT8 ai )               { r=ri; g=gi; b=bi; a=ai; }
00023         inline void set( UINT8 ri, UINT8 gi, UINT8 bi )                                 { r=ri; g=gi; b=bi; }
00024         inline void setAlpha( UINT8 ai )                                                                { a=ai; }
00025         inline void set( const Vector3 &v )
00026         {
00027                 int t;
00028                 t = intFloor(v.x*255.0f);
00029                 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00030                 r = t;
00031                 t = intFloor(v.y*255.0f);
00032                 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00033                 g = t;
00034                 t = intFloor(v.z*255.0f);
00035                 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00036                 b = t;
00037         }
00038         inline void set( const Vector4 &v )
00039         {
00040                 int t;
00041                 t = intFloor(v.x*255.0f);
00042                 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00043                 r = t;
00044                 t = intFloor(v.y*255.0f);
00045                 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00046                 g = t;
00047                 t = intFloor(v.z*255.0f);
00048                 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00049                 b = t;
00050                 t = intFloor(v.w*255.0f);
00051                 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00052                 a = t;
00053         }
00054         inline void     set( UINT32 argb )                                                                      { a=(char)((argb&0xff000000)>>24); r=(char)((argb&0xff0000)>>16);g=(char)((argb&0xff00)>>8);b=(char)(argb&0xff); }
00055         inline UINT32 getUINT32() const                                                                 { return (a<<24)|(r<<16)|(g<<8)|b; }
00056 
00057         inline void operator=( const Vector3 &v )                                               { set(v); }
00058         inline void operator=( const Vector4 &v )                                               { set(v); }
00059 
00060         inline Color &operator+=(const Color &c)                                                { int k;
00061                                                                                                         k = a + c.a; if( k > 255 ) k = 255; a = k;
00062                                                                                                         k = r + c.r; if( k > 255 ) k = 255; r = k;
00063                                                                                                         k = g + c.g; if( k > 255 ) k = 255; g = k;
00064                                                                                                         k = b + c.b; if( k > 255 ) k = 255; b = k;
00065                                                                                                         return *this; }
00066         inline Color &operator-=(const Color &c)                                                { int k;
00067                                                                                                         k = a - c.a; if( k < 0 ) k = 0; a = k;
00068                                                                                                         k = r - c.r; if( k < 0 ) k = 0; r = k;
00069                                                                                                         k = g - c.g; if( k < 0 ) k = 0; g = k;
00070                                                                                                         k = b - c.b; if( k < 0 ) k = 0; b = k;
00071                                                                                                         return *this; }
00072         inline Color &operator*=(const Color &c)                                                { int k;
00073                                                                                                         k = a * c.a; k = k >> 8; if( k > 255 ) k = 255; a = k;
00074                                                                                                         k = r * c.r; k = k >> 8; if( k > 255 ) k = 255; r = k;
00075                                                                                                         k = g * c.g; k = k >> 8; if( k > 255 ) k = 255; g = k;
00076                                                                                                         k = b * c.b; k = k >> 8; if( k > 255 ) k = 255; b = k;
00077                                                                                                         return *this; }
00078         inline Color &operator+=(float f)                                                               { float k; f *= 255.0f;
00079                                                                                                         k = a + f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; a = intFloor(k);
00080                                                                                                         k = r + f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00081                                                                                                         k = g + f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00082                                                                                                         k = b + f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00083                                                                                                         return *this; }
00084         inline Color &operator*=(float f)                                                               { float k;
00085                                                                                                         k = a * f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; a = intFloor(k);
00086                                                                                                         k = r * f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00087                                                                                                         k = g * f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00088                                                                                                         k = b * f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00089                                                                                                         return *this; }
00090         inline Color &operator+=(const Vector3 &v)                                      { float k;
00091                                                                                                         k = r + v.x * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00092                                                                                                         k = g + v.y * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00093                                                                                                         k = b + v.z * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00094                                                                                                         return *this; }
00095         inline Color &operator*=(const Vector3 &v)                                      { float k;
00096                                                                                                         k = r * v.x; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00097                                                                                                         k = g * v.y; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00098                                                                                                         k = b * v.z; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00099                                                                                                         return *this; }
00100         inline Color &operator+=(const Vector4 &v)                                      { float k;
00101                                                                                                         k = r + v.x * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00102                                                                                                         k = g + v.y * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00103                                                                                                         k = b + v.z * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00104                                                                                                         k = a + v.w * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; a = intFloor(k);
00105                                                                                                         return *this; }
00106         inline Color &operator*=(const Vector4 &v)                                      { float k;
00107                                                                                                         k = r * v.x; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00108                                                                                                         k = g * v.y; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00109                                                                                                         k = b * v.z; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00110                                                                                                         k = a * v.w; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; a = intFloor(k);
00111                                                                                                         return *this; }
00112 
00113         inline void toVector3( Vector3 &v ) const               { v.x = float(r)*(1.0f/255.0f); v.y = float(g)*(1.0f/255.0f); v.z = float(b)*(1.0f/255.0f); }
00114         inline void toVector4( Vector4 &v ) const               { v.x = float(r)*(1.0f/255.0f); v.y = float(g)*(1.0f/255.0f); v.z = float(b)*(1.0f/255.0f); v.w = float(a)*(1.0f/255.0f); }
00115         inline Vector3 toVector3( ) const                               { return Vector3(float(r)*(1.0f/255.0f), float(g)*(1.0f/255.0f), float(b)*(1.0f/255.0f)); }
00116         inline Vector4 toVector4( ) const                               { return Vector4(float(r)*(1.0f/255.0f), float(g)*(1.0f/255.0f), float(b)*(1.0f/255.0f), float(a)*(1.0f/255.0f)); }
00117 
00118         UINT8 b,g,r,a;  //Intel inverse byte order...
00119 };
00120 #pragma pack( pop )
00121 
00122 //==============================================================
00123 //==============================================================
00124 
00125 #endif

Generated on Thu Feb 15 09:09:19 2007 for Surface Splating by  doxygen 1.5.1-p1