|
|
//============ Copyright (c) Valve Corporation, All rights reserved. ==========
//
// This is patterned after FbxAxisSystem
//
//=============================================================================
#ifndef DMEAXISSYSTEM_H
#define DMEAXISSYSTEM_H
#include "datamodel/dmelement.h"
//=============================================================================
//
// CDmeAxisSystem, an unambiguous definition of the axis system. Previously
// the terms Y Up and Z Up got thrown around a lot but they do not unambiguously
// specify a coordinate system.
//
// To define an axis system both the up axis and the parity of the axis system
// need to be specified. The parity is not an independent variable, it depends
// on the value of the up axis specified. Whichever axis is specified as the
// up axis leaves two remaining axes and even implies the first remaining
// axis, in alphabetical order, is the Forward axis.
//
// The Valve engine coordinate system has traditionally been +Z Up and
// +X as the forward axis. By specifying +Z as the up axis that leaves
// X & Y, since X is desired, that's even parity. It would be defined
// in Axis, Parity as:
//
// pDmeAxisSystem->Init( CDmeAxisSystem::AS_AXIS_Z, CDmeAxisSystem::AS_PARITY_EVEN );
//
// By default, Maya's coordinate system is +Y Up with +Z forward. Taking
// +Y as up leaves X & Z, since Z is 2nd, that's odd parity. i.e.
//
// pDmeAxisSystem->Init( CDmeAxisSystem::AS_AXIS_Y, CDmeAxisSystem::AS_PARITY_ODD );
//
//=============================================================================
class CDmeAxisSystem : public CDmElement { DEFINE_ELEMENT( CDmeAxisSystem, CDmElement );
public: enum Axis_t { AS_AXIS_NZ = -3, AS_AXIS_NY = -2, AS_AXIS_NX = -1, AS_AXIS_X = 1, AS_AXIS_Y = 2, AS_AXIS_Z = 3 };
enum ForwardParity_t { AS_PARITY_NODD = -2, AS_PARITY_NEVEN = -1, AS_PARITY_EVEN = 1, AS_PARITY_ODD = 2 };
enum CoordSys_t { AS_RIGHT_HANDED = 0, AS_LEFT_HANDED = 1 };
enum PredefinedAxisSystem { AS_INVALID = -1, // Invalid
AS_VALVE_ENGINE, // Up: +Z, Forward: +X
AS_SMD, // Up: +Z, Forward: -Y
AS_MAYA_YUP, // Up: +Y, Forward: +Z
AS_MAYA_ZUP, // Up: +Z, Forward: -Y
AS_MODO_YUP, // Up: +Y, Forward: +Z
AS_3DSMAX // Up: +Z, Forward: -Y
};
bool Init( Axis_t eUpAxis, ForwardParity_t eForwardParity, CoordSys_t eCoordSys = AS_RIGHT_HANDED ); bool Init( PredefinedAxisSystem nPredefinedAxisSystem ); // Returns true if the specified eUpAxis, eForward and eCoordSys are all valid values together
static bool IsValid( Axis_t eUpAxis, ForwardParity_t eForwardAxis, CoordSys_t eCoordSys = AS_RIGHT_HANDED ); bool IsValid() const;
// Returns the upAxis, forwardParity & coordSys for the specified predefined axisSystem
static bool GetPredefinedAxisSystem( Axis_t &eUpAxis, ForwardParity_t &eForwardParity, CoordSys_t &eCoordSys, PredefinedAxisSystem ePredefinedAxisSystem );
// Specifies whether this CDmeAxisSystem is the same as the predefined axis system specified
bool IsEqual( PredefinedAxisSystem ePredefinedAxisSystem ) const;
// Returns one of [ AS_AXIS_NX, AS_AXIS_NY, AS_AXIS_NZ, AS_AXIS_X, AS_AXIS_Y, AS_AXIS_Z ] from m_nUpAxis
Axis_t GetUpAxis() const;
// Returns one of [ AS_PARITY_NEVEN, AS_PARITY_NODD, AS_PARITY_EVEN, AS_PARITY_ODD ] from m_nForwardParity
ForwardParity_t GetForwardParity() const;
// Returns one of [ AS_LEFT_HANDED, AS_RIGHT_HANDED ] from m_nCoordSys
CoordSys_t GetCoordSys() const;
// Get the matrix to convert the identity to this axis system
static void ComputeMatrix( matrix3x4a_t &mMatrix, PredefinedAxisSystem ePredefinedAxisSystem );
// Get the matrix to convert data from the specified axis system to the specified axis system
static void GetConversionMatrix( matrix3x4a_t &mMat, PredefinedAxisSystem eFromAxisSystem, PredefinedAxisSystem eToAxisSystem );
static void GetConversionMatrix( matrix3x4a_t &mMat, Axis_t eFromUpAxis, ForwardParity_t eFromForwardParity, Axis_t eToUpAxis, ForwardParity_t eToForwardParity );
static void GetConversionMatrix( matrix3x4a_t &mMat, Axis_t eFromUpAxis, ForwardParity_t eFromForwardParity, CoordSys_t eFromCoordSys, Axis_t eToUpAxis, ForwardParity_t eToForwardParity, CoordSys_t eToCoordSys );
static CUtlString GetAxisString( Axis_t eUpAxis, ForwardParity_t eForwardParity, CoordSys_t eCoordSys );
protected: // Returns one of [ AS_AXIS_X, AS_AXIS_Y, AS_AXIS_Z ] along with one of [ -1, 1 ] to indicate the sign
Axis_t GetAbsUpAxisAndSign( int &nSign ) const;
// Returns one of [ AS_PARITY_EVEN, AS_PARITY_ODD ] along with one of [ -1, 1 ] to indicate the sign
ForwardParity_t GetAbsForwardParityAndSign( int &nSign ) const;
// Returns one of [ AS_AXIS_X, AS_AXIS_Y, AS_AXIS_Z ] along with one of [ -1, 1 ] to indicate the sign
Axis_t ComputeAbsForwardAxisAndSign( int &nSign ) const;
// Returns one of [ AS_AXIS_X, AS_AXIS_Y, AS_AXIS_Z ] along with one of [ -1, 1 ] to indicate the sign
Axis_t ComputeLeftAxis( int &nSign ) const;
// Computes the matrix for the specified upAxis, forwardParity and coordSys values
static void ComputeMatrix( matrix3x4a_t &mMatrix, Axis_t eUpAxis, ForwardParity_t eForwardParity, CoordSys_t eCoordSys );
CDmaVar< int > m_nUpAxis; // [ +/- AS_AXIS_X, +/- AS_AXIS_Y, +/- AS_AXIS_Z ]
CDmaVar< int > m_nForwardParity; // [ +/- AS_PARITY_EVEN, +/- AS_PARITY_ODD ]
CDmaVar< int > m_nCoordSys; // [ AS_RIGHT_HANDED, AS_LEFT_HANDED ]
};
#endif // DMEAXISSYSTEM_H
|