// load shaders.
bool COGModelShader::Load (OGShaderID _Id, const std::string& _VertShader, const std::string& _FragmentShader)
{
    if(ShaderLoadFromFile(_FragmentShader.c_str(), GL_FRAGMENT_SHADER, &m_uiFragShader) == 0)
        return false;
    if(ShaderLoadFromFile(_VertShader.c_str(), GL_VERTEX_SHADER, &m_uiVertShader) == 0)
        return false;

    const char* pszAttribs[] = { "inVertex", "inNormal", "inTexCoord" };
    if (CreateProgram(&m_uiId, m_uiVertShader, m_uiFragShader, pszAttribs, 3) == 0)
        return false;

    m_uiMVPMatrixLoc = glGetUniformLocation(m_uiId, "MVPMatrix");
    m_uiMVMatrixLoc = glGetUniformLocation(m_uiId, "MVMatrix");
    m_uiLightDirLoc = glGetUniformLocation(m_uiId, "LightDirection");
    m_uiTextureLoc = glGetUniformLocation(m_uiId, "sTexture");

    m_uiFogEndLoc = glGetUniformLocation(m_uiId, "FogEnd");
    m_uiFogRcpDiffLoc = glGetUniformLocation(m_uiId, "FogRcpEndStartDiff");
    m_uiFogColorLoc = glGetUniformLocation(m_uiId, "FogColor");
    m_uiFogEnabled = glGetUniformLocation(m_uiId, "FogEnabled");

    m_uiMaterialAmbient = glGetUniformLocation(m_uiId, "MaterialAmbient");
    m_uiMaterialDiffuse = glGetUniformLocation(m_uiId, "MaterialDiffuse");

    m_Id = _Id;

    return true;
}
// load shaders.
bool COGShadowTransparentModelShader::Load (OGShaderID _Id, const std::string& _VertShader, const std::string& _FragmentShader)
{
    if(ShaderLoadFromFile(_FragmentShader.c_str(), GL_FRAGMENT_SHADER, &m_uiFragShader) == 0)
        return false;
    if(ShaderLoadFromFile(_VertShader.c_str(), GL_VERTEX_SHADER, &m_uiVertShader) == 0)
        return false;

    const char* pszAttribs[] = { "inVertex", "inNormal", "inTexCoord" };
    if (CreateProgram(&m_uiId, m_uiVertShader, m_uiFragShader, pszAttribs, 3) == 0)
        return false;

    m_uiMVPMatrixLoc = glGetUniformLocation(m_uiId, "MVPMatrix");
    m_uiTextureLoc = glGetUniformLocation(m_uiId, "sTexture");
    m_uiAlphaReference = glGetUniformLocation(m_uiId, "AlphaReference");

    m_Id = _Id;
    m_fAlphaRef = 0.5f;

    return true;
}
ShaderData::ShaderData( const char *vertShaderFilename, const char *fragShaderFilename )
{
	char buffer[2048];
	GetResourcePathASCII(buffer, 2048);
	
	CPVRTResourceFile::SetReadPath(buffer);
	
	/* Gets the Data Path */	
	if(ShaderLoadFromFile("blank",fragShaderFilename, GL_FRAGMENT_SHADER, 0, &uiFragShader) == 0)
		printf("Loading the fragment shader fails:%s", fragShaderFilename);
	if(ShaderLoadFromFile("blank", vertShaderFilename, GL_VERTEX_SHADER, 0, &uiVertShader) == 0)
		printf("Loading the vertex shader fails:%s", vertShaderFilename);
	
	CreateProgram(&uiProgramObject, uiVertShader, uiFragShader, pszAttribs, sizeof(pszAttribs)/sizeof(pszAttribs[0]) );	
	
	// First gets the location of that variable in the shader using its name
	PMVMatrixHandle = glGetUniformLocation(uiProgramObject, "u_ModelViewProjectionMatrix");
	MVMatrixHandle = glGetUniformLocation(uiProgramObject, "u_ModelViewMatrix");
	TIMMatrixHandle = glGetUniformLocation(uiProgramObject, "u_TrasposeInverseModelMatrix");
	ModelMatrixHandle = glGetUniformLocation(uiProgramObject, "u_ModelMatrix");
	ViewMatrixHandle = glGetUniformLocation(uiProgramObject, "u_ViewMatrix");
	
	EyePositionHandle = glGetUniformLocation(uiProgramObject, "myEye");
	LightDirectionHandle = glGetUniformLocation(uiProgramObject, "light_direction");
	LightPositionHandle = glGetUniformLocation(uiProgramObject, "light_position");
	
	AmbientICHandle = glGetUniformLocation(uiProgramObject, "ambient_ic");
	DiffuseICHandle = glGetUniformLocation(uiProgramObject, "diffuse_ic");
	SpecularICHandle = glGetUniformLocation(uiProgramObject, "specular_ic");
	
	MaterialShininessHandle = glGetUniformLocation(uiProgramObject, "material_shininess");
	
	ColorHandle = glGetUniformLocation(uiProgramObject, "u_Color");		
	TextureHandle = glGetUniformLocation(uiProgramObject, "s_texture");			
	NormalMapHandle = glGetUniformLocation(uiProgramObject, "s_normalmap");	
	
	NoiseOffsetHandle= glGetUniformLocation(uiProgramObject, "u_offset");
}