diff options
Diffstat (limited to 'public/movieobjects/dmmeshcomp.h')
| -rw-r--r-- | public/movieobjects/dmmeshcomp.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/public/movieobjects/dmmeshcomp.h b/public/movieobjects/dmmeshcomp.h new file mode 100644 index 0000000..43207c1 --- /dev/null +++ b/public/movieobjects/dmmeshcomp.h @@ -0,0 +1,126 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// A class for computing things with CDmeMesh data +// +//============================================================================= + +#ifndef DMMESHCOMP_H +#define DMMESHCOMP_H + +#ifdef _WIN32 +#pragma once +#endif + + +// Valve includes +#include "mathlib/mathlib.h" +#include "tier1/utlvector.h" +#include "tier1/utllinkedlist.h" + + +// Forward declarations +class CDmeMesh; +class CDmeVertexData; + + +//============================================================================= +// TODO: This works in the local space of the mesh... add option to transform +// the positions into world space +//============================================================================= +class CDmMeshComp +{ +public: + CDmMeshComp( CDmeMesh *pMesh, CDmeVertexData *pPassedBase = NULL ); + + ~CDmMeshComp(); + + class CVert; + class CEdge; + + class CVert + { + public: + CVert( int nPositionIndex, const CUtlVector< int > *pVertexIndices, const Vector *pPosition ); + + CVert( const CVert &src ); + + int PositionIndex() const; + + const Vector *Position() const; + + const CUtlVector< int > *VertexIndices() const; + + bool operator==( const CVert &rhs ) const; + + protected: + friend class CDmMeshComp; + + int m_positionIndex; // Index in the position data + const CUtlVector< int > *m_pVertexIndices; // Pointer to a list of the vertex indices for this vertex + const Vector *m_pPosition; + CUtlVector< CEdge * > m_edges; // An array of pointers to the edges containing this vertex + + private: + CVert(); // Not used + }; + + class CEdge + { + public: + CEdge(); + + int GetVertPositionIndex( int edgeRelativeVertexIndex ) const; + + CVert *GetVert( int edgeRelativeVertexIndex ) const; + + bool IsBorderEdge() const { return m_faceCount == 1; } + + bool ConnectedTo( const CEdge *pEdge ) const { return m_pVert0 == pEdge->m_pVert0 || m_pVert0 == pEdge->m_pVert1 || m_pVert1 == pEdge->m_pVert0 || m_pVert1 == pEdge->m_pVert1; } + + Vector EdgeVector() const; + + // Returns true if the edge starts and stops at the same point in local space + bool operator==( const CEdge &rhs ) const; + + protected: + friend class CDmMeshComp; + + CVert *m_pVert0; + CVert *m_pVert1; + int m_faceCount; + }; + + class CFace + { + public: + protected: + friend class CDmMeshComp; + + CUtlVector< CVert * > m_verts; + CUtlVector< CEdge * > m_edges; + CUtlVector< bool > m_edgeReverseMap; + }; + + CDmeVertexData *BaseState() { return m_pBase; } + + CEdge *FindOrCreateEdge( int vIndex0, int vIndex1, bool *pReverse = NULL ); + + CEdge *FindEdge( int vIndex0, int vIndex1, bool *pReverse = NULL ); + + CFace *CreateFace( const CUtlVector< CVert * > &verts, const CUtlVector< CEdge * > &edges, const CUtlVector< bool > &edgeReverseMap ); + + int FindFacesWithVert( int vIndex, CUtlVector< CFace * > &faces ); + + int FindNeighbouringVerts( int vIndex, CUtlVector< CVert * > &verts ); + + int GetBorderEdges( CUtlVector< CUtlVector< CEdge * > > &borderEdges ); + + CDmeMesh *m_pMesh; + CDmeVertexData *m_pBase; + CUtlVector< CVert * > m_verts; + CUtlVector< CEdge * > m_edges; + CUtlFixedLinkedList< CFace > m_faces; +}; + + +#endif // DMEMESHCOMP_H |