0ad/source/renderer/VertexProgram.cpp

107 lines
2.4 KiB
C++
Raw Normal View History

#include "precompiled.h"
#include "res/vfs.h"
#include "res/mem.h"
#include "renderer/VertexProgram.h"
#include "graphics/ProgramManager.h"
#include "CLogger.h"
#define LOG_CATEGORY "shaders"
CVertexProgram::CVertexProgram(const char *file)
{
Load(file);
}
CVertexProgram::~CVertexProgram()
{
#ifdef BUILD_CG
if(m_Program)
cgDestroyProgram(m_Program);
#endif
}
bool CVertexProgram::IsValid()
{
#ifdef BUILD_CG
return (m_Program != NULL);
#else
return false;
#endif
}
void CVertexProgram::Bind()
{
#ifdef BUILD_CG
if(!IsValid())
return;
CGparameter param = cgGetFirstParameter(m_Program, CG_PROGRAM);
while(param)
{
PushParameter(param);
param = cgGetNextParameter(param);
}
if(!cgGLIsProgramLoaded(m_Program))
cgGLLoadProgram(m_Program);
cgGLBindProgram(m_Program);
#endif
}
void CVertexProgram::Load(const char *file)
{
#ifdef BUILD_CG
m_Program = NULL;
if(!file || !vfs_exists(file))
return;
void *data;
size_t size;
Handle h = vfs_load(file, data, size, 0);
if(h <= 0)
{
LOG(ERROR, LOG_CATEGORY, "CVertexShader::LoadShader: vfs_load for %s failed!\n", file);
return;
}
std::string src = (char*)data;
mem_free_h(h);
m_Program = cgCreateProgram(
g_ProgramManager.GetContext(),
CG_SOURCE,
src.c_str(),
CG_PROFILE_ARBVP1,
"main",
NULL
);
if(!m_Program)
{
LOG(ERROR, LOG_CATEGORY, "CVertexShader::LoadShader: Could not compile Cg shader: %s", cgGetErrorString(cgGetError()));
return;
}
#endif
}
#ifdef BUILD_CG
void CVertexProgram::PushParameter(CGparameter param)
{
assert(param);
std::string name = cgGetParameterName(param);
if(name == "ModelViewProj")
cgGLSetStateMatrixParameter(param, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
else if(name == "ModelView")
cgGLSetStateMatrixParameter(param, CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_IDENTITY);
else if(name == "Projection")
cgGLSetStateMatrixParameter(param, CG_GL_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
else if(name == "Texture")
cgGLSetStateMatrixParameter(param, CG_GL_TEXTURE_MATRIX, CG_GL_MATRIX_IDENTITY);
else
LOG(WARNING, LOG_CATEGORY, "CVertexShader::LoadShader: Unknown parameter name: %s", name.c_str());
}
#endif