www.pudn.com > simpleraytracer_v1_0.zip > colour.h


/*=====================================================================
Code By Nicholas Chapman.

nickamy@paradise.net.nz

You may use this code for any non-commercial project,
as long as you do not remove this description.

You may *not* use this code for any commercial project.
=====================================================================*/
#ifndef __COLOUR_H__
#define __COLOUR_H__

//#include "../utils/random.h"

//namespace RayT
//{

class Colour
{
public:
Colour(){}

Colour(float r_, float g_, float b_)
: r(r_), g(g_), b(b_)
{}

Colour(const Colour&amt; rhs)
: r(rhs.r),
g(rhs.g),
b(rhs.b)
{}

~Colour(){}

static Colour red() { return Colour(1.0f ,0.0f ,0.0f); }
static Colour green() { return Colour(0.0f ,1.0f ,0.0f); }
static Colour blue() { return Colour(0.0f ,0.0f ,1.0f); }
static Colour grey() { return Colour(0.5f ,0.5f ,0.5f); }
static Colour yellow() { return Colour(0.0f ,1.0f ,1.0f); }

inline void set(float r_, float g_, float b_)
{
r = r_;
g = g_;
b = b_;
}

inline Colour operator * (float scale) const
{
return Colour(r * scale, g * scale, b * scale);
}

inline Colour&amt; operator *= (float scale)
{
r *= scale;
g *= scale;
b *= scale;

return *this;
}

inline Colour operator + (const Colour&amt; rhs) const
{
return Colour(r + rhs.r, g + rhs.g, b + rhs.b);
}

inline void operator = (const Colour&amt; rhs)
{
r = rhs.r;
g = rhs.g;
b = rhs.b;
}

inline void operator += (const Colour&amt; rhs)
{
r += rhs.r;
g += rhs.g;
b += rhs.b;
}

inline Colour&amt; operator *= (const Colour&amt; rhs)
{
r *= rhs.r;
g *= rhs.g;
b *= rhs.b;

return *this;
}

inline const Colour operator * (const Colour&amt; rhs) const
{
return Colour(r * rhs.r, g * rhs.g, b * rhs.b);
}

inline void setToMult(const Colour&amt; other, float factor)
{
r = other.r * factor;
g = other.g * factor;
b = other.b * factor;
}

inline void addMult(const Colour&amt; other, float factor)
{
r += other.r * factor;
g += other.g * factor;
b += other.b * factor;
}

inline void add(const Colour&amt; other)
{
r += other.r;
g += other.g;
b += other.b;
}

inline clipComponents()
{
if(r < 0.0f)
r = 0.0f;
else if(r > 1.0f)
r = 1.0f;

if(g < 0.0f)
g = 0.0f;
else if(g > 1.0f)
g = 1.0f;

if(b < 0.0f)
b = 0.0f;
else if(b > 1.0f)
b = 1.0f;
}

inline positiveClipComponents()
{
if(r > 1.0f)
r = 1.0f;

if(g > 1.0f)
g = 1.0f;

if(b > 1.0f)
b = 1.0f;
}

/*static inline const Colour randomColour()
{
return Colour(Random::unit(), Random::unit(), Random::unit());
}*/

const float* toFloatArray() const { return (const float*)this; }
const float* data() const { return (const float*)this; }


float r,g,b;
};



//}//end namespace RayT

#endif //__COLOUR_H__