213 lines
6.5 KiB
C++
213 lines
6.5 KiB
C++
#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 <toollib.hpp>
|
|
|
|
|
|
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;
|
|
} |