Counter Strike : Global Offensive Source Code
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//--------------------------------------------------------------------------------------------------
/**
@file qhConvex.h
@author Dirk Gregorius @version 0.1 @date 30/11/2011
Copyright(C) 2011 by D. Gregorius. All rights reserved. */ //--------------------------------------------------------------------------------------------------
#pragma once
#include "qhTypes.h"
#include "qhMath.h"
#include "qhArray.h"
#include "qhList.h"
#include "qhHalfEdge.h"
#include "qhMass.h"
//--------------------------------------------------------------------------------------------------
// qhMesh
//--------------------------------------------------------------------------------------------------
struct qhMesh { qhArray< qhVector3 > Vertices; // Vertices
qhArray< qhVector3 > Normals; // *Face* normals
qhArray< int > Faces; // Index count for each face
qhArray< int > Indices; // Face indices into vertex array
};
//--------------------------------------------------------------------------------------------------
// qhIteration
//--------------------------------------------------------------------------------------------------
struct qhIteration { qhVector3 Apex; qhArray< qhVector3 > Horizon; qhArray< qhVector3 > Vertices; qhArray< int > Faces; };
//--------------------------------------------------------------------------------------------------
// qhConvex
//--------------------------------------------------------------------------------------------------
class qhConvex { public: // Construction / Destruction
qhConvex( void ); ~qhConvex( void ); void Construct( int VertexCount, const qhVector3* VertexBase, qhReal RelativeWeldTolerance ); void Construct( int PlaneCount, const qhPlane* PlaneBase, qhReal RelativeWeldTolerance, const qhVector3& InternalPoint = QH_VEC3_ZERO ); bool IsConsistent( void ) const;
void Simplify( qhConvex& Convex, qhReal MaxAngle ) const; // Accessors / Mutators
qhVector3 GetCentroid( void ) const;
int GetVertexCount( void ) const; int GetEdgeCount( void ) const; int GetFaceCount( void ) const;
const qhList< qhVertex >& GetVertexList( void ) const; const qhList< qhFace >& GetFaceList( void ) const;
// Polygonal mesh for rendering
void GetMesh( qhMesh& Mesh ) const;
// Mass properties (relative to origin)
qhMass ComputeMass( qhReal Density = qhReal( 1 ) ) const;
// Debug information
int GetIterationCount( void ) const; const qhIteration& GetIteration( int Index ) const;
private: // Memory management
qhVertex* CreateVertex( const qhVector3& Position ); void DestroyVertex( qhVertex* Vertex ); qhFace* CreateFace( qhVertex* Vertex1, qhVertex* Vertex2, qhVertex* Vertex3 ); void DestroyFace( qhFace* Face );
// Implementation
void ComputeTolerance( qhArray< qhVector3 >& Vertices ); bool BuildInitialHull( int VertexCount, const qhVector3* VertexBase ); qhVertex* NextConflictVertex( void ); void AddVertexToHull( qhVertex* Vertex ); void AddIteration( qhVertex* Apex, const qhArray< qhHalfEdge* >& Horizon, const qhList< qhFace >& FaceList ); void CleanHull( void ); void ShiftHull( const qhVector3& Translation ); void BuildHorizon( qhArray< qhHalfEdge* >& Horizon, qhVertex* Apex, qhFace* Seed, qhHalfEdge* Edge1 = NULL ); void BuildCone( qhArray< qhFace* >& Cone, const qhArray< qhHalfEdge* >& Horizon, qhVertex* Apex ); void MergeFaces( qhArray< qhFace* >& Cone ); void ResolveVertices( qhArray< qhFace* >& Cone ); void ResolveFaces( qhArray< qhFace* >& Cone ); bool FirstPass( qhFace* Face ); bool SecondPass( qhFace* Face ); void ConnectFaces( qhHalfEdge* Edge ); void ConnectEdges( qhHalfEdge* Prev, qhHalfEdge* Next, qhArray< qhFace* >& MergedFaces ); void DestroyEdges( qhHalfEdge* Begin, qhHalfEdge* End ); void AbsorbFaces( qhFace* Face, qhArray< qhFace* >& MergedFaces );
// Data members
qhReal mTolerance; qhReal mMinRadius; qhReal mMinOutside; qhVector3 mInteriorPoint; qhList< qhVertex > mOrphanedList; qhList< qhVertex > mVertexList; qhList< qhFace > mFaceList;
qhArray< qhIteration > mIterations;
// Non-copyable
qhConvex( const qhConvex& ); qhConvex& operator=( const qhConvex& ); };
#include "qhConvex.inl"
|