#ifndef ORSDK_DLL
#define ORSDK_DLL K_DLLEXPORT
#endif
#include "orshaderscreen_shader.h"
#define ORSHADERSCREEN__CLASS ORSHADERSCREEN__CLASSNAME
#define ORSHADERSCREEN__DESC "OR - Shader Screen Description"
ORSHADERSCREEN__CLASS,
ORSHADERSCREEN__DESCSTR,
ORSHADERSCREEN__DESC,
const char* ORShaderScreen::ColorOpNames[eColorOpCount] = { "Multiply", "Add", "Average", "Subtract 1-2", "Subtract 2-1", "Color1", "Color2" };
bool ORShaderScreen::FBCreate()
{
double lInitColor1[3] = {1.0, 1.0, 1.0};
double lInitColor2[3] = {0.0, 0.0, 0.0};
double lInitIntensity[1]= {70.0};
Animatable = true;
mColorOp = eColor1;
return true;
}
void ORShaderScreen::FBDestroy()
{
}
FBShaderModelInfo* ORShaderScreen::NewShaderModelInfo(
HKModelRenderInfo pModelRenderInfo,
int pSubRegionIndex)
{
FBShaderModelInfo* lShaderModelInfo = ParentClass::NewShaderModelInfo(pModelRenderInfo, pSubRegionIndex);
FBModel* lModel = lShaderModelInfo->GetFBModel();
if (lModel->IsDeformable)
{
FBModelVertexData* lModelVertexData = lModel->ModelVertexData;
lModelVertexData->VertexArrayMappingRequest();
}
return lShaderModelInfo;
}
void ORShaderScreen::DestroyShaderModelInfo( FBRenderOptions* pOptions, FBShaderModelInfo* pInfo )
{
FBModel* lModel = pInfo->GetFBModel();
if (lModel->IsDeformable)
{
FBModelVertexData* lModelVertexData = lModel->ModelVertexData;
lModelVertexData->VertexArrayMappingRelease();
}
ParentClass::DestroyShaderModelInfo(pOptions, pInfo);
}
void ORShaderScreen::ShadeModel( FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo,
FBRenderingPass pPass )
{
if( pShaderModelInfo !=
NULL )
{
FBColorAndAlpha lEffColor;
FBModel* lModel = pShaderModelInfo->GetFBModel();
FBModelVertexData* lModelVertexData = lModel->ModelVertexData;
FBRenderer* lRenderer = mSystem.Renderer;
FBModel* lModelCam = lRenderer->CurrentCamera;
FBCamera* lCamera = (FBCamera*) lModelCam;
FBMatrix lProjectionMatrix;
FBMatrix lModelViewMatrix;
FBMatrix lModelMatrix;
lModel->GetMatrix(lModelMatrix);
const int lSubPatchCount = lModelVertexData->GetSubPatchCount();
int* lIndexes = lModelVertexData->GetIndexArray();
FBMatrix lLocalToScreenMatrix;
FBMatrixMult( lLocalToScreenMatrix, lModelViewMatrix, lModelMatrix );
FBMatrixMult( lLocalToScreenMatrix, lProjectionMatrix, lLocalToScreenMatrix );
glMatrixMode( GL_TEXTURE );
glLoadIdentity();
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
{
glLoadIdentity();
glMatrixMode( GL_PROJECTION );
glPushMatrix();
{
glLoadIdentity();
glBlendFunc( GL_SRC_ALPHA, GL_ONE );
glEnable( GL_BLEND );
for(int lSubPatchIdx = 0; lSubPatchIdx < lSubPatchCount; ++lSubPatchIdx)
{
continue;
glBegin(GL_TRIANGLES);
const int lSubPatchIndexOffset = lModelVertexData->GetSubPatchIndexOffset(lSubPatchIdx);
const int lSubPatchIndexEnd = lSubPatchIndexOffset + lModelVertexData->GetSubPatchIndexSize(lSubPatchIdx);
for(int lVerIdx =lSubPatchIndexOffset; lVerIdx<lSubPatchIndexEnd; lVerIdx++)
{
FBVertexMatrixMult( lScreenPosition, lLocalToScreenMatrix, lVertices[lIndexes[lVerIdx]] );
lEffColor[0] = 1.0;
lEffColor[1] = 1.0;
lEffColor[2] = 1.0;
lEffColor[3] = 0.25;
FBColor lColor1 = mColor1;
FBColor lColor2 = mColor2;
for( i=0; i<3; i++ )
{
switch( mColorOp )
{
case eMultiply: lEffColor[
i] = lColor1[
i]*lColor2[
i];
break;
case eAdd: lEffColor[
i] = lColor1[
i]+lColor2[
i];
break;
case eAverage: lEffColor[
i] = (lColor1[
i]+lColor2[
i])*0.5;
break;
case eSubtract1: lEffColor[
i] = lColor1[
i]-lColor2[
i];
break;
case eSubtract2: lEffColor[
i] = lColor2[
i]-lColor1[
i];
break;
case eColor1: lEffColor[
i] = lColor1[
i];
break;
case eColor2: lEffColor[
i] = lColor2[
i];
break;
}
}
for( i=0; i<3; i++ )
{
if( lEffColor[i] > 1.0 )
{
}
else if( lEffColor[i] < 0.0 )
{
}
}
double lIntensity = mIntensity;
lEffColor[0] *= lIntensity * 0.01;
lEffColor[1] *= lIntensity * 0.01;
lEffColor[2] *= lIntensity * 0.01;
glColor4dv ( (double*) lEffColor );
glVertex3fv ( (float*) lScreenPosition.mValue );
const float lXDimension = 0.08f;
const float lYDimension = lXDimension * 3.0f;
const float lYPosition = lScreenPosition[1] - lYDimension;
glColor4d( lEffColor[0], lEffColor[1], lEffColor[2], 0.0 );
glVertex3f( lScreenPosition[0]-lXDimension, lYPosition, lScreenPosition[2] );
glVertex3f( lScreenPosition[0]+lXDimension, lYPosition, lScreenPosition[2] );
}
glEnd();
}
glDisable( GL_BLEND );
glDisable( GL_TEXTURE_2D );
}
glPopMatrix();
}
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
}
}
bool ORShaderScreen::FbxStore( FBFbxObject* pFbxObject )
{
pFbxObject->FieldWriteBegin("ColorOp");
{
pFbxObject->FieldWriteI( (int)mColorOp );
}
pFbxObject->FieldWriteEnd();
return true;
}
bool ORShaderScreen::FbxRetrieve( FBFbxObject* pFbxObject, FBRenderer* pRenderer )
{
if( pFbxObject->FieldReadBegin("ColorOp") )
{
mColorOp = (ORColorOp)pFbxObject->FieldReadI();
pFbxObject->FieldReadEnd();
}
return true;
}