#include "ortoolmirrorpose_tool.h"
#define ORTOOLMIRRORPOSE__CLASS ORTOOLMIRRORPOSE__CLASSNAME
#define ORTOOLMIRRORPOSE__LABEL "MirrorPose"
#define ORTOOLMIRRORPOSE__DESC "Tool used to mirror selected objects in the viewer."
ORTOOLMIRRORPOSE__LABEL,
ORTOOLMIRRORPOSE__DESC,
const char* gToolMirrorPoseMirrorPlaneName = "MirrorPlane";
bool ORToolMirrorPose::FBCreate()
{
StartSize[0] = 180;
StartSize[1] = 90;
AddRegion( "ButtonShowMirrorPlaneCheckBox", "ButtonShowMirrorPlaneCheckBox",
AddRegion( "ButtonMirror", "ButtonMirror",
SetControl( "ButtonShowMirrorPlaneCheckBox", mButtonShowMirrorPlaneCheckBox );
SetControl( "ButtonMirror", mButtonMirror );
mButtonShowMirrorPlaneCheckBox.OnClick.Add(
this, (
FBCallback) &ORToolMirrorPose::EventButtonShowMirrorPlaneCheckBoxClick );
mButtonShowMirrorPlaneCheckBox.Caption = "Show mirror plane";
mButtonShowMirrorPlaneCheckBox.State = 1;
mButtonMirror.OnClick.Add(
this, (
FBCallback) &ORToolMirrorPose::EventButtonMirrorClick );
mButtonMirror.Caption = "Mirror selected models";
CreateMirrorPlane();
return true;
}
void ORToolMirrorPose::FBDestroy()
{
}
void ORToolMirrorPose::EventButtonShowMirrorPlaneCheckBoxClick(
HISender pSender,
HKEvent pEvent )
{
FBModel* lMirrorPlane = FindMirrorPlane();
if( mButtonShowMirrorPlaneCheckBox.State > 0 )
{
if( lMirrorPlane ==
NULL )
{
CreateMirrorPlane();
}
else
{
lMirrorPlane->Show = true;
}
}
else
{
if( lMirrorPlane !=
NULL )
{
lMirrorPlane->Show = false;
}
}
}
void ORToolMirrorPose::EventButtonMirrorClick(
HISender pSender,
HKEvent pEvent )
{
FBModel* lMirrorPlane = FindMirrorPlane();
FBObjectPose lObjectPose("Temporary");
FBObjectPoseOptions lObjectPoseOptions;
int lSelectedModelCount = lSelectedModelList.GetCount();
int lSelectedModelIndex;
for( lSelectedModelIndex = 0; lSelectedModelIndex < lSelectedModelCount; lSelectedModelIndex++ )
{
FBModel* lObject = lSelectedModelList[lSelectedModelIndex];
if( lObject && lObject != lMirrorPlane )
{
lObjectPose.CopyTransform( lObject->Name, *lObject, lObjectPoseOptions );
}
}
FBObjectPoseMirrorOptions lObjectPoseMirrorOptions;
if( lMirrorPlane !=
NULL )
{
FBMatrix lPlaneRM;
lPointOnPlane[0] = ((
FBVector3d)lMirrorPlane->Translation)[0];
lPointOnPlane[1] = ((
FBVector3d)lMirrorPlane->Translation)[1];
lPointOnPlane[2] = ((
FBVector3d)lMirrorPlane->Translation)[2];
GetPlaneEquation( lObjectPoseMirrorOptions.mMirrorPlaneEquation, lPointOnPlane, lPlaneRM );
}
lObjectPose.MirrorPoseAllObjects( lObjectPoseMirrorOptions );
for( lSelectedModelIndex = 0; lSelectedModelIndex < lSelectedModelCount; lSelectedModelIndex++ )
{
FBModel* lObject = lSelectedModelList[lSelectedModelIndex];
if( lObject && lObject != lMirrorPlane )
{
lObjectPose.PasteTransform( lObject->Name, *lObject, lObjectPoseOptions );
}
}
}
FBModel* ORToolMirrorPose::CreateMirrorPlane()
{
FBModel* lMirrorPlane = new FBModelPlane( gToolMirrorPoseMirrorPlaneName );
lMirrorPlane->Translation =
FBVector3d( 0.0, 100.0, 0.0 );
lMirrorPlane->Rotation =
FBVector3d( 0.0, 0.0, 90.0 );
lMirrorPlane->Scaling =
FBVector3d( 0.7, 0.7, 0.7 );
lMirrorPlane->Show = true;
mMirrorPlaneName = lMirrorPlane->Name;
return lMirrorPlane;
}
FBModel* ORToolMirrorPose::FindMirrorPlane()
{
return lMirrorPlane;
}