summaryrefslogtreecommitdiffstats
path: root/tools/trackeditor/code/commands/intersectioncommands.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/trackeditor/code/commands/intersectioncommands.cpp')
-rw-r--r--tools/trackeditor/code/commands/intersectioncommands.cpp449
1 files changed, 449 insertions, 0 deletions
diff --git a/tools/trackeditor/code/commands/intersectioncommands.cpp b/tools/trackeditor/code/commands/intersectioncommands.cpp
new file mode 100644
index 0000000..4733762
--- /dev/null
+++ b/tools/trackeditor/code/commands/intersectioncommands.cpp
@@ -0,0 +1,449 @@
+#include "precompiled/PCH.h"
+
+#include "intersectioncommands.h"
+#include "utility/mext.h"
+#include "nodes/road.h"
+#include "main/trackeditor.h"
+#include "nodes/intersection.h"
+
+
+const char* CreateRoadCmd::stringId = "TE_CreateRoad";
+const char* AddIntersectionToRoadCmd::stringId = "TE_AddIntersectionToRoad";
+
+
+//==============================================================================
+// CreateRoadCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* CreateRoadCmd::creator()
+{
+ return new CreateRoadCmd();
+}
+
+//==============================================================================
+// CreateRoadCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus CreateRoadCmd::doIt( const MArgList& args )
+{
+ //Take all the selected road segments and create a road from them.
+ //If there is a segment that has not been roadified, highlight that one and return an error message.
+
+ MSelectionList selectList;
+ MGlobal::getActiveSelectionList( selectList );
+ MItSelectionList itSelect( selectList, MFn::kMesh );
+
+ if ( selectList.length() <= 0 || itSelect.isDone() )
+ {
+ MExt::DisplayWarning( "Nothing to do, please select road segments!" );
+ return MStatus::kSuccess;
+ }
+
+ MObjectArray segArray;
+ MObject obj;
+ MFnMesh fnMesh;
+ MPlug whichRoadPlug;
+ MStatus status;
+
+ while ( !itSelect.isDone() )
+ {
+ //Gather all the road segments and add them to the new road.
+ itSelect.getDependNode( obj );
+
+ fnMesh.setObject( obj );
+
+ whichRoadPlug = fnMesh.findPlug( MString( "teWhichRoad" ), &status );
+
+ if ( status == MStatus::kSuccess )
+ {
+ //This is one of them.
+ segArray.append( obj );
+ }
+
+ itSelect.next();
+ }
+
+ if ( segArray.length() <= 0 )
+ {
+ //There were no appropriate segs in the selection.
+ MExt::DisplayWarning( "Nothing to do, please select road segments!" );
+ return MStatus::kSuccess;
+ }
+
+ MObject newRoad;
+ MObject newRoadT;
+
+ MExt::CreateNode( newRoad, newRoadT, MString( RoadNode::stringId ) );
+
+ assert( !newRoad.isNull() );
+
+ unsigned int i;
+ for ( i = 0; i < segArray.length(); ++i )
+ {
+ //Test to see if this road seg is already connected.
+ if ( MExt::IsConnected( segArray[ i ], "teWhichRoad" ) )
+ {
+ MExt::DisconnectAll( segArray[ i ], "teWhichRoad" );
+ }
+
+ MExt::Connect( segArray[ i ], "teWhichRoad", newRoad, RoadNode::ROAD_SEG_NAME_LONG );
+ }
+
+ TrackEditor::AddChild( newRoad );
+
+ return MStatus::kSuccess;
+}
+
+
+//==============================================================================
+// AddIntersectionToRoadCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* AddIntersectionToRoadCmd::creator()
+{
+ return new AddIntersectionToRoadCmd();
+}
+
+//==============================================================================
+// AddIntersectionToRoadCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus AddIntersectionToRoadCmd::doIt( const MArgList& args )
+{
+ MStatus status;
+
+ //Arg 0 is the name of the intersection (the road is selected)
+ //Arg 1 is whether it is a start or end point on the road.
+
+ assert( args.length() == 2 );
+
+ MObjectArray roadArray;
+
+ if ( GetRoadsFromSelectionList( roadArray ) )
+ {
+ MString intersectionName;
+ args.get( 0, intersectionName );
+
+ if ( intersectionName == MString( "" ) )
+ {
+ MExt::DisplayWarning( "Must have an intersection selected in the editor." );
+ return MStatus::kSuccess;
+ }
+
+ bool isEnd;
+ args.get( 1, isEnd );
+
+ MDagPath dagPath;
+ if ( !MExt::FindDagNodeByName( &dagPath, intersectionName ) )
+ {
+ MExt::DisplayWarning( "The Intersection: %s does not exist!", intersectionName.asChar() );
+ return MStatus::kSuccess;
+ }
+
+ MFnDagNode fnIntersectionDagNode( dagPath );
+
+ unsigned int i;
+ for ( i = 0; i < roadArray.length(); ++i )
+ {
+ if ( isEnd )
+ {
+ MExt::DisconnectAll( roadArray[i], RoadNode::INTERSECTION_END_LONG );
+ MExt::Connect( roadArray[i], RoadNode::INTERSECTION_END_LONG, fnIntersectionDagNode.object(), IntersectionLocatorNode::ROAD_LONG );
+ }
+ else
+ {
+ MExt::DisconnectAll( roadArray[i], RoadNode::INTERSECTION_START_LONG );
+ MExt::Connect( roadArray[i], RoadNode::INTERSECTION_START_LONG, fnIntersectionDagNode.object(), IntersectionLocatorNode::ROAD_LONG );
+ }
+ }
+ }
+
+ return MStatus::kSuccess;
+}
+
+
+const char* ShowRoadCmd::stringId = "TE_ShowRoad";
+
+//==============================================================================
+// ShowRoadCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* ShowRoadCmd::creator()
+{
+ return new ShowRoadCmd();
+}
+
+//==============================================================================
+// ShowRoadCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus ShowRoadCmd::doIt( const MArgList& args )
+{
+
+ MObject road;
+
+ if ( GetRoadFromSelectionList( road ) )
+ {
+ MString cmd;
+
+ MFnDependencyNode fnNode( road );
+ MPlug roadPlug = fnNode.findPlug( MString( RoadNode::ROAD_SEG_NAME_LONG ) );
+ assert( roadPlug.isArray() );
+
+ MGlobal::clearSelectionList();
+
+ MPlugArray source, dest;
+ MExt::ResolveConnections( &source, &dest, roadPlug, AS_DEST );
+
+ assert( source.length() );
+
+ unsigned int i;
+ for ( i = 0; i < source.length(); ++i )
+ {
+ fnNode.setObject( source[i].node() );
+ cmd = MString( "select -add " ) + fnNode.name();
+
+ MGlobal::executeCommand( cmd );
+ }
+
+ fnNode.setObject( road );
+ cmd = MString("select -add ") + fnNode.name();
+ MGlobal::executeCommand( cmd );
+ }
+
+ return MStatus::kSuccess;
+}
+
+
+const char* DestroyRoadCmd::stringId = "TE_DestroyRoad";
+
+//==============================================================================
+// DestroyRoadCmd::creator
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//==============================================================================
+void* DestroyRoadCmd::creator()
+{
+ return new DestroyRoadCmd();
+}
+
+//==============================================================================
+// DestroyRoadCmd::doIt
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( const MArgList& args )
+//
+// Return: MStatus
+//
+//==============================================================================
+MStatus DestroyRoadCmd::doIt( const MArgList& args )
+{
+
+ MObject road;
+
+ if ( GetRoadFromSelectionList( road ) )
+ {
+ MExt::DeleteNode( road, true );
+ }
+
+ return MStatus::kSuccess;
+}
+
+
+
+//==============================================================================
+// GetRoadFromSelectionList
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& road )
+//
+// Return: bool
+//
+//==============================================================================
+bool GetRoadFromSelectionList( MObject& road )
+{
+ MStatus status;
+
+ MSelectionList selectList;
+ MGlobal::getActiveSelectionList( selectList );
+
+ if ( selectList.length() <= 0 )
+ {
+ MExt::DisplayWarning( "A road segment must be selected!" );
+ return false;
+ }
+ else
+ {
+ MObject segment;
+ selectList.getDependNode( 0, segment );
+ MFnDagNode fnNode( segment );
+
+ if ( fnNode.typeName() == MString( RoadNode::stringId ) )
+ {
+ //this is a road segment
+ road = fnNode.object();
+ }
+ else
+ {
+ //Test to make sure the selected item is a road segment.
+ MFn::Type type = fnNode.type();
+
+ if ( fnNode.typeName() == MString( "transform" ) )
+ {
+ //We want the child of this, not the transform.
+ fnNode.setObject( fnNode.child( 0 ) );
+ }
+
+ MPlug whichRoadPlug = fnNode.findPlug( MString( "teWhichRoad" ), &status );
+
+ if ( status )
+ {
+ //Get the intersection connected to this road and select all the road segs
+ //attached to it.
+ if ( whichRoadPlug.isConnected() )
+ {
+ //Get the road Locator;
+ MPlugArray plugs;
+ whichRoadPlug.connectedTo( plugs, false, true );
+
+ assert( plugs.length() > 0 );
+
+ //Get to road attached to the segment.
+ road = plugs[ 0 ].node();
+ }
+ else
+ {
+ MExt::DisplayWarning( "This road segment is not part of a road!" );
+ return false;
+ }
+ }
+ else
+ {
+ MExt::DisplayWarning( "A road segment must be selected!" );
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+//==============================================================================
+// GetRoadsFromSelectionList
+//==============================================================================
+// Description: Comment
+//
+// Parameters: ( MObject& road )
+//
+// Return: bool
+//
+//==============================================================================
+bool GetRoadsFromSelectionList( MObjectArray& roadArray )
+{
+ MStatus status;
+
+ MSelectionList selectList;
+ MGlobal::getActiveSelectionList( selectList );
+
+ if ( selectList.length() <= 0 )
+ {
+ MExt::DisplayWarning( "At least one road segment must be selected!" );
+ return false;
+ }
+ else
+ {
+ unsigned int i;
+ for ( i = 0; i < selectList.length(); ++i )
+ {
+ MObject node;
+ selectList.getDependNode( i, node );
+ MFnDagNode fnNode( node );
+
+ if ( fnNode.typeName() == MString( RoadNode::stringId ) )
+ {
+ //this is a road node
+ roadArray.append( fnNode.object() );
+ }
+ else
+ {
+ //Test to make sure the selected item is a road segment.
+ MFn::Type type = fnNode.type();
+
+ if ( fnNode.typeName() == MString( "transform" ) )
+ {
+ //We want the child of this, not the transform.
+ fnNode.setObject( fnNode.child( 0 ) );
+ }
+
+ MPlug whichRoadPlug = fnNode.findPlug( MString( "teWhichRoad" ), &status );
+
+ if ( status )
+ {
+ //Get the intersection connected to this road and select all the road segs
+ //attached to it.
+ if ( whichRoadPlug.isConnected() )
+ {
+ //Get the road Locator;
+ MPlugArray plugs;
+ whichRoadPlug.connectedTo( plugs, false, true );
+
+ assert( plugs.length() > 0 );
+
+ //Get to road attached to the segment.
+ roadArray.append( plugs[ 0 ].node() );
+ }
+ else
+ {
+ MExt::DisplayWarning( "This road segment: %s is not part of a road!", fnNode.name().asChar() );
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+} \ No newline at end of file