#include "orcgshaderfractal_shader.h"
#include <math.h>
#define ORCGSHADER__CLASS ORCGSHADER__CLASSNAME
#define ORCGSHADER__DESC "OR - Fractal CgShader"
ORCGSHADER__CLASS,
ORCGSHADER__DESCSTR,
ORCGSHADER__DESC,
bool ORCgShaderFractal::FBCreate()
{
mRenderFrameId = 0;
mScaling = SCALE_MAX;
mTransX = -0.401f;
mTransY = -0.30925f;
if( cgGLIsProfileSupported(CG_PROFILE_FP30) ) mProfile = CG_PROFILE_FP30;
else
{
ShowError("Vertex programming extension (GL_NV_fragment_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\\cgshaderfractal\\Mandelbrot.cg";
mProgram = cgCreateProgramFromFile(mContext, CG_SOURCE, (
char*)lCgFile, mProfile,
NULL,
NULL);
if( mProgram ) cgGLLoadProgram(mProgram);
else ShowError();
return true;
}
return false;
}
void ORCgShaderFractal::FBDestroy()
{
}
bool ORCgShaderFractal::ShaderNeedBeginRender()
{
return true;
}
void ORCgShaderFractal::ShaderBeginRender( FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo )
{
int lRenderFrameId = pRenderOptions->GetRenderFrameId();
if( mRenderFrameId == 0 || mRenderFrameId != lRenderFrameId ) {
mRenderFrameId = lRenderFrameId;
}
}
void ORCgShaderFractal::ShadeModel( FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo,
FBRenderingPass pPass )
{
if( pShaderModelInfo !=
NULL )
{
cgGLBindProgram(mProgram);
cgGLEnableProfile(mProfile);
DrawGeometry(pShaderModelInfo);
cgGLDisableProfile(mProfile);
}
}
void ORCgShaderFractal::DrawGeometry( FBShaderModelInfo* pShaderModelInfo )
{
FBModel* lModel = pShaderModelInfo->GetFBModel();
FBModelVertexData* lModelVertexData = lModel->ModelVertexData;
const int lVertexCount = lModelVertexData->GetVertexCount();
FBArrayTemplate<FBUV> lUVArray; lUVArray.SetCount(lVertexCount);
for(
int i = 0, TexCoordIndex = 0;
i < lVertexCount; ++
i)
{
switch( TexCoordIndex )
{
case 0: lUVArray.SetAt(
i,
FBUV(mTransX + mScaling, mTransY - mScaling));
break;
case 1: lUVArray.SetAt(
i,
FBUV(mTransX - mScaling, mTransY - mScaling));
break;
case 2: lUVArray.SetAt(
i,
FBUV(mTransX - mScaling, mTransY + mScaling));
break;
case 3: lUVArray.SetAt(
i,
FBUV(mTransX + mScaling, mTransY + mScaling));
break;
}
TexCoordIndex++;
if( TexCoordIndex >= 4 ) TexCoordIndex = 0;
}
lModelVertexData->EnableOGLVertexData();
glTexCoordPointer( 2, GL_FLOAT, 0, lUVArray.GetArray());
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
const int lSubRegionCount = lModelVertexData->GetSubRegionCount();
for (
int i = 0;
i < lSubRegionCount; ++
i)
lModelVertexData->DrawSubRegion(
i);
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
lModelVertexData->DisableOGLVertexData();
mScaling *= 0.99f;
if( mScaling < SCALE_MIN ) mScaling = SCALE_MAX;
}
void ORCgShaderFractal::ShowError(const char* pText)
{
const char* lErrStr = ( pText ) ? pText : cgGetErrorString(cgGetError());
}