#pragma once
#include "Model3D.h"

#include <string>

#ifdef __APPLE__
	#include <OpenGL/gl.h>
#else
	#ifdef _WIN32
		#include <windows.h>
	#endif
	#include <GL/gl.h>
#endif

using namespace std;

class OpenGLModel :
	public Model3D
{
public:
	//carga un modelo de ruta "strPath" que luego sera dibujado en OpenGL al llamar a la funcion "process()"
	//bTexturesEnabledByDefault indica si GL_TEXTURE_2D al llamar a "process()" se encuantra habilitado o no,
	//se puede asumir que al terminar "process()" GL_TEXTURE_2D se encuentra en el estado indicado por bTexturesEnabledByDefault.
	//Si bTexturesEnabledByDefault == false entonces no se usaran texturas al dibujar el modelo.
	//bColorMaterialEnabledByDefault idem a bTexturesEnabledByDefault, si esta en false entonces no se habilitara GL_COLOR_MATERIAL
	//al dibujar el modelo
	//bIgnoreTexturePath se utiliza para el cargado de las texturas, en particular como segundo parametro de "GetTextureID(...)"
	//de OpenGLTextureMap
	OpenGLModel(const char* strPath, bool bTexturesEnabledByDefault = true, bool bColorMaterialEnabledByDefault = true, bool bIgnoreTexturePath = false, char* strTextureBasePath = 0);
	virtual ~OpenGLModel(void);

	//devuelve el identificador de un display list de OpenGL que dibuja el modelo en el estado en que se encuentra.
	GLint generateDisplayList();

protected:
	virtual void preProcess();
	virtual void applyTransformation(float* fMatrix4Data);
	virtual void unApplyLastTransformation();
	virtual void processMesh(const struct aiMaterial *pMtl, const struct aiFace* pFaces, unsigned int nNumFaces, aiVector3D* aVertices, aiColor4D* aColorsByVertexIndex, aiVector3D* aNormalsByVertexIndex, aiVector3D* aTextureCoordsByVertexIndex);
	virtual void postProcess();
	virtual void applyMaterial(const struct aiMaterial *mtl);

protected:
	bool bTexturesEnabledByDefault;
	bool bTexturesEnabled;
	bool bColorMaterialEnabledByDefault;
	bool bColorMaterialEnabled;
	bool bIgnoreTexturePath;
	GLuint nActualTexture;
	float cDif[4];
	float cAmb[4];
	float cSpe[4];
	float cEmi[4];
	float oldShi;
	float oldColor[4];
	string strTextureBasePath;
	float fScaleFactor;
	Vector3 oCenterVector;

};
