summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmmeshcomp.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/movieobjects/dmmeshcomp.h')
-rw-r--r--public/movieobjects/dmmeshcomp.h126
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