#ifndef ORSDK_DLL
#define ORSDK_DLL K_DLLEXPORT
#endif
#include "orshader_template_shader.h"
#include <math.h>
#define ORSHADER_TEMPLATE__CLASS ORSHADER_TEMPLATE__CLASSNAME
#define ORSHADER_TEMPLATE__DESC "OR - Shader Template Description"
ORSHADER_TEMPLATE__CLASS,
ORSHADER_TEMPLATE__DESCSTR,
ORSHADER_TEMPLATE__DESC,
ORShader_Template::ORShader_Template(FBMaterial *pMaterial):FBShader(pMaterial->
Name)
{
mMaterial = pMaterial;
}
bool ORShader_Template::FBCreate()
{
mRenderFrameId = 0;
return true;
}
void ORShader_Template::FBDestroy()
{
}
bool ORShader_Template::ShaderNeedBeginRender()
{
return true;
}
void ORShader_Template::ShaderBeginRender( FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo )
{
int lRenderFrameId = pRenderOptions->GetRenderFrameId();
if( mRenderFrameId == 0 || mRenderFrameId != lRenderFrameId ) {
mRenderFrameId = lRenderFrameId;
}
}
void ORShader_Template::ShadeModel( FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo,
FBRenderingPass pPass )
{
if( pShaderModelInfo !=
NULL )
{
float lTemp[4];
glEnable( GL_LIGHTING);
lTemp[0] = 0.6f;
lTemp[1] = 0.9f;
lTemp[2] = 0.67f;
lTemp[3] = 1.0f;
glMaterialfv( GL_FRONT, GL_AMBIENT, lTemp );
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();
}
}
glDisable( GL_LIGHTING);
bool lDisplayNormal = pShaderModelInfo->GetFBModel()->IsDeformable == false;
if( lDisplayNormal )
{
FBMesh* lTessellatedMesh = pShaderModelInfo->GetFBModel()->TessellatedMesh;
{
int lPosCount = lTessellatedMesh->VertexCount();
float* lPositionArray = (float*)lTessellatedMesh->GetVertexes();
int lNormalCount = 0;
float* lNormalArray = (float*)lTessellatedMesh->GetNormalsDirectArray(lNormalCount);
assert(lNormalCount == lPosCount);
const float lNormalLentgh = 1.02f;
float lx, ly, lz, lLen;
glDisable( GL_LIGHTING );
glColor3ub( 0, 255, 0 );
glBegin( GL_LINES );
while( lPosCount )
{
glVertex3fv( lPositionArray );
lx = lNormalArray[0];
ly = lNormalArray[1];
lz = lNormalArray[2];
lLen = sqrt( lx*lx + ly*ly + lz*lz ) /lNormalLentgh;
lx /= lLen;
ly /= lLen;
lz /= lLen;
glVertex3f( lPositionArray[0] + ( lx ), lPositionArray[1] + ( ly ), lPositionArray[2] + ( lz ) );
lPositionArray +=4;
lNormalArray +=4;
lPosCount --;
}
glEnd();
}
}
}
}