#include "precompiled/PCH.h" #include "intersection.h" #include "main/constants.h" #include "utility/glext.h" #include "utility/mext.h" #include "utility/nodehelper.h" #include "utility/transformmatrix.h" #include MTypeId IntersectionLocatorNode::id( TEConstants::TypeIDPrefix, TEConstants::NodeIDs::Intersection ); const char* IntersectionLocatorNode::stringId = "IntersectionLocatorNode"; //Attribute const char* IntersectionLocatorNode::TYPE_NAME_LONG = "IntersectionType"; const char* IntersectionLocatorNode::TYPE_NAME_SHORT = "it"; MObject IntersectionLocatorNode::mType; const char* IntersectionLocatorNode::ROAD_LONG = "Roads"; const char* IntersectionLocatorNode::ROAD_SHORT = "R"; MObject IntersectionLocatorNode::mRoads; const int IntersectionLocatorNode::ACTIVE_COLOUR = 13; const int IntersectionLocatorNode::INACTIVE_COLOUR = 22; const float IntersectionLocatorNode::SCALE = 1.0f * TEConstants::Scale; IntersectionLocatorNode::IntersectionLocatorNode() {}; IntersectionLocatorNode::~IntersectionLocatorNode() {}; //============================================================================== // IntersectionLocatorNode::creator //============================================================================== // Description: Comment // // Parameters: () // // Return: void // //============================================================================== void* IntersectionLocatorNode::creator() { return new IntersectionLocatorNode(); } //============================================================================== // IntersectionLocatorNode::initialize //============================================================================== // Description: Comment // // Parameters: () // // Return: MStatus // //============================================================================== MStatus IntersectionLocatorNode::initialize() { MStatus status; MFnTypedAttribute fnTyped; MFnMessageAttribute fnMessage; mType = fnTyped.create( TYPE_NAME_LONG, TYPE_NAME_SHORT, MFnData::kString, MObject::kNullObj, &status ); RETURN_STATUS_ON_FAILURE( status ); RETURN_STATUS_ON_FAILURE( addAttribute( mType ) ); mRoads = fnMessage.create( ROAD_LONG, ROAD_SHORT, &status ); RETURN_STATUS_ON_FAILURE( status ); RETURN_STATUS_ON_FAILURE( fnMessage.setReadable( false ) ); RETURN_STATUS_ON_FAILURE( fnMessage.setWritable( true ) ); RETURN_STATUS_ON_FAILURE( fnMessage.setArray( true ) ); RETURN_STATUS_ON_FAILURE( fnMessage.setIndexMatters( false ) ); RETURN_STATUS_ON_FAILURE( addAttribute( mRoads ) ); return MS::kSuccess; } //============================================================================== // IntersectionLocatorNode::postConstructor //============================================================================== // Description: Comment // // Parameters: () // // Return: void // //============================================================================== void IntersectionLocatorNode::postConstructor() { } //============================================================================== // IntersectionLocatorNode::draw //============================================================================== // Description: Comment // // Parameters: draw( M3dView & view, // const MDagPath & path, // M3dView::DisplayStyle style, // M3dView::DisplayStatus status ) // // Return: void // //============================================================================== void IntersectionLocatorNode::draw( M3dView & view, const MDagPath & path, M3dView::DisplayStyle style, M3dView::DisplayStatus status ) { view.beginGL(); glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT ); if ( status == M3dView::kDormant ) { int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR ); view.setDrawColor( colour, M3dView::kDormantColors ); } else { view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors ); } //Draw a star to represent the locator. GLExt::drawI( TEConstants::Scale ); GLExt::drawSphere( SCALE ); glPopAttrib(); view.endGL(); } //============================================================================== // IntersectionLocatorNode::Export //============================================================================== // Description: Comment // // Parameters: ( MObject& intersectionLocatorNode, tlHistory& history ) // // Return: tlDataChunk // //============================================================================== tlDataChunk* IntersectionLocatorNode::Export( MObject& intersectionLocatorNode, tlHistory& history ) { MFnDagNode fnNode( intersectionLocatorNode ); if ( fnNode.typeId() == IntersectionLocatorNode::id ) { tlIntersectionChunk* intersectionChunk = new tlIntersectionChunk; intersectionChunk->SetName( fnNode.name().asChar() ); MPoint thisPosition; MExt::GetWorldPosition( &thisPosition, intersectionLocatorNode ); tlPoint point; point[0] = thisPosition[0] / TEConstants::Scale; point[1] = thisPosition[1] / TEConstants::Scale; point[2] = -thisPosition[2] / TEConstants::Scale; //Maya vs. P3D... intersectionChunk->SetCentre( rmt::Vector( point ) ); //GetScale... MObject transform; transform = fnNode.parent( 0 ); MFnTransform fnTransform( transform ); MDagPath dagPath; MExt::FindDagNodeByName( &dagPath, fnTransform.name() ); TransformMatrix tm( dagPath ); double scaleX; fnTransform.findPlug( MString( "sx" ) ).getValue( scaleX ); intersectionChunk->SetRadius( (float)scaleX ); MPlug typePlug = fnNode.findPlug( mType ); MString type; typePlug.getValue( type ); if ( MString("NoStop") == type ) { intersectionChunk->SetType( 0 ); } else if ( MString("NWay") == type ) { intersectionChunk->SetType( 1 ); } else if ( MString("FourWay") == type ) { intersectionChunk->SetType( 2 ); } else if ( MString("NoStopN") == type ) { intersectionChunk->SetType( 3 ); } else //if ( MString("NWay") == type ) { intersectionChunk->SetType( 4 ); } return intersectionChunk; } assert( false ); return NULL; }