403 lines
12 KiB
C++
403 lines
12 KiB
C++
//=============================================================================
|
|
// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
|
|
//
|
|
// File: TreeLineContext.cpp
|
|
//
|
|
// Description: Implement TreeLineContext
|
|
//
|
|
// History: 27/05/2002 + Created -- Cary Brisebois
|
|
//
|
|
//=============================================================================
|
|
|
|
//========================================
|
|
// System Includes
|
|
//========================================
|
|
#include "precompiled/PCH.h"
|
|
|
|
//========================================
|
|
// Project Includes
|
|
//========================================
|
|
#include "contexts/TreeLineContext.h"
|
|
#include "utility/mext.h"
|
|
#include "main/constants.h"
|
|
#include "main/trackeditor.h"
|
|
#include "nodes/treelineshapenode.h"
|
|
|
|
|
|
|
|
//******************************************************************************
|
|
//
|
|
// Global Data, Local Data, Local Classes
|
|
//
|
|
//******************************************************************************
|
|
const char* TreeLineContext::stringId = "TreeLineContext";
|
|
MObject TreeLineContext::mCurrentTreeLine;
|
|
bool TreeLineContext::mWorking = false;
|
|
|
|
|
|
//******************************************************************************
|
|
//
|
|
// Public Member Functions
|
|
//
|
|
//******************************************************************************
|
|
|
|
//==============================================================================
|
|
// TreeLineContext::TreeLineContext
|
|
//==============================================================================
|
|
// Description: Constructor.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//==============================================================================
|
|
TreeLineContext::TreeLineContext() :
|
|
mXCurrent( 0 ),
|
|
mYCurrent( 0 )
|
|
{
|
|
SetHelpString();
|
|
|
|
setTitleString( "Ye Tree Line Tool" );
|
|
|
|
}
|
|
|
|
//==============================================================================
|
|
// TreeLineContext::~TreeLineContext
|
|
//==============================================================================
|
|
// Description: Destructor.
|
|
//
|
|
// Parameters: None.
|
|
//
|
|
// Return: N/A.
|
|
//
|
|
//==============================================================================
|
|
TreeLineContext::~TreeLineContext()
|
|
{
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::toolOnSetup
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( MEvent& )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TreeLineContext::toolOnSetup( MEvent& event )
|
|
{
|
|
setCursor( MCursor::crossHairCursor );
|
|
|
|
mPoints.clear();
|
|
mWorking = false;
|
|
mCurrentTreeLine = MObject::kNullObj;
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::toolOffCleanup
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TreeLineContext::toolOffCleanup()
|
|
{
|
|
mPoints.clear();
|
|
mCurrentTreeLine = MObject::kNullObj;
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::doPress
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( MEvent& event )
|
|
//
|
|
// Return: MStatus
|
|
//
|
|
//=============================================================================
|
|
MStatus TreeLineContext::doPress( MEvent& event )
|
|
{
|
|
event.getPosition( mXCurrent, mYCurrent );
|
|
ProcessState( BUTTONDOWN );
|
|
return MStatus::kSuccess;
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::doDrag
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( MEvent& event )
|
|
//
|
|
// Return: MStatus
|
|
//
|
|
//=============================================================================
|
|
MStatus TreeLineContext::doDrag( MEvent& event )
|
|
{
|
|
event.getPosition( mXCurrent, mYCurrent );
|
|
ProcessState( MOUSEDRAG );
|
|
return MStatus::kSuccess;
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::doRelease
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( MEvent& event )
|
|
//
|
|
// Return: MStatus
|
|
//
|
|
//=============================================================================
|
|
MStatus TreeLineContext::doRelease( MEvent& event )
|
|
{
|
|
if ( event.mouseButton() == MEvent::kLeftMouse )
|
|
{
|
|
event.getPosition( mXCurrent, mYCurrent );
|
|
ProcessState( BUTTONUP );
|
|
}
|
|
|
|
return MStatus::kSuccess;
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::doHold
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( MEvent& event )
|
|
//
|
|
// Return: MStatus
|
|
//
|
|
//=============================================================================
|
|
MStatus TreeLineContext::doHold( MEvent& event )
|
|
{
|
|
return MStatus::kSuccess;
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::doEnterRegion
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( MEvent& event )
|
|
//
|
|
// Return: MStatus
|
|
//
|
|
//=============================================================================
|
|
MStatus TreeLineContext::doEnterRegion( MEvent& event )
|
|
{
|
|
SetHelpString();
|
|
|
|
return MStatus::kSuccess;
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::deleteAction
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TreeLineContext::deleteAction()
|
|
{
|
|
ProcessState( DELETED );
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::completeAction
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TreeLineContext::completeAction()
|
|
{
|
|
ProcessState( COMPLETED );
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::abortAction
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TreeLineContext::abortAction()
|
|
{
|
|
ProcessState( ABORTED );
|
|
}
|
|
|
|
//******************************************************************************
|
|
//
|
|
// Private Member Functions
|
|
//
|
|
//******************************************************************************
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::ProcessState
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( Stimulus stimulus )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TreeLineContext::ProcessState( Stimulus stimulus )
|
|
{
|
|
switch( stimulus )
|
|
{
|
|
case BUTTONDOWN:
|
|
{
|
|
}
|
|
break;
|
|
|
|
case BUTTONUP:
|
|
{
|
|
if ( !mWorking )
|
|
{
|
|
//Let's create our working Treeline!
|
|
MObject transform;
|
|
MString name( TETreeLine::TreelineShapeNode::stringId );
|
|
MExt::CreateNode( &mCurrentTreeLine,
|
|
&transform,
|
|
MString( TETreeLine::TreelineShapeNode::stringId ),
|
|
&name );
|
|
mWorking = true;
|
|
|
|
MFnTransform fnTransform( transform );
|
|
fnTransform.findPlug( MString("translate") ).setLocked( true );
|
|
fnTransform.findPlug( MString("rotate") ).setLocked( true );
|
|
fnTransform.findPlug( MString("scale") ).setLocked( true );
|
|
|
|
TrackEditor::AddChild( mCurrentTreeLine );
|
|
}
|
|
|
|
//Set the position
|
|
MPoint intersectPoint;
|
|
if ( !MExt::MeshClickIntersect( mXCurrent, mYCurrent, intersectPoint ) )
|
|
{
|
|
//Put it at 0.
|
|
MPoint vp( mXCurrent, mYCurrent, 0 );
|
|
MExt::ViewToWorldAtY( &intersectPoint, vp, 0 ); //This is to y = 0
|
|
}
|
|
|
|
intersectPoint = intersectPoint / TEConstants::Scale;
|
|
|
|
MStatus status;
|
|
MFnDependencyNode fnDepNode( mCurrentTreeLine );
|
|
|
|
MPlug verticesPlug = fnDepNode.findPlug( TETreeLine::TreelineShapeNode::mControlPoints, &status );
|
|
assert( status );
|
|
|
|
unsigned int elementCount = verticesPlug.numElements();
|
|
MPlug vertex = verticesPlug.elementByLogicalIndex( elementCount, &status );
|
|
assert( status );
|
|
|
|
MPlug x = vertex.child( TETreeLine::TreelineShapeNode::mControlValueX, &status );
|
|
assert( status );
|
|
|
|
x.setValue( intersectPoint.x * TEConstants::Scale );
|
|
|
|
MPlug y = vertex.child( TETreeLine::TreelineShapeNode::mControlValueY, &status );
|
|
assert( status );
|
|
y.setValue( intersectPoint.y * TEConstants::Scale );
|
|
|
|
MPlug z = vertex.child( TETreeLine::TreelineShapeNode::mControlValueZ, &status );
|
|
assert( status );
|
|
z.setValue( intersectPoint.z * TEConstants::Scale );
|
|
|
|
MGlobal::select( mCurrentTreeLine, MGlobal::kReplaceList );
|
|
}
|
|
break;
|
|
case DELETED:
|
|
{
|
|
DeleteLast();
|
|
}
|
|
break;
|
|
case ABORTED:
|
|
case COMPLETED:
|
|
{
|
|
//Start new treeline
|
|
mWorking = false;
|
|
mCurrentTreeLine = MObject::kNullObj;
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
}
|
|
break;
|
|
}
|
|
|
|
SetHelpString();
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::AddPoint
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ( MPoint& point )
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TreeLineContext::AddPoint( MPoint& point )
|
|
{
|
|
mPoints.append( point );
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::DeleteLast
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TreeLineContext::DeleteLast()
|
|
{
|
|
unsigned int size = mPoints.length();
|
|
|
|
if ( size )
|
|
{
|
|
MStatus status;
|
|
|
|
mPoints.remove( size - 1 );
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// TreeLineContext::SetHelpString
|
|
//=============================================================================
|
|
// Description: Comment
|
|
//
|
|
// Parameters: ()
|
|
//
|
|
// Return: void
|
|
//
|
|
//=============================================================================
|
|
void TreeLineContext::SetHelpString()
|
|
{
|
|
mHelp = "Click to place vertices in the line.";
|
|
|
|
setHelpString( mHelp );
|
|
}
|