diff options
Diffstat (limited to 'public/movieobjects/dmmeshutils.h')
| -rw-r--r-- | public/movieobjects/dmmeshutils.h | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/public/movieobjects/dmmeshutils.h b/public/movieobjects/dmmeshutils.h new file mode 100644 index 0000000..26c4349 --- /dev/null +++ b/public/movieobjects/dmmeshutils.h @@ -0,0 +1,199 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Mesh Manipulation Utilities +// +//============================================================================= + + +#ifndef DMMESHUTILS_H +#define DMMESHUTILS_H + +#if defined( _WIN32 ) +#pragma once +#endif + +#include "movieobjects/dmevertexdata.h" +#include "tier1/utlstring.h" +#include "tier1/UtlStringMap.h" +#include "tier1/utlvector.h" + +class CDmeMesh; +class CDmMeshComp::CEdge; + + +//----------------------------------------------------------------------------- +// Mesh Utility function class (more like a namespace) +//----------------------------------------------------------------------------- +class CDmMeshUtils +{ +public: + + static bool RemoveLargeAxisAlignedPlanarFaces( CDmeMesh *pMesh ); + + static bool RemoveFacesWithMaterial( CDmeMesh *pMesh, const char *pMaterialName ); + + static bool RemoveFacesWithMoreThanNVerts( CDmeMesh *pMesh, const int nVertexCount ); + + enum Axis_t + { + kXAxis, + kYAxis, + kZAxis + }; + + static bool Mirror( CDmeMesh *pMesh, int axis = kXAxis ); + + static bool RemapMaterial( CDmeMesh *pMesh, const CUtlString &src, const CUtlString &dst ); + + static bool RemapMaterial( CDmeMesh *pMesh, const int nMaterialIndex, const CUtlString &dst ); + + // Merge the specified mesh onto the first mesh under pRoot that fits it + static bool Merge( CDmeMesh *pSrcMesh, CDmElement *pRoot ); + + static bool Merge( CDmeMesh *pSrcMesh, CDmeMesh *pDstMesh, int nSkinningJointIndex ); + + static bool CreateDeltasFromPresets( CDmeMesh *pMesh, CDmeVertexData *pPassedDst, const CUtlStringMap< CUtlString > &presetMap, bool bPurge, const CUtlVector< CUtlString > *pPurgeAllButThese = NULL ); + + static bool PurgeUnusedDeltas( CDmeMesh *pMesh ); + + enum WrinkleOp + { + kReplace, + kAdd + }; + + static bool CreateWrinkleDeltaFromBaseState( CDmeVertexDeltaData *pDelta, float flScale = 1.0f, WrinkleOp wrinkleOp = kReplace, CDmeMesh *pMesh = NULL, CDmeVertexData *pBind = NULL, CDmeVertexData *pCurrent = NULL ); + + static int FindMergeSocket( + const CUtlVector< CUtlVector< CDmMeshComp::CEdge * > > &srcBorderEdgesList, + CDmeMesh *pDstMesh ); + + static bool Merge( CDmMeshComp &srcComp, const CUtlVector< CDmMeshComp::CEdge * > &edgeList, CDmeMesh *pDstMesh ); + +protected: + static const int *BuildDataMirrorMap( CDmeVertexData *pBase, int axis, CDmeVertexData::StandardFields_t standardField, CUtlVector< int > &dataMirrorMap ); + + static bool MirrorVertices( CDmeMesh *pMesh, CDmeVertexData *pBase, int axis, CUtlVector< int > &mirrorMap ); + + static bool MirrorVertices( CDmeVertexData *pBase, int axis, int nOldVertexCount, int nMirrorCount, const CUtlVector< int > &mirrorMap, const CUtlVector< int > &posMirrorMap, const CUtlVector< int > &normalMirrorMap, const CUtlVector< int > &uvMirrorMap ); + + static void MirrorVertices( CDmeVertexData *pBase, FieldIndex_t fieldIndex, int nOldVertexCount, int nMirrorCount, const CUtlVector< int > &baseIndices, const CUtlVector< int > &mirrorMap ); + + static bool MirrorDelta( CDmeVertexDeltaData *pDelta, int axis, const CUtlVector< int > &posMirrorMap, const CUtlVector< int > &normalMirrorMap, const CUtlVector< int > &uvMirrorMap ); + + static bool PurgeUnusedData( CDmeMesh *pMesh ); + + static void CreateDeltasFromPresetGroup( CDmePresetGroup *pPresetGroup, CDmeCombinationOperator * pComboOp, const CUtlVector< CUtlString > * pPurgeAllButThese, CDmeMesh * pMesh, CDmeVertexData * pDst, CUtlStringMap< CUtlString > &conflictingNames, CUtlStringMap< CDmePreset * > &presetMap ); + + static void PurgeUnreferencedDeltas( CDmeMesh *pMesh, CUtlStringMap< CDmePreset * > &presetMap, const CUtlVector< CUtlString > *pPurgeAllButThese, CDmeCombinationOperator *pComboOp ); +}; + + +//----------------------------------------------------------------------------- +// Iterate over all of the faces in a mesh. Use it like this: +// +// for ( CDmMeshFaceIt fIt( pMesh ); !fIt.IsDone(); fIt.Next() ) +// { +// } +//----------------------------------------------------------------------------- +class CDmMeshFaceIt +{ +public: + // Constructs a new face iterator for the specified mesh + CDmMeshFaceIt( const CDmeMesh *pMesh, const CDmeVertexData *pVertexData = NULL ); + + // Resets the iterator to the start of the specified mesh or for another iteration of the + // current mesh if the specified mesh is NULL + bool Reset( const CDmeMesh *pMesh = NULL, const CDmeVertexData *pVertexData = NULL ); + + // Returns the total number of faces in the mesh + int Count() const; + + // The number of vertices in the face + int VertexCount() const; + + // Is the iterator at the end of the mesh? + bool IsDone() const; + + // Move the iterator to the next face + bool Next(); + + // The face index of the current face in the range [ 0, Count() ] + int Index() const; + + // Returns opposite sense of IsDone(), i.e. !IsDone() so true if iterator still has stuff to do + operator bool() const { return !IsDone(); } + + // Prefix ++ which just calls Next() for syntax sugar + CDmMeshFaceIt &operator ++() { Next(); return *this; } + + // Postfix ++ which just calls Next() for syntax sugar + CDmMeshFaceIt operator ++( int ) { const CDmMeshFaceIt thisCopy( *this ); ++( *this ); return thisCopy; } + + // Gets the vertex indices for the vertices of this face + bool GetVertexIndices( int *pIndices, int nIndices ) const; + + // Gets the vertex indices for the vertices of this face + bool GetVertexIndices( CUtlVector< int > &vertexIndices ) const; + + // Gets the mesh relative vertex index given the face relative vertex index + int GetVertexIndex( int nFaceRelativeVertexIndex ) const; + + // Gets the specified vertex data for the vertices of this face (if it exists) and the type matches + template < class T_t > + bool GetVertexData( + CUtlVector< T_t > &vertexData, + CDmeVertexDataBase::StandardFields_t nStandardField, + CDmeVertexData *pPassedBase = NULL ) const; + +protected: + bool SetFaceSet(); + + const CDmeMesh *m_pMesh; // Current Mesh + const CDmeVertexData *m_pVertexData; // Current Vertex Data + + int m_nFaceSetCount; // Number of face sets in current mesh: m_pMesh->FaceSetCount(); + int m_nFaceSetIndex; // Index of current face set: [ 0, m_nFaceSetCount ] + + const CDmeFaceSet *m_pFaceSet; // Current face set: m_pMesh->GetFaceSet( m_nFaceSetIndex ) + + int m_nFaceSetIndexCount; // Number of indices in current face set: m_pFaceSet->NumIndices(); + int m_nFaceSetIndexIndex; // Index of current face set's indices: [ 0, m_nFaceSetIndexCount ] + + int m_nFaceCount; // Number of faces in current mesh + int m_nFaceIndex; // The current face in the iteration [ 0, m_nFaceCount ] +}; + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +template < class T_t > +inline bool CDmMeshFaceIt::GetVertexData( + CUtlVector< T_t > &vertexData, + CDmeVertexDataBase::StandardFields_t nStandardField, + CDmeVertexData *pPassedBase /* = NULL */ ) const +{ + vertexData.RemoveAll(); + + if ( IsDone() ) + return false; + + CDmeVertexData *pBase = pPassedBase ? pPassedBase : m_pMesh->GetCurrentBaseState(); + if ( !pBase ) + return false; + + const FieldIndex_t nFieldIndex = pBase->FindFieldIndex( nStandardField ); + if ( nFieldIndex < 0 ) + return false; + + CDmAttribute *pDataAttr = pBase->GetVertexData( nFieldIndex ); + if ( pDataAttr->GetType() != CDmAttributeInfo< CUtlVector< T_t > >().AttributeType() ) + return false; + + const CDmrArrayConst< T_t > data( pDataAttr ); + const CUtlVector< int > &indices( pBase->GetVertexIndexData( nFieldIndex ) ); +} + + +#endif // DMMESHUTILS_H
\ No newline at end of file |