source-engine-2018-hl2_src/public/movieobjects/dmmeshcomp.h

127 lines
3.1 KiB
C
Raw Normal View History

2020-04-23 00:56:21 +08:00
//========= 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