
#include "stdafx.h"
#include "bmp.h"

void MLoadBmp(TCHAR name[STRING]);
AUX_RGBImageRec *LoadB(char *Filename);
void readstr(FILE *f,char *string);
unsigned char *pole;

//////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////

AUX_RGBImageRec *TextureImage[1];	

TVel MBMP::GetVel( TCHAR name[STRING] )
{
	TVel ret = {0, 0};
	//AUX_RGBImageRec *TextureImage[1];		
	memset(TextureImage,0,sizeof(void *)*1);
	if (TextureImage[0]=LoadB( name ))
	{
		ret.width = TextureImage[0]->sizeX;
		ret.height = TextureImage[0]->sizeY;
	}else
	{
		// errors
		// Error
		char string[255];
		sprintf( string, "Soubor %s nenalezen", name );
		cError.ErrorMsg( 1, true, true, "Error - nemuze najit soubor", string );
	}
	return ret;
}


TVel MBMP::LoadData(TCHAR name[STRING], TRGBi barva, unsigned char *data)
{
	GLuint textura;
	TVel ret;

	bool Status=FALSE;									// indikuje chyby
	//AUX_RGBImageRec *TextureImage[1];					// ukládá bitmapu
	//memset(TextureImage,0,sizeof(void *)*1);           	// Set The Pointer To NULL

	// nacteni bitmapi
	if (TextureImage[0])
	{ 
		Status=TRUE;			// vše v pořádku

		// LINEAR
		//glGenTextures(1, &textura);		// vytvoření textury

		// PRIDANI ALPHY
		int width = TextureImage[0]->sizeX;
		int height = TextureImage[0]->sizeY;
		int barev = 4;
		
		unsigned char *TexturaPole;
		TexturaPole = TextureImage[0]->data;

		int i=0;
		int cit=0;
		//data = new unsigned char[width*height*barev];
		while(i < width*height*barev)
		{
			data[i+3] = 255;	//alpha nepruhledna
			if(TexturaPole[i-cit] == barva.r && TexturaPole[i+1-cit] == barva.g && TexturaPole[i+2-cit] == barva.b)
			{
				data[i+3] = 0;	//alpha pruhledna
			}
			data[i] = TexturaPole[i-cit];
			data[i+1] = TexturaPole[i+1-cit];
			data[i+2] = TexturaPole[i+2-cit];
			i+=4;
			cit++;
		}
		ret.width = TextureImage[0]->sizeX;
		ret.height = TextureImage[0]->sizeY;
		/*glBindTexture(GL_TEXTURE_2D, textura);						// vytvaří texturu z bitmapi
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, 4, TextureImage[0]->sizeX, TextureImage[0]->sizeY,
		0, GL_RGBA, GL_UNSIGNED_BYTE, pole);*/		
	}
	if (TextureImage[0])									// pokud obrázek existuje
	{
		if (TextureImage[0]->data)							// pokud existují data textury
		{
			free(TextureImage[0]->data);					// uvolnit pamet obrazku
		}

		free(TextureImage[0]);								// uvolnit strukturu obrázku
	}
	//if(!Status) MessageBox(0,"Nemohu nacist systemovou texturu","ERROR",MB_ICONERROR); 
	TextureImage[0] = NULL;
	return ret;
}

// --------------------------------------------------
// LOAD TEXTURE TO UINT -
// --------------------------------------------------
GLuint MBMP::LoadTextureToUintRGBA(TCHAR name[STRING],TRGBi barva)
{
	GLuint textura;

	bool Status=FALSE;									// indikuje chyby
	AUX_RGBImageRec *TextureImage[1];					// ukládá bitmapu
	memset(TextureImage,0,sizeof(void *)*1);           	// Set The Pointer To NULL

	// nacteni bitmapi
	if (TextureImage[0]=LoadB(name))
	{ 
		Status=TRUE;			// vše v pořádku

		// LINEAR
		glGenTextures(1, &textura);		// vytvoření textury

		// PRIDANI ALPHY
		int width = TextureImage[0]->sizeX;
		int height = TextureImage[0]->sizeY;
		int barev = 4;
		
		unsigned char *TexturaPole;
		TexturaPole = TextureImage[0]->data;

		int i=0;
		int cit=0;
		pole = new unsigned char[width*height*barev];
		while(i < width*height*barev)
		{
			pole[i+3] = 255;	//alpha nepruhledna
			if(TexturaPole[i-cit] == barva.r && TexturaPole[i+1-cit] == barva.g && TexturaPole[i+2-cit] == barva.b)
			{
				pole[i+3] = 0;	//alpha pruhledna
			}
			pole[i] = TexturaPole[i-cit];
			pole[i+1] = TexturaPole[i+1-cit];
			pole[i+2] = TexturaPole[i+2-cit];
			i+=4;
			cit++;
		}

		glBindTexture(GL_TEXTURE_2D, textura);						// vytvaří texturu z bitmapi
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, 4, TextureImage[0]->sizeX, TextureImage[0]->sizeY,
		0, GL_RGBA, GL_UNSIGNED_BYTE, pole);		
	}
	
	if (TextureImage[0])									// pokud obrázek existuje
	{
		if (TextureImage[0]->data)							// pokud existují data textury
		{
			free(TextureImage[0]->data);					// uvolnit pamet obrazku
		}

		free(TextureImage[0]);								// uvolnit strukturu obrázku
	}
	pole = NULL;
	delete [] pole;	
	if(!Status) MessageBox(0,"Nemohu nacist systemovou texturu","ERROR",MB_ICONERROR); 
	return textura; 
}

// --------------------------------------------------
// LOAD TEXTURE TO UINT -
// --------------------------------------------------
GLuint MBMP::LoadTextureToUint(TCHAR name[STRING])
{
	GLuint textura;

	bool Status=FALSE;									// indikuje chyby
	AUX_RGBImageRec *TextureImage[1];					// ukládá bitmapu
	memset(TextureImage,0,sizeof(void *)*1);           	// Set The Pointer To NULL

	// nacteni bitmapi
	if (TextureImage[0]=LoadB(name))
	{ 
		Status=TRUE;												// vše v pořádku

		// LINEAR
		glGenTextures(1, &textura);									// vytvoření textury

		glBindTexture(GL_TEXTURE_2D, textura);						// vytvaří texturu z bitmapi
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY,
		0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

	}
	
	if (TextureImage[0])									// pokud obrázek existuje
	{
		if (TextureImage[0]->data)							// pokud existují data textury
		{
			free(TextureImage[0]->data);					// uvolnit pamet obrazku
		}

		free(TextureImage[0]);								// uvolnit strukturu obrázku
	}
	if(!Status) MessageBox(0,"Nemohu nacist systemovou texturu","ERROR",MB_ICONERROR); 
	return textura; 
}

// --------------------------------------------------
// READSTR -
// --------------------------------------------------
void readstrBMP(FILE *f,char *string)
{
	do
	{
		fgets(string, 255, f);
	} while ((string[0] == '/') || (string[0] == '\n'));
	return;
}

// --------------------------------------------------
// MBMPconstruktor -
// --------------------------------------------------
MBMP::MBMP()
{
	MBMP::PocetBitmap = 0;
}

MBMP::~MBMP()
{
	//delete pole;
}

// --------------------------------------------------
// LOADFILEBITMAP -
// --------------------------------------------------
bool MBMP::LoadFileBimap(TCHAR name[STRING])
{
	FILE* soubor=NULL;								// vytvorim promnenou pro nacteni
	TCHAR oneline[STRING];							// promnana pro ukladani
	soubor = fopen(name, "rt");				// otevru soubor pro cteni
	int PocetRadku=0;
	MBMP::PocetBitmap = 0;

	if (soubor == 0) return FALSE;
	readstrBMP(soubor,oneline);
	sscanf(oneline, "%d\n", &PocetRadku);

	for(int i=0;i < PocetRadku;i++)
		{	
			readstrBMP(soubor,oneline);
			int DelkaTextu = strlen(oneline);
			oneline[DelkaTextu-1] = oneline[DelkaTextu];
			MBMP::MLoadBmp(oneline);
		}
	
	fclose(soubor);
	return TRUE;
}

// --------------------------------------------------
// -----------------MLOADBMP-------------------------
// --------------------------------------------------

bool MBMP::MLoadBmp(TCHAR name[STRING])
{
	bool Status=FALSE;									// indikuje chyby
	AUX_RGBImageRec *TextureImage[1];					// ukládá bitmapu
	memset(TextureImage,0,sizeof(void *)*1);           	// Set The Pointer To NULL

	// nacteni bitmapi
	if (TextureImage[0]=LoadB(name))
	{ 
		Status=TRUE;												// vše v pořádku
		// LINEAR
		glGenTextures(1, &MBMP::texture[MBMP::PocetBitmap][0]);					// vytvoření textury

		glBindTexture(GL_TEXTURE_2D, MBMP::texture[MBMP::PocetBitmap][0]);		// vytvaří texturu z bitmapi
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

		glGenTextures(1, &MBMP::texture[MBMP::PocetBitmap][1]);	
		glBindTexture(GL_TEXTURE_2D, MBMP::texture[MBMP::PocetBitmap][1]);		// vytvaří texturu z bitmapi
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);



	}
	
	if (TextureImage[0])									// pokud obrázek existuje
	{
		if (TextureImage[0]->data)							// pokud existují data textury
		{
			free(TextureImage[0]->data);					// uvolnit pamet obrazku
		}

		free(TextureImage[0]);								// uvolnit strukturu obrázku
	}
	MBMP::PocetBitmap++;											//inkrementace citace
	return Status;											// vse probehlo v poradku
}

// --------------------------------------------------
// -----------------LOADBMP--------------------------
// --------------------------------------------------
AUX_RGBImageRec *LoadB(char *Filename)				// nahraje bitmapu
{
	FILE *File=NULL;									// ukazatel na soubor

	if (!Filename)										// byla prdana cesta na soubor?
	{
		return NULL;									// pokud ne konec
	}

	File=fopen(Filename,"r");							// otvření pro čtení

	if (File)											// existuje soubor
	{
		fclose(File);									// zavre soubor
		return auxDIBImageLoad(Filename);				// nacte bmp a vrati na ni ukazatel
	}
	
	//MError("Program nemůže načíst bitmapu",true);		// zobrazeni chyby a ukonceni programu*/
	MessageBox(0,"Program nemuze nacist Bitmapu","ERROR",MB_ICONERROR);
	return NULL;										// pri chybě vrátíme ukazatel
}

// --------------------------------------------------
// -----------------LOADBMP--------------------------
// --------------------------------------------------
GLuint MBMP::TextureBack(int pt,int filtr)
{

	return MBMP::texture[pt][filtr]; 
}