#ifndef DEF_PRIMITIVES
 #define DEF_PRIMITIVES
//------------------------------------------//
//	TKA4 CEngine and basis Graph classes	//
//				19. 04. 2007				//
//------------------------------------------//


//--- Includes
#include <windows.h>
#include <stdio.h>
#include <math.h>

#include "TX_Engine.h"
//=== Includes 


//--- Pragma 
#pragma warning(disable:4305) 
//=== Pragma 


//---------------------------------------------------------------------


//---  Real Ground  ---//
class txObj_RealGround : public txObject {
public :
	GLuint  tex_number;
	txcBox  box;

	GLfloat fExtent;
	GLfloat fStep;
	GLfloat y;
	
	txObj_RealGround() 
	{ fExtent = 40.0f; fStep = 1.0f;  y = -0.1f; };

	virtual void Execute_Init() {
		tex_number = createTexture2D(true, "../Resources/Images/1.bmp");
		box = txcBox(-fExtent*0.5, 0.5, -fExtent*0.5 , fExtent*0.5, 30.0, fExtent*0.5, inside); 		
		World->Collision.AddTXC(&box);
		
	}

	//--- txObj_Background :: Execute Forward
	virtual void Execute_Forward()
	{
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_INCR);
		glBindTexture(GL_TEXTURE_2D, tex_number);
		glEnable(GL_TEXTURE_2D);
		
		glColor3f(0.60f, .40f, .10f);
		
		//---------------------------
		GLint iStrip, iRun;
		for(iStrip = -fExtent; iStrip <= fExtent; iStrip += fStep) {
			glBegin(GL_TRIANGLE_STRIP);
				glNormal3f(0.0f, 1.0f, 0.0f);   
        		for(iRun = fExtent; iRun >= -fExtent; iRun -= fStep) {
					
					GLfloat y1 = -1-sin((iStrip)/fExtent*3.14) +y;
					GLfloat y2 = -1-sin((iStrip + fStep)/fExtent*3.14) +y;

					glTexCoord2d(0, 1);
					glVertex3f(iStrip, y1, iRun);
				
					glTexCoord2d(iStrip+fStep, iRun);
					glVertex3f(iStrip + fStep, y2, iRun);
				}
			glEnd();
        }
		//---------------------------
		glDisable(GL_TEXTURE_2D);
	}



};



//---  Cube  ---//
class txObj_Cube : public txObject {
public :
	GLuint  tex_number;
	txcSphere  sphere;
	GLUquadric* q;

	GLfloat size, minisize;
		
	txObj_Cube() 
	{ size = 60; minisize=5; q = gluNewQuadric(); };
	
	~txObj_Cube() 
	{ gluDeleteQuadric(q); };

	//--- --- --- ---
	virtual void Execute_Init() {
		tex_number = createTexture2D(true, "../Resources/Images/4.jpg");
		
		sphere = txcSphere(0,0,0,minisize,outside); 		
		World->Collision.AddTXC(&sphere);
	}

	//--- txObj_Background :: Execute Forward
	virtual void Execute_Forward()
	{		
		glDisable(GL_LIGHTING);

		glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, tex_number);
		
		glEnable(GL_TEXTURE_GEN_S);
		glEnable(GL_TEXTURE_GEN_T);

		glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
		glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
		
		//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

		glEnable(GL_BLEND);
		glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
			
		gluQuadricTexture(q, true);
		glPushMatrix();
		//--- big		
		glDisable(GL_FOG);
		gluSphere(q, size, 100, 100);
		glEnable(GL_FOG);
		
		glEnable(GL_CULL_FACE);

		//--- small
		GLfloat tmp =  0.8 ;
		glColor4f(1.0f, 1.0f, 1.0f, tmp);

		glCullFace(GL_FRONT);
		gluSphere(q, minisize, 20, 20);
		
		glCullFace(GL_BACK);
		gluSphere(q, minisize, 20, 20);
	
		glPopMatrix();

		glDisable(GL_CULL_FACE);
		glDisable(GL_BLEND);
		glDisable(GL_TEXTURE_GEN_S);
		glDisable(GL_TEXTURE_GEN_T);
		glDisable(GL_TEXTURE_2D);

		glEnable(GL_LIGHTING);
	}
};




//------------------------- :: Functions :: ---------------------------


#endif



