#include "ortoolpose_tool.h"
#define ORTOOLPOSE__CLASS ORTOOLPOSE__CLASSNAME
#define ORTOOLPOSE__LABEL "Pose"
#define ORTOOLPOSE__DESC "OR - Pose Description"
ORTOOLPOSE__LABEL,
ORTOOLPOSE__DESC,
bool ORToolPose::FBCreate()
{
StartSize[0] = 400;
StartSize[1] = 500;
UICreate ();
UIConfigure ();
return true;
}
void ORToolPose::FBDestroy()
{
}
void ORToolPose::UICreate()
{
int lS = 10;
int lButtonW = 100;
int lButtonH = 18;
Region.X = 300;
Region.Y = 300;
Region.Width = 400;
Region.Height = 500;
AddRegion( "Tree", "Tree",
AddRegion( "ButtonRefresh", "ButtonRefresh",
AddRegion( "ButtonClear", "ButtonClear",
AddRegion( "ButtonGenerate", "ButtonGenerate",
SetControl( "Tree", mTree );
SetControl( "ButtonRefresh", mButtonRefresh );
SetControl( "ButtonClear", mButtonClear );
SetControl( "ButtonGenerate", mButtonGenerate );
}
void ORToolPose::UIConfigure()
{
mButtonRefresh.Caption = "Refresh Pose List";
mButtonRefresh.OnClick.Add(
this, (
FBCallback) &ORToolPose::EventRefresh );
mButtonClear.Caption = "Delete All Poses";
mButtonClear.OnClick.Add(
this, (
FBCallback) &ORToolPose::EventClear );
mButtonGenerate.Caption = "Generate Poses";
mButtonGenerate.OnClick.Add(
this, (
FBCallback) &ORToolPose::EventGenerate );
}
static void CollectModels(FBModel* pParent,
FBModelList &pAllModels)
{
for(
int i = 0;
i < pParent->Children.GetCount();
i++)
{
pAllModels.Add(pParent->Children[
i]);
CollectModels(pParent->Children[
i],pAllModels);
}
}
{
FBScene* lScene = mSystem.Scene;
mTree.Clear();
int lCount = lScene->Poses.GetCount();
FBTreeNode* lNode;
FBTreeNode* lSubNode;
FBString lName;
FBMatrix lMatrix;
bool lLocal;
for(
int i = 0;
i < lCount;
i++ )
{
lNode = mTree.InsertLast( mTree.GetRoot(), lScene->Poses[
i]->Name );
int lNodeCount = lScene->Poses[
i]->GetNodeCount();
for( int j = 0; j < lNodeCount; j++ )
{
lName = lScene->Poses[
i]->GetNodeName( j );
lMatrix = lScene->Poses[
i]->GetNodeMatrix( j );
lLocal = lScene->Poses[
i]->IsNodeLocalMatrix( j );
lSubNode = mTree.InsertLast( lNode, lName );
for( int k = 0; k < 16; k++ )
{
sprintf( buffer, "[%d][%d]=%f", k/4, k%4, lMatrix(k/4,k%4) );
mTree.InsertLast( lSubNode, buffer );
}
}
}
CollectModels(lScene->RootModel,lAllModels);
lCount = lScene->ObjectPoses.GetCount();
FBObjectPose* lObjectPose;
FBMatrix lRM;
FBMatrix lSM;
FBSVector lS;
for(
int i = 0;
i < lCount;
i++)
{
lObjectPose = lScene->ObjectPoses[
i];
lNode = mTree.InsertLast( mTree.GetRoot(), lObjectPose->Name );
for(int j = 0; j < lAllModels.GetCount(); j++)
{
lName = lAllModels[j]->Name;
{
lLocal = false;
}
{
lLocal = true;
}
else
{
{
lSubNode = mTree.InsertLast( lNode, (char *)lName );
mTree.InsertLast( lSubNode, buffer );
}
{
if(!lSubNode) lSubNode = mTree.InsertLast( lNode, (char *)lName );
mTree.InsertLast( lSubNode, buffer );
}
continue;
}
{
lSubNode = mTree.InsertLast( lNode, (char *)lName );
for( int k = 0; k < 16; k++ )
{
sprintf( buffer, "[%d][%d]=%f", k/4, k%4, lMatrix(k/4,k%4) );
mTree.InsertLast( lSubNode, buffer );
}
}
}
}
}
{
while( mSystem.Scene->Poses.GetCount() )
{
FBPose* lPose = mSystem.Scene->Poses[0];
mSystem.Scene->Poses.RemoveAt(0);
lPose->Destroy();
}
}
{
GenerateBindPoseNodes( mSystem.SceneRootModel,
NULL );
}
void ORToolPose::GenerateBindPoseNodes( FBModel* pModel, FBPose* pPose )
{
if( pModel )
{
FBPose* lPose = pPose;
{
lPose = new FBPose( "BindPoseInformation" );
mSystem.Scene->Poses.Add( lPose );
}
if( pModel != mSystem.SceneRootModel )
{
FBMatrix lMatrix;
pModel->GetMatrix( lMatrix );
lPose->AddNode( pModel, &lMatrix, false );
}
for( i = 0; i < pModel->Children.GetCount(); i++ )
{
GenerateBindPoseNodes( pModel->Children[i], lPose );
}
}
}