127 lines
3.1 KiB
C
127 lines
3.1 KiB
C
|
//========= 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
|