/*********************************************************************
*	Definice objektů barev
*	HEADER FILE
*	Autor:	Michal Jirouš
*	Datum: 30.6.2008
*	Soubor:	colors.h
*	Popis:	Obsahuje několik objektů, které uchovávajíj jednotlivé 
*			složky barev objekty se liší počtem barev 3 nebo 4 a typem 
*			datového typu, který je ukládá float nebo int.
*			V případě datového typu FLOAT se hodnoty zadávají v rozmezí 0-1
*			a v případě typu INT je to hodnota 0-255
**********************************************************************/

#ifndef	__COLORS_H__
#define __COLORS_H__


/* RGB a datový typ FLOAT */
struct Color3F
{
	float values[3];	//RGB
	Color3F()
	{
		values[0] = 0;
		values[1] = 0;
		values[2] = 0;
	}
	Color3F( GLfloat r, GLfloat g, GLfloat b )
	{
		values[0] = r;
		values[1] = g;
		values[2] = b;
	}
	
};

/* RGB a datový typ INT */
struct Color3I
{
	float values[3];	//RGB
	Color3I()
	{
		values[0] = 0;
		values[1] = 0;
		values[2] = 0;
	}
	Color3I( GLuint r, GLuint g, GLuint b )
	{
		values[0] = (GLfloat)r / 255.0f;
		values[1] = (GLfloat)g / 255.0f;
		values[2] = (GLfloat)b / 255.0f;
	}
};

/* RGBA a datový typ FLOAT */
struct Color4F
{
	float values[4];	//RGBA
	Color4F()
	{
		values[0] = 0;
		values[1] = 0;
		values[2] = 0;
		values[3] = 0;
	}
	Color4F( GLfloat r, GLfloat g, GLfloat b, GLfloat a )
	{
		values[0] = r;
		values[1] = g;
		values[2] = b;
		values[3] = a;
	}
};

/* RGBA a datový typ INT */
struct Color4I
{
	float values[4];	//RGBA
	Color4I()
	{
		values[0] = 0;
		values[1] = 0;
		values[2] = 0;
		values[3] = 0;
	}
	Color4I( GLuint r, GLuint g, GLuint b, GLuint a )
	{
		values[0] = (GLfloat)r / 255.0f;
		values[1] = (GLfloat)g / 255.0f;
		values[2] = (GLfloat)b / 255.0f;
		values[3] = (GLfloat)a / 255.0f;
	}
};

template <typename T>
void colorStringToField4( const char* str, T* field )
{
	size_t length = strlen(str);
	size_t pos = 0;

	T value = 0;
	for( size_t i = 0; i < length && pos < 4; i++ )
	{
		if( str[i] == ' ' )
		{
			field[pos] = static_cast<T>( value );
			value = 0;
			++pos;
		}
		else
			value = value * 10 + ( str[i] - '0');
	}
	if( pos == 3 )
		field[pos] = static_cast<T>( value );
}



#endif
