#include "ortoolpathplot_tool.h"
#define ORTOOLPATHPLOT__CLASS ORTOOLPATHPLOT__CLASSNAME
#define ORTOOLPATHPLOT__LABEL "Path Plot"
#define ORTOOLPATHPLOT__DESC "OR - Plot Path Tool Description"
ORTOOLPATHPLOT__LABEL,
ORTOOLPATHPLOT__DESC,
bool ORToolPathPlot::FBCreate()
{
StartSize[0] = 220;
StartSize[1] = 120;
UICreate ();
UIConfigure ();
UIReset ();
OnShow.Add (
this, (
FBCallback) &ORToolPathPlot::EventToolShow );
OnIdle.Add (
this, (
FBCallback) &ORToolPathPlot::EventToolIdle );
mSystem.Scene->OnChange.Add (
this, (
FBCallback) &ORToolPathPlot::EventSceneChange );
mSystem.Scene->OnTakeChange.Add (
this, (
FBCallback) &ORToolPathPlot::EventTakeChange );
return true;
}
void ORToolPathPlot::FBDestroy()
{
OnShow.Remove (
this, (
FBCallback) &ORToolPathPlot::EventToolShow );
OnIdle.Remove (
this, (
FBCallback) &ORToolPathPlot::EventToolIdle );
mSystem.Scene->OnChange.Remove (
this, (
FBCallback) &ORToolPathPlot::EventSceneChange );
mSystem.Scene->OnTakeChange.Remove (
this, (
FBCallback) &ORToolPathPlot::EventTakeChange );
}
void ORToolPathPlot::UICreate()
{
int lS = 4;
int lW = 200;
int lH = 18;
AddRegion( "LabelDirections", "LabelDirections",
AddRegion( "ListCameras", "ListCameras",
AddRegion( "ListModelType", "ListModelType",
AddRegion( "EditNumberFrequency", "EditNumberFrequency",
AddRegion( "ButtonPlot", "ButtonPlot",
AddRegion( "ButtonUseInterest", "ButtonUseInterest",
SetControl( "LabelDirections", mLabelDirections );
SetControl( "ListCameras", mListCameras );
SetControl( "ListModelType", mListModelType );
SetControl( "EditNumberFrequency", mEditNumberFrequency );
SetControl( "ButtonPlot", mButtonPlot );
SetControl( "ButtonUseInterest", mButtonUseInterest );
}
void ORToolPathPlot::UIConfigure()
{
mLabelDirections.Caption = "This tool plots an animation path onto\n"
"the movement of a camera.";
mEditNumberFrequency.Precision = 3.3;
mEditNumberFrequency.LargeStep = 0.1;
mEditNumberFrequency.SmallStep = 0.1;
mEditNumberFrequency.Min = 0.001;
mEditNumberFrequency.Value = 10.0;
mListModelType.Items.Add( "Marker", eMarker );
mListModelType.Items.Add( "Null", eNull );
mButtonUseInterest.Caption = "Use Interest";
mButtonPlot.Caption = "Plot";
mButtonPlot.OnClick.Add(
this, (
FBCallback)&ORToolPathPlot::EventButtonPlotClick );
}
void ORToolPathPlot::UIReset()
{
FBString lSelection;
bool lIsSelected = false;
if( mListCameras.ItemIndex != -1 )
{
lIsSelected = true;
lSelection = mListCameras.Items.GetAt(mListCameras.ItemIndex);
}
mListCameras.Items.Clear();
for(
int i=0;
i<mSystem.Scene->Cameras.GetCount();
i++)
{
mListCameras.Items.Add( mSystem.Scene->Cameras[
i]->Name, (kReference) mSystem.Scene->Cameras[
i] );
}
if( lIsSelected )
{
mListCameras.ItemIndex = mListCameras.Items.Find( lSelection );
}
}
void ORToolPathPlot::UIRefresh()
{
}
void ORToolPathPlot::EventButtonPlotClick(
HISender pSender,
HKEvent pEvent )
{
double lRate = mEditNumberFrequency.Value;
if( lRate != 0 )
{
if( mListCameras.ItemIndex != -1 )
{
mExport.mHdlCamera = (FBCamera*) mListCameras.Items.GetReferenceAt( mListCameras.ItemIndex );
mExport.mStep.SetSecondDouble(1.0/lRate);
mExport.mOriginalTime = mSystem.LocalTime;
mExport.mTimeSpan = mSystem.CurrentTake->LocalTimeSpan;
mExport.mHdlRoot = new FBModelRoot("Root-1");
mExport.mHdlRoot->Show = true;
mExport.mModelType = (EModelType)mListModelType.Items.GetReferenceAt( mListModelType.ItemIndex );
mExport.mUseInterest = (mButtonUseInterest.State!=0);
mExport.mId = 0;
mExport.mHdlProgress = new FBProgress;
mExport.mHdlProgress->Caption = "Path Plot";
mExport.mHdlProgress->Text = mExport.mHdlCamera->Name;
mPlayerControl.Goto( mExport.mTimeSpan.GetStart() );
mState = eModelNext;
}
}
}
{
switch( mState )
{
case eIdle:
{
}
break;
case eModelNext:
{
mState = eModel;
}
break;
case eModel:
{
if( ((FBTime)mSystem.LocalTime) < mExport.mTimeSpan.GetStop() )
{
if( mExport.mTimeSpan.GetDuration() != 0 )
{
FBTime lCurrent = mSystem.LocalTime;
FBTime lStart = mExport.mTimeSpan.GetStart();
FBTime lTotal = mExport.mTimeSpan.GetDuration();
FBTime lDelta = lCurrent-lStart;
if (mExport.mHdlProgress.Ok()) mExport.mHdlProgress->Percent = (lDelta.GetSecondDouble() / lTotal.GetSecondDouble())*100.0;
}
else
{
if (mExport.mHdlProgress.Ok()) mExport.mHdlProgress->Percent = 0.0;
}
char lBuffer[1024];
sprintf(lBuffer,"Step %d-1", mExport.mId++);
switch( mExport.mModelType )
{
default:
case eMarker: lModel = new FBModelMarker(lBuffer); break;
case eNull: lModel = new FBModelNull(lBuffer); break;
}
lModel->Show = true;
if(mExport.mHdlRoot.Ok()) mExport.mHdlRoot->Children.Add( lModel );
if (mExport.mHdlCamera.Ok()){
}
if( mExport.mUseInterest&& mExport.mHdlCamera.Ok() )
{
lModel->LookAt = mExport.mHdlCamera->LookAt;
}
mPlayerControl.Goto( ((FBTime)mSystem.LocalTime) + mExport.mStep );
}
else
{
if (mExport.mHdlProgress.Ok()) mExport.mHdlProgress->FBDelete();
mExport.mHdlProgress=
NULL;
mExport.mOriginalTime.Set(0);
mExport.mStep.Set(0);
mExport.mId = 0;
mPlayerControl.Goto( mExport.mOriginalTime );
mState = eIdle;
}
}
break;
}
UIRefresh();
}
{
FBEventShow lEvent( pEvent );
if( lEvent.Shown )
{
UIReset();
}
else
{
}
}
{
UIReset();
}
const char* gTakeEventName[] = {
"kFBTakeChangeAdded",
"kFBTakeChangeRemoved",
"kFBTakeChangeOpened",
"kFBTakeChangeClosed",
"kFBTakeChangeRenamed",
"kFBTakeChangeUpdated",
"kFBTakeChangeMoved",
"kFBTakeChangeNone"
};
{
char lMsg[1024];
FBEventTakeChange lEvent( pEvent );
FBTake* lTake = lEvent.Take;
sprintf( lMsg, "(%s): %s", gTakeEventName[lEvent.Type], (const char*)lTake->Name );
}
bool ORToolPathPlot::FbxStore ( FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat )
{
pFbxObject->FieldWriteBegin( "ORToolPathPlotSection" );
{
}
pFbxObject->FieldWriteEnd();
return true;
}
bool ORToolPathPlot::FbxRetrieve( FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat )
{
pFbxObject->FieldReadBegin( "ORToolPathPlotSection" );
{
}
pFbxObject->FieldReadEnd();
return true;
}