Torque3D/Engine/modules/Verve/VActor/VInterpController.h
2019-03-07 16:23:41 -06:00

207 lines
6.3 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.
//-----------------------------------------------------------------------------
#ifndef _VT_VINTERPCONTROLLER_H_
#define _VT_VINTERPCONTROLLER_H_
#ifndef _MATH_H_
#include "math/mMath.h"
#endif
//-----------------------------------------------------------------------------
class VInterpController
{
protected:
Point3F mPosition[2];
QuatF mRotation[2];
public:
//-------------------------------------------------------------------------
// Interpolation Methods.
//-------------------------------------------------------------------------
/// Get Position.
Point3F getPosition( const F32 &pDelta )
{
// Interpolate Position.
Point3F interpPosition;
interpPosition.interpolate( mPosition[1], mPosition[0], pDelta );
// Return Interpolated Point.
return interpPosition;
};
/// Get Rotation.
QuatF getRotation( const F32 &pDelta )
{
// Interpolate Rotation.
QuatF interpRotation;
interpRotation.interpolate( mRotation[1], mRotation[0], pDelta );
// Return Interpolated Quat.
return interpRotation;
};
/// Get Transform.
MatrixF getTransform( const F32 &pDelta )
{
// Get Position.
const Point3F interpPosition = getPosition( pDelta );
// Get Rotation.
const QuatF interpRotation = getRotation( pDelta );
// Setup Matrix.
MatrixF transform;
interpRotation.setMatrix( &transform );
// Set Position.
transform.setPosition( interpPosition );
// Return Matrix.
return transform;
};
//-------------------------------------------------------------------------
// Delta Methods.
//-------------------------------------------------------------------------
/// Reset Delta.
void resetDelta( const Point3F &pPosition, const QuatF &pRotation )
{
mPosition[0] = mPosition[1] = pPosition;
mRotation[0] = mRotation[1] = pRotation;
};
/// Reset Delta.
void resetDelta( const MatrixF &pMatrix )
{
// Setup Quat.
QuatF rotationQuat( pMatrix );
// Reset Delta.
resetDelta( pMatrix.getPosition(), rotationQuat );
};
/// Reset Delta (Vector)
void resetDelta( const Point3F &pPosition, const VectorF &pForwardVector )
{
// Assert.
AssertFatal( pForwardVector.isUnitLength(), "VInterpController::resetDelta() - Forward Vector hasn't been Normalized." );
// Static Up Vector.
static const VectorF sUpVector( 0.f, 0.f, 1.f );
// X-Axis.
VectorF xVec = mCross( pForwardVector, sUpVector );
xVec.normalize();
// Z-Axis.
VectorF zVec = mCross( xVec, pForwardVector );
zVec.normalize();
// Setup Object Transform.
MatrixF transform;
transform.setColumn( 0, xVec );
transform.setColumn( 1, pForwardVector );
transform.setColumn( 2, zVec );
transform.setColumn( 3, pPosition );
// Reset Delta.
resetDelta( transform );
};
/// Reset Delta (AngAxis)
void resetDelta( const Point3F &pPosition, const AngAxisF &pAngAxis )
{
// Setup Matrix.
MatrixF transform;
pAngAxis.setMatrix( &transform );
// Set Position.
transform.setPosition( pPosition );
// Reset Delta.
resetDelta( transform );
};
/// Push Delta.
void pushDelta( const Point3F &pPosition, const QuatF &pRotation )
{
mPosition[1] = pPosition;
mRotation[1] = pRotation;
};
/// Push Delta (Matrix)
void pushDelta( const MatrixF &pMatrix )
{
// Setup Quat.
QuatF rotationQuat( pMatrix );
// Push Delta.
pushDelta( pMatrix.getPosition(), rotationQuat );
};
/// Push Delta (Vector)
void pushDelta( const Point3F &pPosition, const VectorF &pForwardVector )
{
// Assert.
AssertFatal( pForwardVector.isUnitLength(), "VInterpController::pushDelta() - Forward Vector hasn't been Normalized." );
// Static Up Vector.
static const VectorF sUpVector( 0.f, 0.f, 1.f );
// X-Axis.
VectorF xVec = mCross( pForwardVector, sUpVector );
xVec.normalize();
// Z-Axis.
VectorF zVec = mCross( xVec, pForwardVector );
zVec.normalize();
// Setup Object Transform.
MatrixF transform;
transform.setColumn( 0, xVec );
transform.setColumn( 1, pForwardVector );
transform.setColumn( 2, zVec );
transform.setColumn( 3, pPosition );
// Push Delta.
pushDelta( transform );
};
/// Push Delta (AngAxis)
void pushDelta( const Point3F &pPosition, const AngAxisF &pAngAxis )
{
// Setup Matrix.
MatrixF transform;
pAngAxis.setMatrix( &transform );
// Set Position.
transform.setPosition( pPosition );
// Push Delta.
pushDelta( transform );
};
/// Pop Delta.
void popDelta( void )
{
mPosition[0] = mPosition[1];
mRotation[0] = mRotation[1];
};
};
#endif // _VT_VINTERPCONTROLLER_H_