585 lines
22 KiB
C++
585 lines
22 KiB
C++
//=============================================================================
|
|
// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
|
|
//
|
|
// File: RailCamLocatorNode.cpp
|
|
//
|
|
// Description: Implement RailCamLocatorNode
|
|
//
|
|
// History: 18/07/2002 + Created -- Cary Brisebois
|
|
//
|
|
//=============================================================================
|
|
|
|
//========================================
|
|
// System Includes
|
|
//========================================
|
|
#include "main/toolhack.h"
|
|
#include <toollib.hpp>
|
|
#include <p3d/pointcamera.hpp>
|
|
|
|
//========================================
|
|
// Project Includes
|
|
//========================================
|
|
#include "RailCamLocatorNode.h"
|
|
#include "main/constants.h"
|
|
#include "main/worldbuilder.h"
|
|
#include "utility/glext.h"
|
|
#include "utility/mext.h"
|
|
#include "nodes/triggervolumenode.h"
|
|
#include "utility/nodehelper.h"
|
|
|
|
#include "gameengine/gameengine.h"
|
|
#include "gameengine/wbcamtarget.h"
|
|
|
|
#include "resources/resource.h"
|
|
|
|
#include "../../../game/code/camera/railcam.h"
|
|
|
|
//******************************************************************************
|
|
//
|
|
// Global Data, Local Data, Local Classes
|
|
//
|
|
//******************************************************************************
|
|
MTypeId RailCamLocatorNode::id( WBConstants::TypeIDPrefix, WBConstants::NodeIDs::RailCamLocator );
|
|
const char* RailCamLocatorNode::stringId = "RailCamLocatorNode";
|
|
|
|
const int RailCamLocatorNode::ACTIVE_COLOUR = 15;
|
|
const int RailCamLocatorNode::INACTIVE_COLOUR = 12;
|
|
const float RailCamLocatorNode::SCALE = 1.0f * WBConstants::Scale;
|
|
|
|
const char* RailCamLocatorNode::RAIL_NAME_SHORT = "rail";
|
|
const char* RailCamLocatorNode::RAIL_NAME_LONG = "camRail";
|
|
MObject RailCamLocatorNode::sRail;
|
|
|
|
const char* RailCamLocatorNode::BEHAVIOUR_NAME_SHORT = "behav";
|
|
const char* RailCamLocatorNode::BEHAVIOUR_NAME_LONG = "behaviour";
|
|
MObject RailCamLocatorNode::sBehaviour;
|
|
|
|
const char* RailCamLocatorNode::MIN_RADIUS_NAME_SHORT = "minR";
|
|
const char* RailCamLocatorNode::MIN_RADIUS_NAME_LONG = "minRadius";
|
|
MObject RailCamLocatorNode::sMinRadius;
|
|
|
|
const char* RailCamLocatorNode::MAX_RADIUS_NAME_SHORT = "maxR";
|
|
const char* RailCamLocatorNode::MAX_RADIUS_NAME_LONG = "maxRadius";
|
|
MObject RailCamLocatorNode::sMaxRadius;
|
|
|
|
const char* RailCamLocatorNode::TRACK_RAIL_NAME_SHORT = "trkRl";
|
|
const char* RailCamLocatorNode::TRACK_RAIL_NAME_LONG = "trackRail";
|
|
MObject RailCamLocatorNode::sTrackRail;
|
|
|
|
const char* RailCamLocatorNode::TRACK_DIST_NAME_SHORT = "tDst";
|
|
const char* RailCamLocatorNode::TRACK_DIST_NAME_LONG = "trackDist";
|
|
MObject RailCamLocatorNode::sTrackDist;
|
|
|
|
const char* RailCamLocatorNode::REVERSE_SENSE_NAME_SHORT ="rvsns";
|
|
const char* RailCamLocatorNode::REVERSE_SENSE_NAME_LONG = "reverseSense";
|
|
MObject RailCamLocatorNode::sReverseSense;
|
|
|
|
|
|
const char* RailCamLocatorNode::FOV_NAME_SHORT = "fov";
|
|
const char* RailCamLocatorNode::FOV_NAME_LONG = "fieldOfView";
|
|
MObject RailCamLocatorNode::sFOV;
|
|
|
|
const char* RailCamLocatorNode::FACING_OFFSET_NAME_SHORT = "facoff";
|
|
const char* RailCamLocatorNode::FACING_OFFSET_NAME_LONG = "facingOffset";
|
|
MObject RailCamLocatorNode::sFacingOffset;
|
|
|
|
const char* RailCamLocatorNode::AXIS_PLAY_NAME_SHORT = "axsply";
|
|
const char* RailCamLocatorNode::AXIS_PLAY_NAME_LONG = "axisPlay";
|
|
MObject RailCamLocatorNode::sAxisPlay;
|
|
|
|
const char* RailCamLocatorNode::ACTIVE_NAME_SHORT = "act";
|
|
const char* RailCamLocatorNode::ACTIVE_NAME_LONG = "active";
|
|
MObject RailCamLocatorNode::sActive;
|
|
|
|
const char* RailCamLocatorNode::TARGET_NAME_SHORT = "trg";
|
|
const char* RailCamLocatorNode::TARGET_NAME_LONG = "target";
|
|
MObject RailCamLocatorNode::sTarget;
|
|
|
|
const char* RailCamLocatorNode::POS_LAG_NAME_SHORT = "plg";
|
|
const char* RailCamLocatorNode::POS_LAG_NAME_LONG = "positionLag";
|
|
MObject RailCamLocatorNode::sPositionLag;
|
|
|
|
const char* RailCamLocatorNode::TARGET_LAG_NAME_SHORT = "trglg";
|
|
const char* RailCamLocatorNode::TARGET_LAG_NAME_LONG = "targetLag";
|
|
MObject RailCamLocatorNode::sTargetLag;
|
|
|
|
const char* RailCamLocatorNode::TRANSITION_TO_RATE_NAME_LONG = "transitionTo";
|
|
const char* RailCamLocatorNode::TRANSITION_TO_RATE_NAME_SHORT = "trnto";
|
|
MObject RailCamLocatorNode::sTransitionToRate;
|
|
|
|
const char* RailCamLocatorNode::NOFOV_NAME_LONG = "noFOV";
|
|
const char* RailCamLocatorNode::NOFOV_NAME_SHORT = "nf";
|
|
MObject RailCamLocatorNode::sNoFOV;
|
|
|
|
const char* RailCamLocatorNode::CAR_ONLY_NAME_LONG = "carOnly";
|
|
const char* RailCamLocatorNode::CAR_ONLY_NAME_SHORT = "co";
|
|
MObject RailCamLocatorNode::sCarOnly;
|
|
|
|
const char* RailCamLocatorNode::ON_FOOT_ONLY_NAME_LONG = "onFootOnly";
|
|
const char* RailCamLocatorNode::ON_FOOT_ONLY_NAME_SHORT = "ofo";
|
|
MObject RailCamLocatorNode::sOnFootOnly;
|
|
|
|
const char* RailCamLocatorNode::CUTALL_NAME_LONG = "cutInOut";
|
|
const char* RailCamLocatorNode::CUTALL_NAME_SHORT = "cin";
|
|
MObject RailCamLocatorNode::sCutAll;
|
|
|
|
const char* RailCamLocatorNode::RESET_NAME_LONG = "reset";
|
|
const char* RailCamLocatorNode::RESET_NAME_SHORT = "rst";
|
|
MObject RailCamLocatorNode::sReset;
|
|
|
|
char RailCamLocatorNode::sNewName[MAX_NAME_LEN];
|
|
|
|
//******************************************************************************
|
|
//
|
|
// Callbacks
|
|
//
|
|
//******************************************************************************
|
|
|
|
BOOL CALLBACK RailCamLocatorNameCallBack( HWND hWnd, UINT uMsg, UINT wParam, long lParam )
|
|
{
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
SetDlgItemText( hWnd, IDC_EDIT2, WorldBuilder::GetPrefix() );
|
|
return true;
|
|
}
|
|
break;
|
|
case WM_COMMAND:
|
|
{
|
|
if ( LOWORD(wParam) == IDC_BUTTON1 || LOWORD(wParam) == IDOK )
|
|
{
|
|
//Get the entry in the text field.
|
|
char name[RailCamLocatorNode::MAX_NAME_LEN];
|
|
GetDlgItemText( hWnd, IDC_EDIT1, name, RailCamLocatorNode::MAX_NAME_LEN );
|
|
|
|
if ( strcmp(name, "") == 0 )
|
|
{
|
|
MExt::DisplayWarning("You must input a new name for the RailCam Locator!");
|
|
return false;
|
|
}
|
|
|
|
MString newName( WorldBuilder::GetPrefix() );
|
|
newName += MString( name );
|
|
|
|
RailCamLocatorNode::SetNewName( newName.asChar() );
|
|
EndDialog( hWnd, 0 ); //this is how you close the window.
|
|
return true;
|
|
}
|
|
else if( LOWORD(wParam) == IDCANCEL )
|
|
{
|
|
RailCamLocatorNode::SetNewName( "" );
|
|
EndDialog( hWnd, 0 ); //this is how you close the window.
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
return false;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Public Member Functions
|
|
//
|
|
//*****************************************************************************
|
|
|
|
//=============================================================================
|
|
// RailCamLocatorNode::RailCamLocatorNode
|
|
//=============================================================================
|
|
// Description: Constructor.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//=============================================================================
|
|
RailCamLocatorNode::RailCamLocatorNode()
|
|
{
|
|
mRailCam = new RailCam();
|
|
mRailCam->AddRef();
|
|
mRailCam->SetPlayerID( 0 );
|
|
|
|
mRailCam->SetCamera( new tPointCamera() );
|
|
|
|
mCamTarget = new WBCamTarget();
|
|
}
|
|
|
|
//=============================================================================
|
|
// RailCamLocatorNode::~RailCamLocatorNode
|
|
//=============================================================================
|
|
// Description: Destructor.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//=============================================================================
|
|
RailCamLocatorNode::~RailCamLocatorNode()
|
|
{
|
|
mRailCam->Release();
|
|
mRailCam = NULL;
|
|
|
|
if ( mCamTarget )
|
|
{
|
|
delete mCamTarget;
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// RailCamLocatorNode::creator
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void* RailCamLocatorNode::creator()
|
|
{
|
|
return new RailCamLocatorNode();
|
|
}
|
|
|
|
//=============================================================================
|
|
// RailCamLocatorNode::draw
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( M3dView& view, const MDagPath& path, M3dView::DisplayStyle displayStyle, M3dView::DisplayStatus displayStatus )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void RailCamLocatorNode::draw( M3dView& view,
|
|
const MDagPath& path,
|
|
M3dView::DisplayStyle displayStyle,
|
|
M3dView::DisplayStatus displayStatus )
|
|
{
|
|
if ( WorldBuilder::GetDisplayLevel() & WorldBuilder::RAILCAM_LOCATORS )
|
|
{
|
|
view.beginGL();
|
|
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
|
|
|
|
//When we are in render mode, we draw the lines between the nodes.
|
|
//If this was in GL_SELECTION_MODE, we would not draw the lines, so they won't interfere
|
|
//with selection.
|
|
GLint value;
|
|
glGetIntegerv( GL_RENDER_MODE, &value );
|
|
|
|
//Draw things here we don't want selectable.
|
|
if ( (value == GL_RENDER) )
|
|
{
|
|
}
|
|
|
|
if ( displayStatus == M3dView::kDormant )
|
|
{
|
|
int colour = NodeHelper::OverrideNodeColour( thisMObject(), INACTIVE_COLOUR );
|
|
|
|
view.setDrawColor( colour, M3dView::kDormantColors );
|
|
}
|
|
else
|
|
{
|
|
view.setDrawColor( ACTIVE_COLOUR, M3dView::kActiveColors );
|
|
}
|
|
|
|
GameEngine::GetInstance()->UpdateRailCam( thisMObject() );
|
|
|
|
//Draw a star to represent the locator.
|
|
GLExt::drawCrossHair3D( SCALE, 0,0,0, 5.0 );
|
|
|
|
glPopAttrib();
|
|
view.endGL();
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// RailCamLocatorNode::initialize
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: MStatus
|
|
//
|
|
//=============================================================================
|
|
MStatus RailCamLocatorNode::initialize()
|
|
{
|
|
MFnMessageAttribute msgAttr;
|
|
MStatus status;
|
|
|
|
sRail = msgAttr.create( RAIL_NAME_LONG, RAIL_NAME_SHORT, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( msgAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( msgAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sRail ) );
|
|
|
|
MFnEnumAttribute enumAttr;
|
|
sBehaviour = enumAttr.create( BEHAVIOUR_NAME_LONG, BEHAVIOUR_NAME_SHORT, RailCam::PROJECTION, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( enumAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( enumAttr.setWritable( true ) );
|
|
|
|
unsigned int i;
|
|
for ( i = 1; i < RailCam::NUM_BEHAVIOUR; ++i )
|
|
{
|
|
RETURN_STATUS_ON_FAILURE( enumAttr.addField( MString( RailCam::BehaviourNames[i-1] ), i ) );
|
|
}
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sBehaviour ) );
|
|
|
|
MFnNumericAttribute numericAttr;
|
|
sMinRadius = numericAttr.create( MIN_RADIUS_NAME_LONG, MIN_RADIUS_NAME_SHORT, MFnNumericData::kFloat, 1.0f, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMax(30.0f) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sMinRadius ) );
|
|
|
|
sMaxRadius = numericAttr.create( MAX_RADIUS_NAME_LONG, MAX_RADIUS_NAME_SHORT, MFnNumericData::kFloat, 2.0f, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMax(30.0f) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sMaxRadius ) );
|
|
|
|
sTrackRail = numericAttr.create( TRACK_RAIL_NAME_LONG, TRACK_RAIL_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sTrackRail ) );
|
|
|
|
sTrackDist = numericAttr.create( TRACK_DIST_NAME_LONG, TRACK_DIST_NAME_SHORT, MFnNumericData::kFloat, 0.0f, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMin(-5.0f) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMax(5.0f) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setDefault( 0.0f ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sTrackDist ) );
|
|
|
|
sReverseSense = numericAttr.create( REVERSE_SENSE_NAME_LONG, REVERSE_SENSE_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sReverseSense ) );
|
|
|
|
sFOV = numericAttr.create( FOV_NAME_LONG, FOV_NAME_SHORT, MFnNumericData::kInt, 90, &status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMax(180.0f) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sFOV ) );
|
|
|
|
sFacingOffset = numericAttr.create( FACING_OFFSET_NAME_LONG, FACING_OFFSET_NAME_SHORT, MFnNumericData::k3Float, 0.0f, &status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sFacingOffset ) );
|
|
|
|
sAxisPlay = numericAttr.create( AXIS_PLAY_NAME_LONG, AXIS_PLAY_NAME_SHORT, MFnNumericData::k3Float, 0.0f, &status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sAxisPlay ) );
|
|
|
|
sActive = numericAttr.create( ACTIVE_NAME_LONG, ACTIVE_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sActive ) );
|
|
|
|
MFnTypedAttribute typedAttr;
|
|
sTarget = typedAttr.create( TARGET_NAME_LONG, TARGET_NAME_SHORT, MFnData::kString, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( typedAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( typedAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sTarget ) );
|
|
|
|
sPositionLag = numericAttr.create( POS_LAG_NAME_LONG, POS_LAG_NAME_SHORT, MFnNumericData::kFloat, 0.04f, &status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMax(1.0f) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sPositionLag ) );
|
|
|
|
sTargetLag = numericAttr.create( TARGET_LAG_NAME_LONG, TARGET_LAG_NAME_SHORT, MFnNumericData::kFloat, 0.04f, &status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMax(1.0f) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sTargetLag ) );
|
|
|
|
sTransitionToRate = numericAttr.create( TRANSITION_TO_RATE_NAME_LONG, TRANSITION_TO_RATE_NAME_SHORT, MFnNumericData::kFloat, 0.04f, &status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMin(0.0f) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setMax(1.0f) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sTransitionToRate ) );
|
|
|
|
sNoFOV = numericAttr.create( NOFOV_NAME_LONG, NOFOV_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sNoFOV ) );
|
|
|
|
sCarOnly = numericAttr.create( CAR_ONLY_NAME_LONG, CAR_ONLY_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sCarOnly ) );
|
|
|
|
sOnFootOnly = numericAttr.create( ON_FOOT_ONLY_NAME_LONG, ON_FOOT_ONLY_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sOnFootOnly ) );
|
|
|
|
sCutAll = numericAttr.create( CUTALL_NAME_LONG, CUTALL_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sCutAll ) );
|
|
|
|
sReset = numericAttr.create( RESET_NAME_LONG, RESET_NAME_SHORT, MFnNumericData::kBoolean, false, &status );
|
|
RETURN_STATUS_ON_FAILURE( status );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setReadable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( numericAttr.setWritable( true ) );
|
|
RETURN_STATUS_ON_FAILURE( addAttribute( sReset ) );
|
|
|
|
return MStatus::kSuccess;
|
|
}
|
|
|
|
//=============================================================================
|
|
// RailCamLocatorNode::postConstructor
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void RailCamLocatorNode::postConstructor()
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// RailCamLocatorNode::Export
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( MObject& railCamLocatorNode )
|
|
//
|
|
// Return: tlDataChunk
|
|
//
|
|
//=============================================================================
|
|
tlDataChunk* RailCamLocatorNode::Export( MObject& railCamLocatorNode )
|
|
{
|
|
MFnDagNode fnNode( railCamLocatorNode );
|
|
|
|
if ( fnNode.typeId() == RailCamLocatorNode::id )
|
|
{
|
|
tlWBRailCamChunk* railChunk = new tlWBRailCamChunk();
|
|
assert( railChunk );
|
|
|
|
railChunk->SetName( fnNode.name().asChar() );
|
|
|
|
int behaviour;
|
|
fnNode.findPlug( sBehaviour ).getValue( behaviour );
|
|
railChunk->SetBehaviour( (RailCam::Behaviour)(behaviour) );
|
|
|
|
float minRad;
|
|
fnNode.findPlug( sMinRadius ).getValue( minRad );
|
|
railChunk->SetMinRadius( minRad );
|
|
|
|
float maxRad;
|
|
fnNode.findPlug( sMaxRadius ).getValue( maxRad );
|
|
railChunk->SetMaxRadius( maxRad );
|
|
|
|
bool trackRail;
|
|
fnNode.findPlug( sTrackRail ).getValue( trackRail );
|
|
railChunk->SetTrackRail( trackRail ? 1 : 0 );
|
|
|
|
float trackDist;
|
|
fnNode.findPlug( sTrackDist ).getValue( trackDist );
|
|
railChunk->SetTrackDist( trackDist );
|
|
|
|
bool reverseSense;
|
|
fnNode.findPlug( sReverseSense ).getValue( reverseSense );
|
|
railChunk->SetReverseSense( reverseSense ? 1 : 0 );
|
|
|
|
float fov;
|
|
fnNode.findPlug( sFOV ).getValue( fov );
|
|
railChunk->SetFOV( fov );
|
|
|
|
float x, y, z;
|
|
fnNode.findPlug( sFacingOffset ).child( 0 ).getValue( x );
|
|
fnNode.findPlug( sFacingOffset ).child( 1 ).getValue( y );
|
|
fnNode.findPlug( sFacingOffset ).child( 2 ).getValue( z );
|
|
railChunk->SetTargetOffset( tlPoint( x, y, z ) );
|
|
|
|
// THIS IS A HACK. Since we're not going to support axis play. We're
|
|
// going to hide the transition rate in the data. Sorry.
|
|
// fnNode.findPlug( sAxisPlay ).child( 0 ).getValue( x );
|
|
// fnNode.findPlug( sAxisPlay ).child( 1 ).getValue( y );
|
|
// fnNode.findPlug( sAxisPlay ).child( 2 ).getValue( z );
|
|
fnNode.findPlug( sTransitionToRate ).getValue( x ); //transition rate.
|
|
|
|
//Now we're hiding the flags in the y.. THIS SUCKS!
|
|
bool noF = false;
|
|
fnNode.findPlug( sNoFOV ).getValue( noF );
|
|
y = (float)( noF ? 1 : 0 );
|
|
|
|
//This just GETS WORSE!
|
|
int values = 0;
|
|
|
|
bool carOnly = false;
|
|
fnNode.findPlug( sCarOnly ).getValue( carOnly );
|
|
values |= ( carOnly ? 0x00000001 : 0 );
|
|
|
|
bool cut = false;
|
|
fnNode.findPlug( sCutAll ).getValue( cut );
|
|
values |= ( cut ? 0x00000002 : 0 );
|
|
|
|
bool reset = false;
|
|
fnNode.findPlug( sReset ).getValue( reset );
|
|
values |= ( reset ? 0x00000004 : 0 );
|
|
|
|
bool onFootOnly = false;
|
|
fnNode.findPlug( sOnFootOnly ).getValue( onFootOnly );
|
|
values |= ( onFootOnly ? 0x00000008 : 0 );
|
|
|
|
if( carOnly && onFootOnly )
|
|
{
|
|
MExt::DisplayError( "Rail Camera: %s has onFootOnly and carOnly flags set!\n", fnNode.name().asChar() );
|
|
}
|
|
|
|
z = (float)values;
|
|
railChunk->SetAxisPlay( tlPoint( x, y, z ) );
|
|
|
|
float posLag;
|
|
fnNode.findPlug( sPositionLag ).getValue( posLag );
|
|
railChunk->SetPositionLag( posLag );
|
|
|
|
float targLag;
|
|
fnNode.findPlug( sTargetLag ).getValue( targLag );
|
|
railChunk->SetTargetLag( targLag );
|
|
|
|
return railChunk;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Private Member Functions
|
|
//
|
|
//*****************************************************************************
|