mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-18 14:23:56 -07:00
106 lines
2.4 KiB
C++
Executable file
106 lines
2.4 KiB
C++
Executable file
#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
|