mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
207 lines
6.3 KiB
C
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_
|