#ifndef ORSDK_DLL
#define ORSDK_DLL K_DLLEXPORT
#endif
#include "orcustomrenderer_renderer.h"
#define ORCUSTOMRENDERERCALLBACK__CLASS ORCUSTOMRENDERERCALLBACK__CLASSNAME
#define ORCUSTOMRENDERERCALLBACK__DESC ORCUSTOMRENDERERCALLBACK__DESCSTR
ORCUSTOMRENDERERCALLBACK__CLASSSTR,
ORCUSTOMRENDERERCALLBACK__CLASS,
ORCUSTOMRENDERERCALLBACK__CLASSSTR,
ORCUSTOMRENDERERCALLBACK__DESC,
static void ORCacheSceneGraphSet(
HIObject pMbObject,
bool pValue)
{
ORCustomRendererCallback* pFbObject = FBCast<ORCustomRendererCallback>( pMbObject );
pFbObject->CacheSceneGraphSet(pValue);
}
bool ORCustomRendererCallback::FBCreate()
{
FBSystem::TheOne().Renderer->AdvancedLightingMode = true;
SupportIDBufferPicking = true;
CustomLightingSetting = false;
NoFrustumculling = false;
CustomFrstumCulling = true;
CacheSceneGraph = false;
mAttachCount = 0;
mNeedFullRestructure = true;
return true;
}
void ORCustomRendererCallback::FBDestroy()
{
}
const char* ORCustomRendererCallback::GetCallbackName() const
{
return ORCUSTOMRENDERERCALLBACK__CLASSSTR;
}
const char* ORCustomRendererCallback::GetCallbackDesc() const
{
return ORCUSTOMRENDERERCALLBACK__DESCSTR;
}
unsigned int ORCustomRendererCallback::GetCallbackPrefCount() const
{
return 3;
}
const char* ORCustomRendererCallback::GetCallbackPrefName(unsigned int pIndex) const
{
switch (pIndex)
{
case 0:
return "PointCloud";
case 1:
return "WireFrame";
case 2:
return "Solid";
default:
return "Wrong Pref Index!!!";
}
}
void ORCustomRendererCallback::Attach()
{
FBTrace(
"ORCustomRendererCallback::Attach()\n");
if (mAttachCount == 0)
{
FBEvaluateManager::TheOne().OnSynchronizationEvent .Add(
this, (
FBCallback)&ORCustomRendererCallback::OnPerFrameSynchronizationCallback);
FBEvaluateManager::TheOne().OnEvaluationPipelineEvent.Add(
this, (
FBCallback)&ORCustomRendererCallback::OnPerFrameEvaluationPipelineCallback);
FBEvaluateManager::TheOne().OnRenderingPipelineEvent .Add(
this, (
FBCallback)&ORCustomRendererCallback::OnPerFrameRenderingPipelineCallback);
FBSystem::TheOne().Scene->OnChange.Add (
this, (
FBCallback) &ORCustomRendererCallback::EventSceneChange );
FBSystem::TheOne().OnConnectionNotify.Add(
this, (
FBCallback)&ORCustomRendererCallback::EventConnNotify);
FBSystem::TheOne().OnConnectionStateNotify.Add(
this, (
FBCallback)&ORCustomRendererCallback::EventConnStateNotify);
FBSystem::TheOne().OnConnectionDataNotify.Add(
this, (
FBCallback)&ORCustomRendererCallback::EventConnDataNotify);
}
mAttachCount++;
}
void ORCustomRendererCallback::Detach()
{
FBTrace(
"ORCustomRendererCallback::Detach()\n");
mAttachCount--;
if (mAttachCount == 0)
{
FBEvaluateManager::TheOne().OnSynchronizationEvent .Remove(
this, (
FBCallback)&ORCustomRendererCallback::OnPerFrameSynchronizationCallback);
FBEvaluateManager::TheOne().OnEvaluationPipelineEvent.Remove(
this, (
FBCallback)&ORCustomRendererCallback::OnPerFrameEvaluationPipelineCallback);
FBEvaluateManager::TheOne().OnRenderingPipelineEvent .Remove(
this, (
FBCallback)&ORCustomRendererCallback::OnPerFrameRenderingPipelineCallback);
FBSystem::TheOne().Scene->OnChange.Remove(
this, (
FBCallback) &ORCustomRendererCallback::EventSceneChange );
FBSystem::TheOne().OnConnectionNotify.Remove(
this, (
FBCallback)&ORCustomRendererCallback::EventConnNotify);
FBSystem::TheOne().OnConnectionStateNotify.Remove(
this, (
FBCallback)&ORCustomRendererCallback::EventConnStateNotify);
FBSystem::TheOne().OnConnectionDataNotify.Remove(
this, (
FBCallback)&ORCustomRendererCallback::EventConnDataNotify);
}
}
void ORCustomRendererCallback::DetachDisplayContext(FBViewingOptions* pViewOption)
{
FBTrace(
"ORCustomRendererCallback::DetachDisplayContext()\n");
}
void ORCustomRendererCallback::Render(FBRenderOptions* pRenderOptions)
{
glPushAttrib(GL_ALL_ATTRIB_BITS | GL_CLIENT_ALL_ATTRIB_BITS);
if (CacheSceneGraph)
{
RenderWithCachedInfo(pRenderOptions);
}
else
{
RenderWithSimpleIterating(pRenderOptions);
}
glPopAttrib();
}
void ORCustomRendererCallback::RenderWithSimpleIterating(FBRenderOptions* pRenderOptions)
{
FBRenderer* lRenderer = FBSystem::TheOne().Renderer;
FBCamera* lCamera = lRenderer->CurrentCamera;
FBMatrix lCameraMVPMatrix;
if (pRenderOptions->IsIDBufferRendering() == false)
{
if (CustomLightingSetting)
{
if(pRenderOptions->IsOfflineRendering())
glColor3d(1.0, 0.0, 0.8);
else
glColor3d(0.0, 1.0, 0.8);
glDisable(GL_LIGHTING);
}
else
{
lRenderer->OGLSetupSceneLights(*pRenderOptions);
glEnable(GL_LIGHTING);
}
}
glMatrixMode(GL_MODELVIEW);
switch (pRenderOptions->GetViewerOptions()->RenderCallbackPrefIndex())
{
case 0:
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT );
glPointSize( 3.0 );
break;
case 1:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE );
glLineWidth( 2.0 );
break;
case 2:
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL );
}
int llDisplayGeometryCount = lRenderer->DisplayableGeometryCount;
while(llDisplayGeometryCount--)
{
FBModel* lModel = lRenderer->GetDisplayableGeometry( llDisplayGeometryCount );
FBModelVertexData* lModelVertexData = lModel->ModelVertexData;
if( !lModel->IsVisible() || !lModelVertexData->IsDrawable() )
continue;
FBMatrix lModelTransformMatrix;
if (NoFrustumculling == false)
{
if (CustomFrstumCulling == false)
{
if (lRenderer->IsModelInsideCameraFrustum(lModel, lCamera) == false)
continue;
}
else
{
lModel->GetBoundingBox( lMin, lMax );
FBVector4d lBBoxCenter((lMin[0] + lMax[0]) * 0.5, (lMin[1] + lMax[1]) * 0.5, (lMin[2] + lMax[2]) * 0.5);
if (lBBoxCenter[0] < -1 || lBBoxCenter[1] < -1 || lBBoxCenter[0] >1 || lBBoxCenter[1] > 1)
continue;
}
}
if (pRenderOptions->IsIDBufferRendering())
{
FBColor lUniqueColorId = lModel->UniqueColorId;
glColor3dv(lUniqueColorId);
}
glPushMatrix();
glMultMatrixd(lModelTransformMatrix);
const int lSubRegionCount = lModelVertexData->GetSubRegionCount();
lModelVertexData->PushZDepthClipOverride();
lModelVertexData->EnableOGLVertexData();
for(int lSubRegionIdx = 0; lSubRegionIdx < lSubRegionCount; ++lSubRegionIdx)
{
if (pRenderOptions->IsIDBufferRendering())
{
lModelVertexData->DrawSubRegion(lSubRegionIdx);
}
else
{
if( CustomLightingSetting )
{
lModelVertexData->DrawSubRegion(lSubRegionIdx);
}
else
{
if (lModel->Materials.GetCount() > lSubRegionIdx)
{
FBMaterial* lMaterial = lModel->Materials[lSubRegionIdx];
lMaterial->OGLInit();
if (lDiffuseTex)
{
lDiffuseTex->OGLInit();
lModelVertexData->EnableOGLUVSet(lDiffuseTex->Mapping);
glEnable( GL_TEXTURE_2D );
}
lModelVertexData->DrawSubRegion(lSubRegionIdx);
if (lDiffuseTex)
{
lModelVertexData->DisableOGLUVSet();
glDisable(GL_TEXTURE_2D);
}
}
else
{
lModelVertexData->DrawSubRegion(lSubRegionIdx);
}
}
}
}
lModelVertexData->DisableOGLVertexData();
lModelVertexData->PopZDepthClipOverride();
glPopMatrix();
}
}
void ORCustomRendererCallback::RenderWithCachedInfo(FBRenderOptions* pRenderOptions)
{
if (mNeedFullRestructure)
{
mNeedFullRestructure = false;
CacheSceneFullRestructure();
}
FBRenderer* lRenderer = FBSystem::TheOne().Renderer;
lRenderer->OGLSetupSceneLights(*pRenderOptions);
glEnable(GL_LIGHTING);
_ORModelRenderItemListPerMaterialMap::const_iterator lMaterialIter = mModelRenderItemListPerMaterialMap.cbegin();
glMatrixMode(GL_MODELVIEW);
while (lMaterialIter != mModelRenderItemListPerMaterialMap.cend())
{
FBMaterial* lMaterial = lMaterialIter->first;
_ORModelRenderItemList* lModelRenderItemList = lMaterialIter->second;
lMaterialIter++;
lMaterial->OGLInit();
_ORModelRenderItemList::const_iterator lRenderItemIter = lModelRenderItemList->cbegin();
while (lRenderItemIter != lModelRenderItemList->cend())
{
FBModel* lModel = lRenderItemIter->first;
int lRenderItemIndex = lRenderItemIter->second;
lRenderItemIter++;
FBModelVertexData* lModelVertexData = lModel->ModelVertexData;
FBMatrix lModelTransformMatrix;
glPushMatrix();
glMultMatrixd(lModelTransformMatrix);
lModelVertexData->EnableOGLVertexData();
lModelVertexData->DrawSubRegion(lRenderItemIndex);
lModelVertexData->DisableOGLVertexData();
glPopMatrix();
}
}
}
void ORCustomRendererCallback::CacheSceneGraphSet(bool pValue)
{
CacheSceneGraph.SetPropertyValue(pValue);
CacheSceneReset();
}
void ORCustomRendererCallback::CacheSceneReset()
{
if (! mNeedFullRestructure )
{
mNeedFullRestructure = true;
_ORModelRenderItemListPerMaterialMap::const_iterator lIter = mModelRenderItemListPerMaterialMap.cbegin();
while (lIter != mModelRenderItemListPerMaterialMap.cend())
{
delete lIter->second;
lIter++;
}
mModelRenderItemListPerMaterialMap.clear();
}
}
void ORCustomRendererCallback::CacheSceneFullRestructure()
{
FBRenderer* lRenderer = FBSystem::TheOne().Renderer;
for (int lIndex = 0, lCount = lRenderer->DisplayableGeometryCount; lIndex < lCount; lIndex++)
{
FBModel* lModel = lRenderer->GetDisplayableGeometry(lIndex);
if ( lModel->HasCustomDisplay() ==
false )
{
FBModelVertexData* lModelVertexData = lModel->ModelVertexData;
for (int lRenderItemIndex = 0, lRenderItemCount = lModelVertexData->GetSubRegionCount(); lRenderItemIndex < lRenderItemCount; lRenderItemIndex++ )
{
FBMaterial* lMaterial = lModelVertexData->GetSubRegionMaterial(lRenderItemIndex);
_ORModelRenderItemList* lModelRenderItemList = mModelRenderItemListPerMaterialMap[lMaterial];
if (lModelRenderItemList ==
NULL)
{
lModelRenderItemList = new _ORModelRenderItemList;
mModelRenderItemListPerMaterialMap[lMaterial] = lModelRenderItemList;
}
lModelRenderItemList->push_back(_ORModelRenderItem::pair(lModel , lRenderItemIndex));
}
}
}
}
void ORCustomRendererCallback::EventSceneChange(
HISender pSender,
HKEvent pEvent )
{
if (! CacheSceneGraph)
return;
FBEventSceneChange lEvent( pEvent );
switch( lEvent.Type )
{
{
CacheSceneReset();
}
break;
{
CacheSceneReset();
}
default:
break;
}
}
void ORCustomRendererCallback::EventConnNotify(
HISender pSender,
HKEvent pEvent)
{
if (! CacheSceneGraph || mNeedFullRestructure )
return;
FBEventConnectionNotify lEvent(pEvent);
FBString lText;
char lTmp[32];
FBPlug* lPlug;
static int lCounter = 0;
sprintf( lTmp, "%d", lCounter );
lText += lTmp;
lText += ": Action=";
if (lEvent.SrcPlug)
{
if (lEvent.SrcPlug->Is(FBProperty::TypeInfo))
{
lPlug = lEvent.SrcPlug->GetOwner();
lText += ", Src=";
lText += ((FBComponent*)lPlug)->Name;
lText += ".";
lPlug = lEvent.SrcPlug;
lText += ((FBProperty*)lPlug)->GetName();
lText += "(";
sprintf( lTmp, "%d", (int)lEvent.SrcIndex );
lText += lTmp;
lText += ")";
}
else if (lEvent.SrcPlug->Is(FBComponent::TypeInfo))
{
lPlug = lEvent.SrcPlug;
lText += ", Src=";
lText += ((FBComponent*)lPlug)->Name;
lText += "(";
sprintf( lTmp, "%d", (int)lEvent.SrcIndex );
lText += lTmp;
lText += ")";
}
}
if (lEvent.DstPlug)
{
if (lEvent.DstPlug->Is(FBProperty::TypeInfo))
{
lPlug = lEvent.DstPlug->GetOwner();
lText += ", Dst=";
lText += ((FBComponent*)lPlug)->Name;
lText += ".";
lPlug = lEvent.DstPlug;
lText += ((FBProperty*)lPlug)->GetName();
}
else if (lEvent.DstPlug->Is(FBComponent::TypeInfo))
{
lPlug = lEvent.DstPlug;
lText += ", Dst=";
lText += ((FBComponent*)lPlug)->Name;
}
}
if (lEvent.NewPlug)
{
if (lEvent.NewPlug->Is(FBProperty::TypeInfo))
{
lPlug = lEvent.NewPlug->GetOwner();
lText += ", New=";
lText += ((FBComponent*)lPlug)->Name;
lText += ".";
lPlug = lEvent.NewPlug;
lText += ((FBProperty*)lPlug)->GetName();
}
else if (lEvent.NewPlug->Is(FBComponent::TypeInfo))
{
lPlug = lEvent.NewPlug;
lText += ", New=";
lText += ((FBComponent*)lPlug)->Name;
}
}
lText += ", Type=";
lText += "\n";
}
void ORCustomRendererCallback::EventConnStateNotify(
HISender pSender,
HKEvent pEvent)
{
if (! CacheSceneGraph || mNeedFullRestructure )
return;
FBEventConnectionStateNotify lEvent(pEvent);
FBString lText;
char lTmp[32];
FBPlug* lPlug;
static int lCounter = 0;
sprintf( lTmp, "%d", lCounter );
lText += lTmp;
lText += ": Action=";
if (lEvent.Plug)
{
if (lEvent.Plug->Is(FBProperty::TypeInfo))
{
lPlug = lEvent.Plug->GetOwner();
lText += ", Plug=";
lText += ((FBComponent*)lPlug)->Name;
lText += ".";
lPlug = lEvent.Plug;
lText += ((FBProperty*)lPlug)->GetName();
}
else if (lEvent.Plug->Is(FBComponent::TypeInfo))
{
lPlug = lEvent.Plug;
lText += ", Plug=";
lText += ((FBComponent*)lPlug)->Name;
}
}
lText += ", Data=";
sprintf(lTmp, "0x%lX", lEvent.GetData());
lText += lTmp;
lText += ", OldData=";
sprintf(lTmp, "0x%lX", lEvent.GetOldData());
lText += lTmp;
}
void ORCustomRendererCallback::EventConnDataNotify(
HISender pSender,
HKEvent pEvent)
{
if (! CacheSceneGraph || mNeedFullRestructure )
return;
FBEventConnectionDataNotify lEvent(pEvent);
FBString lText;
char lTmp[32];
FBPlug* lPlug;
static int lCounter = 0;
sprintf( lTmp, "%d", lCounter );
lText += lTmp;
lText += ": Action=";
if( lEvent.Plug )
{
if (lEvent.Plug->Is(FBProperty::TypeInfo))
{
lPlug = lEvent.Plug->GetOwner();
lText += ", Plug=";
lText += ((FBComponent*)lPlug)->Name;
lText += ".";
lPlug = lEvent.Plug;
lText += ((FBProperty*)lPlug)->GetName();
}
else if (lEvent.Plug->Is(FBComponent::TypeInfo))
{
lPlug = lEvent.Plug;
lText += ", Plug=";
lText += ((FBComponent*)lPlug)->Name;
}
}
lText += ", Data=";
sprintf(lTmp, "0x%lX", lEvent.GetData());
lText += lTmp;
lText += ", OldData=";
sprintf(lTmp, "0x%lX", lEvent.GetOldData());
lText += lTmp;
}
void ORCustomRendererCallback::OnPerFrameSynchronizationCallback(
HISender pSender,
HKEvent pEvent)
{
FBEventEvalGlobalCallback lFBEvent(pEvent);
{
}
}
void ORCustomRendererCallback::OnPerFrameRenderingPipelineCallback(
HISender pSender,
HKEvent pEvent)
{
FBEventEvalGlobalCallback lFBEvent(pEvent);
switch(lFBEvent.GetTiming())
{
break;
break;
default:
break;
}
}
void ORCustomRendererCallback::OnPerFrameEvaluationPipelineCallback(
HISender pSender,
HKEvent pEvent)
{
FBEventEvalGlobalCallback lFBEvent(pEvent);
FBEvaluateInfo* lFBEvalInfo = lFBEvent.GetEvaluateInfo();
switch(lFBEvent.GetTiming())
{
break;
break;
break;
{
FBTime lLocalTime = lFBEvalInfo->GetLocalTime();
FBTime lSystemTime = lFBEvalInfo->GetSystemTime();
int lEvalID = lFBEvalInfo->GetEvaluationID();
lEvalID = lEvalID;
}
break;
{
FBTime lLocalTime = lFBEvalInfo->GetLocalTime();
FBTime lSystemTime = lFBEvalInfo->GetSystemTime();
int lEvalID = lFBEvalInfo->GetEvaluationID();
lEvalID = lEvalID;
}
break;
default:
break;
}
}