class c_float_color {
public:
c_float_color( ) = default;
c_float_color( float _r, float _g, float _b, float _a = 1.0f ) :
r( _r ), g( _g ), b( _b ), a( _a ) { }
c_float_color( int _r, int _g, int _b, int _a = 255 ) { set_color( _r, _g, _b, _a ); }
void set_color( float _r, float _g, float _b, float _a = 1.0f ) {
r = _r;
g = _g;
b = _b;
a = _a;
}
void set_color( int _r, int _g, int _b, int _a = 255 ) {
r = static_cast< float >( _r ) / 255.0f;
g = static_cast< float >( _g ) / 255.0f;
b = static_cast< float >( _b ) / 255.0f;
a = static_cast< float >( _a ) / 255.0f;
}
c_float_color alpha( float alpha ) {
return c_float_color( r, g, b, alpha );
}
uint32_t hex( ) const {
union {
uint32_t i;
struct {
uint8_t bytes[ 4 ];
};
}conv;
conv.bytes[ 0 ] = static_cast< int >( r * 255.0f );
conv.bytes[ 1 ] = static_cast< int >( g * 255.0f );
conv.bytes[ 2 ] = static_cast< int >( b * 255.0f );
conv.bytes[ 3 ] = static_cast< int >( a * 255.0f );
return conv.i;
};
bool operator==( const c_float_color& clr ) const {
return clr.r == r && clr.g == g && clr.b == b && clr.a == a;
};
bool operator!=( const c_float_color& clr ) const {
return clr.r != r || clr.g != g || clr.b != b || clr.a != a;
};
c_float_color operator*( float v ) const {
return c_float_color( r * v, g * v, b * v, a );
}
operator uint32_t( ) const { return hex( ); };
operator float* ( ) { return &r; };
float r, g, b, a;
static c_float_color Black;
static c_float_color White;
static c_float_color Gray;
};