#ifndef ORSDK_DLL
#define ORSDK_DLL K_DLLEXPORT
#endif
#include "orcgshader_shader.h"
#include <math.h>
#define ORCGSHADER__CLASS ORCGSHADER__CLASSNAME
#define ORCGSHADER__DESC "OR - Simple CgShader"
ORCGSHADER__CLASS,
ORCGSHADER__DESCSTR,
ORCGSHADER__DESC,
bool ORCgShader::FBCreate()
{
mRenderFrameId = 0;
if( cgGLIsProfileSupported(CG_PROFILE_ARBVP1) ) mProfile = CG_PROFILE_ARBVP1;
else if( cgGLIsProfileSupported(CG_PROFILE_VP20) ) mProfile = CG_PROFILE_VP20;
else
{
ShowError("Vertex programming extensions (GL_ARB_vertex_program or GL_NV_vertex_program) not supported");
return false;
}
mContext = cgCreateContext();
if( mContext )
{
FBProgress Progress;
Progress.Caption = "Loading Cg Shader...";
FBSystem lSystem;
FBString lCgFile( lSystem.ApplicationPath );
lCgFile += "\\..\\..\\OpenRealitySDK\\Samples\\shaders\\cgshader\\Simple.cg";
mProgram = cgCreateProgramFromFile(mContext, CG_SOURCE, (
char*)lCgFile, mProfile,
NULL,
NULL);
if( mProgram ) cgGLLoadProgram(mProgram);
else
{
ShowError();
return false;
}
mParamLight = cgGetNamedParameter(mProgram, "LightVec");
mParamModelViewProj = cgGetNamedParameter(mProgram, "ModelViewProj");
mParamModelViewIT = cgGetNamedParameter(mProgram, "ModelViewIT");
if( !mParamLight || !mParamModelViewProj || !mParamModelViewIT )
{
ShowError("Unable to retrieve vertex program parameters.");
return false;
}
}
else return false;
return true;
}
void ORCgShader::FBDestroy()
{
if (mContext)
{
cgDestroyContext(mContext);
}
}
bool ORCgShader::ShaderNeedBeginRender()
{
return true;
}
void ORCgShader::ShaderBeginRender( FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo )
{
int lRenderFrameId = pRenderOptions->GetRenderFrameId();
if( mRenderFrameId == 0 || mRenderFrameId != lRenderFrameId ) {
mRenderFrameId = lRenderFrameId;
}
}
void ORCgShader::ShadeModel( FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo,
FBRenderingPass pPass )
{
if( pShaderModelInfo !=
NULL )
{
cgGLBindProgram(mProgram);
cgGLEnableProfile(mProfile);
cgGLSetParameter4f(mParamLight, 0.0, 0.0, 1.0, 1.0);
cgGLSetStateMatrixParameter(mParamModelViewProj, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
cgGLSetStateMatrixParameter(mParamModelViewIT, CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_INVERSE_TRANSPOSE);
glEnable(GL_LIGHTING);
DrawGeometry(pShaderModelInfo);
glDisable(GL_LIGHTING);
cgGLDisableProfile(mProfile);
}
}
void ORCgShader::DrawGeometry( FBShaderModelInfo* pShaderModelInfo )
{
FBModelVertexData* lModelVertexData = pShaderModelInfo->GetFBModel()->ModelVertexData;
if (lModelVertexData)
{
const int lSubRegionCount = lModelVertexData->GetSubRegionCount();
if (lSubRegionCount)
{
lModelVertexData->EnableOGLVertexData();
for (int lSubRegionIndex = 0; lSubRegionIndex < lSubRegionCount; lSubRegionIndex++)
{
lModelVertexData->DrawSubRegion(lSubRegionIndex);
}
lModelVertexData->DisableOGLVertexData();
}
}
}
void ORCgShader::ShowError(const char* pText)
{
const char* lErrStr = ( pText ) ? pText : cgGetErrorString(cgGetError());
}