diff options
Diffstat (limited to 'tools/worldbuilder/code/contexts/locatorcontext.cpp')
-rw-r--r-- | tools/worldbuilder/code/contexts/locatorcontext.cpp | 887 |
1 files changed, 887 insertions, 0 deletions
diff --git a/tools/worldbuilder/code/contexts/locatorcontext.cpp b/tools/worldbuilder/code/contexts/locatorcontext.cpp new file mode 100644 index 0000000..7c1ff0a --- /dev/null +++ b/tools/worldbuilder/code/contexts/locatorcontext.cpp @@ -0,0 +1,887 @@ +//---------------------------------------- +// System Includes +//---------------------------------------- +#include <math.h> + +//---------------------------------------- +// Project Includes +//---------------------------------------- + +#include "Locatorcontext.h" +#include "nodes/EventLocatorNode.h" +#include "nodes/ScriptLocatorNode.h" +#include "nodes/GenericLocatorNode.h" +#include "nodes/CarStartLocatorNode.h" +#include "nodes/TriggerVolumeNode.h" +#include "nodes/zoneeventlocatornode.h" +#include "nodes/occlusionlocatornode.h" +#include "nodes/interiorentrancelocatornode.h" +#include "nodes/directionallocatornode.h" +#include "nodes/ActionEventLocatorNode.h" +#include "nodes/FOVLocatorNode.h" +#include "nodes/BreakableCameraLocatorNode.h" +#include "nodes/StaticCameraLocatorNode.h" +#include "nodes/PedGroupLocator.h" +#include "utility/mext.h" +#include "utility/mui.h" +#include "main/worldbuilder.h" +#include "main/constants.h" + +#include "resources/resource.h" + +//---------------------------------------- +// Constants, Typedefs and Statics +//---------------------------------------- + +const short OFFSET = 10; +const double SCALE_FACTOR = 0.002; +const double DEFAULT_SCALE = 5; + +const char* LocatorContext::stringId = "LocatorContext"; + +LocatorType::Type LocatorContext::mLastLocatorType = LocatorType::NUM_TYPES; +LocatorEvent::Event LocatorContext::mLastEvent = LocatorEvent::CHECK_POINT; + +//============================================================================== +// LocatorContextCmd::LocatorContextCmd +//============================================================================== +// Description: Comment +// +// Parameters: () +// +// Return: LocatorContextCmd +// +//============================================================================== +LocatorContextCmd::LocatorContextCmd() +{ +} + +//============================================================================== +// LocatorContextCmd::~LocatorContextCmd +//============================================================================== +// Description: Comment +// +// Parameters: () +// +// Return: LocatorContextCmd +// +//============================================================================== +LocatorContextCmd::~LocatorContextCmd() +{ +} + +//----------------------------------------------------------------------------- +// c r e a t o r +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +void* LocatorContextCmd::creator() +{ + return new LocatorContextCmd(); +} + +//----------------------------------------------------------------------------- +// m a k e O b j +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +MPxContext* LocatorContextCmd::makeObj() +{ + return new LocatorContext(); +} + +//============================================================================== +// LocatorContext::LocatorContext +//============================================================================== +// Description: Comment +// +// Parameters: () +// +// Return: LocatorContext +// +//============================================================================== +LocatorContext::LocatorContext() : + mXCurrent( 0 ), + mYCurrent( 0 ) +{ + SetHelpString(); + + setTitleString( "Locator Creation Tool" ); +} + +//============================================================================== +// LocatorContext::~LocatorContext +//============================================================================== +// Description: Comment +// +// Parameters: () +// +// Return: LocatorContext +// +//============================================================================== +LocatorContext::~LocatorContext() +{ +} + +//============================================================================== +// LocatorContext::abortAction +//============================================================================== +// Description: Comment +// +// Parameters: () +// +// Return: void +// +//============================================================================== +void LocatorContext::abortAction() +{ + ProcessState( ABORTED ); +} + +//----------------------------------------------------------------------------- +// c o m p l e t e A c t i o n +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +void LocatorContext::completeAction() +{ + ProcessState( COMPLETED ); +} + +//----------------------------------------------------------------------------- +// d e l e t e A c t i o n +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +void LocatorContext::deleteAction() +{ + ProcessState( DELETED ); +} + +//----------------------------------------------------------------------------- +// d o D r a g +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +MStatus LocatorContext::doDrag( MEvent& event ) +{ + + event.getPosition( mXDrag, mYDrag ); + ProcessState( MOUSEDRAG ); + return MS::kSuccess; +} + +//----------------------------------------------------------------------------- +// d o E n t e r R e g i o n +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +MStatus LocatorContext::doEnterRegion( MEvent& event ) +{ + SetHelpString(); + + return MS::kSuccess; +} + +//----------------------------------------------------------------------------- +// d o H o l d +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +MStatus LocatorContext::doHold( MEvent& event ) +{ + MStatus status = MS::kSuccess; + return status; +} + +//----------------------------------------------------------------------------- +// d o P r e s s +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +MStatus LocatorContext::doPress( MEvent& event ) +{ + event.getPosition( mXCurrent, mYCurrent ); + ProcessState( BUTTONDOWN ); + return MS::kSuccess; +} + +//----------------------------------------------------------------------------- +// d o R e l e a s e +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +MStatus LocatorContext::doRelease( MEvent& event ) +{ + if ( event.mouseButton() == MEvent::kLeftMouse ) + { + event.getPosition( mXCurrent, mYCurrent ); + ProcessState( BUTTONUP ); + } + + return MS::kSuccess; +} + +//----------------------------------------------------------------------------- +// t o o l O f f C l e a n u p +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +void LocatorContext::toolOffCleanup() +{ + if ( mLocatorTransform != MObject::kNullObj ) + { + mLocator = MObject::kNullObj; + mLocatorTransform = MObject::kNullObj; + } +} + +//----------------------------------------------------------------------------- +// t o o l O n S e t u p +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +void LocatorContext::toolOnSetup( MEvent& event ) +{ + setCursor( MCursor::crossHairCursor ); +} + +//----------------------------------------------------------------------------- +// +// P R I V A T E M E M B E R S +// +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// p r o c e s s S t a t e +// +// Synopsis: +// +// Parameters: NONE +// +// Returns: NOTHING +// +// Constraints: NONE +// +//----------------------------------------------------------------------------- +void LocatorContext::ProcessState( Stimulus stimulus ) +{ + switch( stimulus ) + { + case BUTTONDOWN: + { + } + break; + case MOUSEDRAG: + { + } + break; + case BUTTONUP: + { + InitLocator(); + } + break; + case COMPLETED: + case ABORTED: + { + if ( mLocatorTransform != MObject::kNullObj ) + { + mLocator = MObject::kNullObj; + mLocatorTransform = MObject::kNullObj; + } + } + break; + case DELETED: + { + if ( mLocatorTransform != MObject::kNullObj ) + { + MGlobal::deleteNode( mLocator ); + MGlobal::deleteNode( mLocatorTransform ); + } + } + break; + default: + { + } + break; + } + + SetHelpString(); +} + +//============================================================================== +// LocatorContext::SetHelpString +//============================================================================== +// Description: Comment +// +// Parameters: () +// +// Return: void +// +//============================================================================== +void LocatorContext::SetHelpString() +{ + mHelp = "Click to create Locator."; + + setHelpString( mHelp ); +} + +//============================================================================== +// LocatorContext::InitLocator +//============================================================================== +// Description: Comment +// +// Parameters: () +// +// Return: void +// +//============================================================================== +void LocatorContext::InitLocator() +{ + //Get the mesh below the clicked point and find it's y height. + MPoint intersectPoint; + + if ( MExt::MeshClickIntersect( mXCurrent, mYCurrent, intersectPoint ) ) + { + bool needsTriggerVolume = false; + bool lockTriggerRotation = false; + MString newName; + + //What kind of locator do we want? + switch ( WorldBuilder::GetLocatorType() ) + { + case LocatorType::EVENT: + { + MUI::PopupDialogue( IDD_DIALOG1, &EventLocatorNameCallBack ); + + newName = MString( EventLocatorNode::GetNewName() ); + + if ( newName.length() > 0 ) + { +// if ( mLastLocatorType == LocatorType::EVENT ) +// { +// if ( !mLocator.isNull() ) +// { +// //Make this the same kind of event as the last one +// MFnDependencyNode fnNode( mLocator ); +// fnNode.findPlug( EventLocatorNode::sEvent ).getValue( mLastEvent ); +// } +// } +// else + { + mLastLocatorType = LocatorType::EVENT; + } + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( EventLocatorNode::stringId ), + &newName ); + + needsTriggerVolume = true; + + + MFnDependencyNode fnNode( mLocator ); + fnNode.findPlug( EventLocatorNode::sEvent ).setValue( mLastEvent ); + + //Lock out the x and z axis on the transform. +// MFnDependencyNode fnDepNode( mLocatorTransform ); +// fnDepNode.findPlug( MString("rx") ).setLocked( true ); +// fnDepNode.findPlug( MString("ry") ).setLocked( true ); +// fnDepNode.findPlug( MString("rz") ).setLocked( true ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::SCRIPT: + { + mLastLocatorType = LocatorType::SCRIPT; + + MUI::PopupDialogue( IDD_DIALOG5, &ScriptLocatorNameCallBack ); + + newName = MString( ScriptLocatorNode::GetNewName() ); + + const char* script = ScriptLocatorNode::GetScriptName(); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( ScriptLocatorNode::stringId ), + &newName ); + + needsTriggerVolume = true; + + //Lock out the x and z axis on the transform. + MFnDependencyNode fnDepNode( mLocatorTransform ); + fnDepNode.findPlug( MString("rx") ).setLocked( true ); + fnDepNode.findPlug( MString("ry") ).setLocked( true ); + fnDepNode.findPlug( MString("rz") ).setLocked( true ); + + fnDepNode.setObject( mLocator ); + fnDepNode.findPlug( ScriptLocatorNode::sScript ).setValue( script ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::GENERIC: + { + mLastLocatorType = LocatorType::GENERIC; + + MUI::PopupDialogue( IDD_DIALOG1, &GenericLocatorNameCallBack ); + + newName = MString( GenericLocatorNode::GetNewName() ); + + if ( newName.length() > 0 ) + { + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( GenericLocatorNode::stringId ), + &newName ); + + //Lock out the x and z axis on the transform. + MFnDependencyNode fnDepNode( mLocatorTransform ); + fnDepNode.findPlug( MString("rx") ).setLocked( true ); + fnDepNode.findPlug( MString("ry") ).setLocked( true ); + fnDepNode.findPlug( MString("rz") ).setLocked( true ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::CAR_START: + { + mLastLocatorType = LocatorType::CAR_START; + + MUI::PopupDialogue( IDD_DIALOG1, &CarStartLocatorNameCallBack ); + + newName = MString( CarStartLocatorNode::GetNewName() ); + + if ( newName.length() > 0 ) + { + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( CarStartLocatorNode::stringId ), + &newName ); + + //Lock out the x and z axis on the transform. + MFnDependencyNode fnDepNode( mLocatorTransform ); + fnDepNode.findPlug( MString("rx") ).setLocked( true ); + fnDepNode.findPlug( MString("rz") ).setLocked( true ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::DYNAMIC_ZONE: + { + mLastLocatorType = LocatorType::DYNAMIC_ZONE; + + MUI::PopupDialogue( IDD_DIALOG3, &ZoneEventLocatorNameCallBack ); + + newName = MString( ZoneEventLocatorNode::GetNewName() ); + + const char* zone = ZoneEventLocatorNode::GetZoneName(); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( ZoneEventLocatorNode::stringId ), + &newName ); + + needsTriggerVolume = true; + + //Lock out the x and z axis on the transform. + MFnDependencyNode fnDepNode( mLocatorTransform ); + fnDepNode.findPlug( MString("rx") ).setLocked( true ); + fnDepNode.findPlug( MString("ry") ).setLocked( true ); + fnDepNode.findPlug( MString("rz") ).setLocked( true ); + + fnDepNode.setObject( mLocator ); + fnDepNode.findPlug( ZoneEventLocatorNode::sZone ).setValue( zone ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::OCCLUSION: + { + mLastLocatorType = LocatorType::OCCLUSION; + + MUI::PopupDialogue( IDD_DIALOG1, &OcclusionLocatorNameCallBack ); + + newName = MString( OcclusionLocatorNode::GetNewName() ); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( OcclusionLocatorNode::stringId ), + &newName ); + + needsTriggerVolume = true; + + //Lock out the x and z axis on the transform. + MFnDependencyNode fnDepNode( mLocatorTransform ); + fnDepNode.findPlug( MString("rx") ).setLocked( true ); + fnDepNode.findPlug( MString("ry") ).setLocked( true ); + fnDepNode.findPlug( MString("rz") ).setLocked( true ); + + fnDepNode.setObject( mLocator ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::INTERIOR_ENTRANCE: + { + mLastLocatorType = LocatorType::INTERIOR_ENTRANCE; + + MUI::PopupDialogue( IDD_DIALOG3, &InteriorEntranceLocatorNameCallBack ); + + newName = MString( InteriorEntranceLocatorNode::GetNewName() ); + + const char* zone = InteriorEntranceLocatorNode::GetZoneName(); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( InteriorEntranceLocatorNode::stringId ), + &newName ); + + needsTriggerVolume = true; + +// //Lock out the x and z axis on the transform. + MFnDependencyNode fnDepNode( mLocatorTransform ); +// fnDepNode.findPlug( MString("rx") ).setLocked( true ); +// fnDepNode.findPlug( MString("ry") ).setLocked( true ); +// fnDepNode.findPlug( MString("rz") ).setLocked( true ); + + fnDepNode.setObject( mLocator ); + fnDepNode.findPlug( InteriorEntranceLocatorNode::sZone ).setValue( zone ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::DIRECTIONAL: + { + mLastLocatorType = LocatorType::DIRECTIONAL; + + MUI::PopupDialogue( IDD_DIALOG1, &DirectionalLocatorNameCallBack ); + + newName = MString( DirectionalLocatorNode::GetNewName() ); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( DirectionalLocatorNode::stringId ), + &newName ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::ACTION: + { + mLastLocatorType = LocatorType::ACTION; + + MUI::PopupDialogue( IDD_DIALOG4, &ActionEventLocatorNameCallBack ); + + newName = MString( ActionEventLocatorNode::GetNewName() ); + MString objName = ActionEventLocatorNode::GetNewObj(); + MString jointName = ActionEventLocatorNode::GetNewJoint(); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( ActionEventLocatorNode::stringId ), + &newName ); + + needsTriggerVolume = true; + + //Lock out the x and z axis on the transform. + MFnDependencyNode fnDepNode( mLocatorTransform ); + //fnDepNode.findPlug( MString("rx") ).setLocked( true ); + //fnDepNode.findPlug( MString("ry") ).setLocked( true ); + //fnDepNode.findPlug( MString("rz") ).setLocked( true ); + + fnDepNode.setObject( mLocator ); + fnDepNode.findPlug( ActionEventLocatorNode::sObject ).setValue( objName ); + fnDepNode.findPlug( ActionEventLocatorNode::sJoint ).setValue( jointName ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::FOV: + { + mLastLocatorType = LocatorType::FOV; + + MUI::PopupDialogue( IDD_DIALOG1, &FOVLocatorNameCallBack ); + + newName = MString( FOVLocatorNode::GetNewName() ); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( FOVLocatorNode::stringId ), + &newName ); + + needsTriggerVolume = true; + + //Lock out the x and z axis on the transform. + MFnDependencyNode fnDepNode( mLocatorTransform ); + fnDepNode.findPlug( MString("rx") ).setLocked( true ); + fnDepNode.findPlug( MString("ry") ).setLocked( true ); + fnDepNode.findPlug( MString("rz") ).setLocked( true ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::BREAKABLE_CAMERA: + { + mLastLocatorType = LocatorType::BREAKABLE_CAMERA; + + MUI::PopupDialogue( IDD_DIALOG1, &BreakableCameraLocatorNameCallBack ); + + newName = MString( BreakableCameraLocatorNode::GetNewName() ); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( BreakableCameraLocatorNode::stringId ), + &newName ); + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::STATIC_CAMERA: + { + mLastLocatorType = LocatorType::STATIC_CAMERA; + + MUI::PopupDialogue( IDD_DIALOG1, &StaticCameraLocatorNameCallBack ); + + newName = MString( StaticCameraLocatorNode::GetNewName() ); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( StaticCameraLocatorNode::stringId ), + &newName ); + + needsTriggerVolume = true; + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + case LocatorType::PED_GROUP: + { + mLastLocatorType = LocatorType::PED_GROUP; + + MUI::PopupDialogue( IDD_DIALOG1, &PedGroupLocatorNameCallBack ); + + newName = MString( PedGroupLocatorNode::GetNewName() ); + + if ( newName.length() > 0 ) + { + + //TODO, parent this properly. + MExt::CreateNode( mLocator, + mLocatorTransform, + MString( PedGroupLocatorNode::stringId ), + &newName ); + + needsTriggerVolume = true; + } + else + { + goto DIE; //Die outta here. It's cancelled. + } + } + break; + default: + assert( false ); + break; + } + + assert( !mLocator.isNull() ); + + MExt::SetWorldPosition( intersectPoint, mLocator ); + + if ( needsTriggerVolume ) + { + //Create and connect a trigger volume to this node. + MObject tv; + MObject tvt; + + MString name( newName ); + name += MString( "Trigger" ); + + MExt::CreateNode( tv, + tvt, + MString( TriggerVolumeNode::stringId ), + &name ); + + MExt::SetWorldPosition( intersectPoint, tv ); + + MFnTransform fnTransform( tvt ); + const double scale[3] = { DEFAULT_SCALE, DEFAULT_SCALE, DEFAULT_SCALE }; + + //Scale this bad-boy! + fnTransform.setScale( scale ); + + if ( lockTriggerRotation ) + { + fnTransform.findPlug( MString( "rx" ) ).setLocked( true ); + fnTransform.findPlug( MString( "ry" ) ).setLocked( true ); + fnTransform.findPlug( MString( "rz" ) ).setLocked( true ); + } + + //Connect the Trigger Volume to the Locator. + MExt::Connect( tv, "locator", mLocator, "triggers" ); + + WorldBuilder::AddChild( tv ); + } + + WorldBuilder::AddChild( mLocator ); + + } + +DIE: + MGlobal::clearSelectionList(); +} |