mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
354 lines
9.8 KiB
C++
354 lines
9.8 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Verve
|
|
// Copyright (C) 2014 - Violent Tulip
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
// IN THE SOFTWARE.
|
|
//-----------------------------------------------------------------------------
|
|
#include "VActorAnimationController.h"
|
|
|
|
#include "VActor.h"
|
|
#include "VActorData.h"
|
|
#include "VActorAnimationStates.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
VActorAnimationController::VActorAnimationController( void ) :
|
|
mObject( NULL )
|
|
{
|
|
// Void.
|
|
}
|
|
|
|
VActorAnimationController::~VActorAnimationController( void )
|
|
{
|
|
// Clear Table.
|
|
mAnimationTable.clear();
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// Initialisation Methods.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::initAnimationTable();
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
bool VActorAnimationController::initAnimationTable( void )
|
|
{
|
|
// Valid Object?
|
|
if ( !isValidObject() )
|
|
{
|
|
// No, Quit Now.
|
|
return false;
|
|
}
|
|
|
|
// Clear the Table.
|
|
mAnimationTable.clear();
|
|
|
|
// Fetch Sequence List.
|
|
VActorData::tAnimationSequenceVector *sequenceList = getObject()->getDataBlock()->getAnimationList();
|
|
|
|
// Initialise the Animation States.
|
|
for ( VActorData::tAnimationSequenceVector::iterator itr = sequenceList->begin();
|
|
itr != sequenceList->end();
|
|
itr++ )
|
|
{
|
|
// Fetch Sequence Definition.
|
|
const VActorData::sAnimationSequence &animSequence = ( *itr );
|
|
|
|
// Valid State?
|
|
if ( animSequence.State )
|
|
{
|
|
// Register Animation.
|
|
mAnimationTable.registerState( animSequence.State, animSequence.Priority );
|
|
}
|
|
}
|
|
|
|
// Sort the Table.
|
|
mAnimationTable.sort();
|
|
|
|
// Valid.
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::initAnimation( pThread, pIndex, pPosition, pTimeScale );
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
bool VActorAnimationController::initAnimation( sAnimationRef &pAnimation, const U32 &pIndex, const F32 &pPosition, const F32 &pTimeScale )
|
|
{
|
|
// Valid Object & Sequence?
|
|
if ( !isValidObject() || !isAnimationSequence( pIndex ) )
|
|
{
|
|
// No, Quit Now.
|
|
return false;
|
|
}
|
|
|
|
// Store as Current Animation.
|
|
pAnimation.Index = pIndex;
|
|
|
|
// Initialise Thread.
|
|
return initAnimationThread( pAnimation.Thread, pAnimation.Index, pPosition, pTimeScale );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::initAnimationThread( pThread, pIndex, pPosition, pTimeScale );
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
bool VActorAnimationController::initAnimationThread( TSThread *&pThread, const U32 &pIndex, const F32 &pPosition, const F32 &pTimeScale )
|
|
{
|
|
// Valid Object & Sequence?
|
|
if ( !isValidObject() || !isAnimationSequence( pIndex ) )
|
|
{
|
|
// No, Quit Now.
|
|
return false;
|
|
}
|
|
|
|
// Valid Thread?
|
|
if ( !pThread )
|
|
{
|
|
// Create a Thread.
|
|
pThread = getShapeInstance()->addThread();
|
|
}
|
|
|
|
// Init the Sequence.
|
|
getShapeInstance()->setSequence( pThread, getAnimationSequence( pIndex ), pPosition );
|
|
|
|
// Set Initial Time Scale.
|
|
getShapeInstance()->setTimeScale( pThread, pTimeScale );
|
|
|
|
// Valid.
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::initBaseAnimation( pThread, pIndex, pPosition, pTimeScale );
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
bool VActorAnimationController::initBaseAnimation( const U32 &pIndex, const F32 &pPosition, const F32 &pTimeScale )
|
|
{
|
|
return initAnimation( mBaseAnimation, pIndex, pPosition, pTimeScale );
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// Accessor Methods.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::isValidObject();
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
bool VActorAnimationController::isValidObject( void )
|
|
{
|
|
return ( mObject != NULL && mObject->getDataBlock() != NULL );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::getObject();
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
VActor *VActorAnimationController::getObject( void )
|
|
{
|
|
return mObject;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::setObject( pObject );
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void VActorAnimationController::setObject( VActor *pObject )
|
|
{
|
|
// Set Object.
|
|
mObject = pObject;
|
|
|
|
// Set Table's Reference.
|
|
mAnimationTable.setObject( pObject );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::getShape();
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
const TSShape *VActorAnimationController::getShape( void )
|
|
{
|
|
if ( !isValidObject() )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
return mObject->getShape();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::getShapeInstance();
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
TSShapeInstance *VActorAnimationController::getShapeInstance( void )
|
|
{
|
|
if ( !isValidObject() )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
return mObject->getShapeInstance();
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// Animation Methods
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void VActorAnimationController::update( const F32 &pDelta )
|
|
{
|
|
// Valid Objects?
|
|
if ( !isValidObject() )
|
|
{
|
|
// No, Quit Now.
|
|
return;
|
|
}
|
|
|
|
// Update Animation State.
|
|
mAnimationTable.execute();
|
|
|
|
// Advance Threads.
|
|
getShapeInstance()->advanceTime( pDelta, mBaseAnimation.Thread );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::isAnimationSequence( pIndex );
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
bool VActorAnimationController::isAnimationSequence( const U32 &pIndex )
|
|
{
|
|
return ( getAnimationSequence( pIndex ) != -1 );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::getAnimationSequence( pIndex );
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
S32 VActorAnimationController::getAnimationSequence( const U32 &pIndex )
|
|
{
|
|
// Valid Object?
|
|
if ( !mObject || !mObject->getDataBlock() )
|
|
{
|
|
// No, Invalid Sequence.
|
|
return -1;
|
|
}
|
|
|
|
// Return Sequence.
|
|
return mObject->getDataBlock()->getAnimationSequence( pIndex );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::getAnimation( pIndex );
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
U32 VActorAnimationController::getAnimation( void )
|
|
{
|
|
// Base Animation Initialised?
|
|
if ( !mBaseAnimation.Thread )
|
|
{
|
|
// Null.
|
|
return U32_MAX;
|
|
}
|
|
|
|
// Return Current Animation.
|
|
return mBaseAnimation.Index;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// VActorAnimationController::setAnimation( pIndex );
|
|
//
|
|
// ...
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void VActorAnimationController::setAnimation( const U32 &pIndex )
|
|
{
|
|
// Base Animation Initialised?
|
|
if ( !mBaseAnimation.Thread || mBaseAnimation.Index == pIndex )
|
|
{
|
|
// Don't Update.
|
|
return;
|
|
}
|
|
|
|
// Store as Current Animation.
|
|
mBaseAnimation.Index = pIndex;
|
|
|
|
// Fetch the Sequence.
|
|
const S32 &sequence = getAnimationSequence( pIndex );
|
|
|
|
// Valid?
|
|
if ( sequence != -1 )
|
|
{
|
|
// Play the Sequence.
|
|
getShapeInstance()->transitionToSequence( mBaseAnimation.Thread, sequence, 0.f, 0.15f, true );
|
|
//getShapeInstance()->setSequence( mBaseAnimation.Thread, sequence, 0.f );
|
|
}
|
|
} |