Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

211 lines
8.6 KiB

//====== Copyright © 1996-2004, Valve Corporation, All rights reserved. =====//
//
// Dme version of a skeletal model (gets compiled into a MDL)
//
//===========================================================================//
#ifndef DMEMODEL_H
#define DMEMODEL_H
#ifdef _WIN32
#pragma once
#endif
#include "tier1/utlstack.h"
#include "tier1/utlstringtoken.h"
#include "movieobjects/dmejoint.h"
#include "movieobjects/dmetransformlist.h"
#include "movieobjects/dmeaxissystem.h"
class CDmeDrawSettings;
class CDmeMesh;
//-----------------------------------------------------------------------------
// A class representing a skeletal model
//-----------------------------------------------------------------------------
class CDmeModel : public CDmeDag
{
DEFINE_ELEMENT( CDmeModel, CDmeDag );
public:
// Add joint
CDmeJoint *AddJoint( const char *pJointName, CDmeDag *pParent = NULL );
int AddJoint( CDmeDag *pJoint );
// Returns the number of joint transforms we know about
int GetJointCount() const;
// Returns the DmeDag for the specified joint index
CDmeDag *GetJoint( int nIndex );
const CDmeDag *GetJoint( int nIndex ) const;
// Returns the DmeTransform for the specified joint index
CDmeTransform *GetJointTransform( int nIndex );
const CDmeTransform *GetJointTransform( int nIndex ) const;
// Determines joint index of a given a joint
int GetJointIndex( CDmeDag *pJoint ) const;
int GetJointIndex( const char *pJointName ) const;
int GetJointIndex( CUtlStringToken nJointNameHash ) const;
// Captures the current joint transforms into a base state
void CaptureJointsToBaseState( const char *pBaseStateName );
// Sets the joint transforms to the values in the specified base state, if it exists
void PushBaseStateToJoints( const char *pBaseStateName );
// Finds a base state by name, returns NULL if not found
CDmeTransformList *FindBaseState( const char *pBaseStateName );
// Recursively render the Dag hierarchy
virtual void Draw( CDmeDrawSettings *pDrawSettings = NULL );
// NOTE: See comment for m_upAxis attribute below
// Set if Z is the up axis of the model
// Set to true if the data under the DmeModel is AS_VALVE_ENGINE space( Up: Z, Fwd: X, Left: Y )
// Set to false if the data under the DmeModel is AS_MAYA_YUP space ( Up: Y, Fwd: Z, Left: X )
// See SetAxisSystem() for anything other than AS_VALVE_ENGINE or AS_MAYA_YUP
void ZUp( bool bZUp );
// Returns true if the DmeModel is Z Up.
bool IsZUp() const;
// Returns the matrix that moves DmeModel data to engine space
void GetModelToEngineMat( matrix3x4_t &modelToEngineMat );
// Returns the matrix that moves engine data to DmeModel space
void GetEngineToModelMat( matrix3x4_t &engineToModelMat );
// Replace all instances of a material with a different material
// Using a NULL material name will replace *all* materials with the new material
void ReplaceMaterial( const char *pOldMaterialName, const char *pNewMaterialName );
// Collapses all joints below the specified joint name, reskinning any meshes
// referring to collapsed joints to use the specified joint instead
void CollapseJoints( const char *pJointName );
// Gets the joint with the specified name
CDmeDag *GetJoint( const char *pJointName );
// Reskin all meshes under the DmeModel
void ReskinMeshes( const int *pJointTransformIndexRemap );
// Sets the DmeAxisSystem, no reorientation is done, see ConvertToAxisSystem
bool SetAxisSystem( CDmeAxisSystem::PredefinedAxisSystem ePredefAxisSystem );
bool SetAxisSystem( CDmeAxisSystem::Axis_t eUpAxis, CDmeAxisSystem::ForwardParity_t eForwardParity, CDmeAxisSystem::CoordSys_t eCoordSys = CDmeAxisSystem::AS_RIGHT_HANDED );
// Sets the DmeAxisSystem and reorients all of the data under the DmeModel
// as necessary to change from the current DmeAxisSystem to the specified DmeAxisSystem
// Currently private, will be made public soon, upAxis is still authoritative
bool ConvertToAxisSystem( CDmeAxisSystem::PredefinedAxisSystem ePredefAxisSystem );
bool ConvertToAxisSystem( CDmeAxisSystem::Axis_t eUpAxis, CDmeAxisSystem::ForwardParity_t eForwardParity, CDmeAxisSystem::CoordSys_t eCoordSys = CDmeAxisSystem::AS_RIGHT_HANDED );
// Returns the matrix to convert data from the current axisSystem to the specified axisSystem
bool GetConversionMatrix( matrix3x4a_t &mConversion, CDmeAxisSystem::PredefinedAxisSystem eToPredefinedAxisSystem );
// Freeze child meshes, pushes transform into vertices of mesh, used to be part of Reorient
void FreezeChildMeshes();
// TransformScene
void TransformScene( const Vector &vScale = Vector( 1.0f, 1.0f, 1.0f ), const Vector &vTranslate = vec3_origin, const DegreeEuler &eRotation = DegreeEuler( 0.0f, 0.0f, 0.0f ), float flEps = 1.0e-4 );
void ScaleScene( const Vector &vScale );
// Updates all base states by adding missing joints
void UpdateBaseStates();
private:
// Reskin meshes based on bone collapse
void ReskinMeshes( CDmeDag *pDag, const int *pJointTransformIndexRemap );
// Remove joints
void RemoveJoints( int nNewJointCount, const int *pInvJointRemap );
// Removes all children from this joint, moving shapes to be
void RemoveAllChildren( CDmeDag *pDag, CDmeDag *pSubtreeRoot, const matrix3x4_t &jointToSubtreeRoot );
void RemoveAllChildren( CDmeDag *pSubtreeRoot );
// Helper functions for ReorientToEngineSpace() and ReorientToDCCToolSpace()
static void GetReorientData( matrix3x4_t &m, Quaternion &q, bool bMakeZUp );
static void ReorientDmeAnimation( CDmeDag *pDmeDag, const matrix3x4_t &mOrient, const Quaternion &qOrient );
static void ReorientDmeTransform( CDmeTransform *pDmeTransform, const matrix3x4_t &mOrient, const Quaternion &qOrient );
static void ReorientDmeModelChildren( CDmeModel *pDmeModel, const matrix3x4_t &mOrient, const Quaternion &qOrient );
static void ReorientChildDmeMeshes_R( CDmeDag *pDmeDag );
static void ReorientDmeMesh( CDmeMesh *pDmeMesh, matrix3x4_t absMat );
protected:
// The order in which the joint transform names appear in this list
// indicates the joint index for each dag
CDmaElementArray< CDmeDag > m_JointList;
// Stores a list of base poses for all the joint transforms
CDmaElementArray<CDmeTransformList> m_BaseStates;
// Stores the up axis of the model
// One of Y or Z
//
// NOTE: Y up is Maya's typical coordinate system. Setting the up axis to Z
// won't quite give you the engine's coordinate system (even though it
// has an Up Axis of Z as well). The difference is the forward axis.
//
// A DmeModel with m_UpAxis = Y gives the data in a coordinate system
// that is Maya's typical coordinate system. Y Up, Z Foward, X Right.
//
// A DmeModel with m_UpAxis = Z gives the data in a coordinate system
// that is compatible with typical SMD data. This is data that can
// be compiled in studiomdl without any special options.
//
// Neither Y up or Z up is engine space. Z up is closer but still
// requires another 90 degree rotation to align things. This can be
// changed in the future if required but Z up was added for legacy
// SMD compatibility.
//
// In this table, missing entries mean it's not required or isn't
// supported
//
// m_UpAxis Desc Up Forward Right studiomdl
// -------- ------------- ------- ------- ------- ---------
// Y Maya Y Up Y Z X $upaxis Y
// Z Maya Z Up/XSI Z -Y X
// Engine Z X Y $origin 0 0 0 0
//-----------------------------------------------------------------------------
CDmaString m_UpAxis;
CDmaElement< CDmeAxisSystem > m_eAxisSystem;
CDmaElement< CDmeModel > m_eModel;
CDmaElement< CDmeModel > m_eSkeleton;
private:
enum SetupBoneRetval_t
{
NO_SKIN_DATA = 0,
TOO_MANY_BONES,
BONES_SET_UP
};
// Sets up the render state for the model
SetupBoneRetval_t SetupBoneMatrixState( const matrix3x4_t& shapeToWorld, bool bForceSoftwareSkin );
// Loads up joint transforms for this model
void LoadJointTransform( CDmeDag *pJoint, CDmeTransformList *pBindPose, const matrix3x4_t &parentToWorld, const matrix3x4_t &parentToBindPose, bool bSetHardwareState );
// Implementation of ReplaceMaterial
void ReplaceMaterial( CDmeDag *pDag, const char *pOldMaterialName, const char *pNewMaterialName );
// Sets up the render state for the model
static matrix3x4_t *SetupModelRenderState( const matrix3x4_t& shapeToWorld, bool bHasSkinningData, bool bForceSoftwareSkin );
static void CleanupModelRenderState();
// Stack of DmeModels currently being rendered. Used to set up render state
static CUtlStack< CDmeModel * > s_ModelStack;
friend class CDmeMesh;
friend bool SetMeshFromSkeleton( CDmeMesh *pDmeMesh ); // dmx edit function - to do skin weights
};
#endif // DMEMODEL_H