windows-nt/Source/XPSP1/NT/multimedia/opengl/pmesh/sglmesh.h
2020-09-26 16:20:57 +08:00

112 lines
3 KiB
C++

/**
** File : sglmesh.h
** Description: Simple gl mesh definition
**/
#ifndef _sglmesh_h_
#define _sglmesh_h_
#include "global.h"
#include "glstructs.h"
#include "excptn.h"
/*************************************************************************
Typedefs, structs and classes
*************************************************************************/
typedef enum
{
GLPM_SOLID = 0x0001,
GLPM_WIRE = 0x0002,
} RenderType;
class CSimpGlMesh
{
protected:
public:
/*
* Vertex-Array data
*/
GLvertex* m_varray; // Vertex Array to store Wedges/Vertices
GLnormal* m_narray; // Normal Array to store Normals
GLtexCoord* m_tarray; // Texture Array
GLface* m_farray; // Face Array
WORD* m_wedgelist; // circular linked lists of wedges sharing the same
// vertex
/*
* Material/Texture related info
*/
GLmaterial* m_matArray; // Array of Materials
WORD* m_matcnt; // table of face counts per material
#ifdef __MATPOS_IS_A_PTR
GLface** m_matpos; // pointers to where next face of a given material
// is inserted in the m_farray
#else
WORD* m_matpos; // pointers to where next face of a given material
// is inserted in the m_farray
#endif
/*
* Various counts
*/
DWORD m_numFaces;
DWORD m_numWedges;
DWORD m_numVerts;
DWORD m_numMaterials;
DWORD m_numTextures;
/*
* User-defined data
*/
DWORD m_userWedgeSize; // Size of user defined wedge-data
LPVOID m_userWedge; // User defined data per wedge
DWORD m_userVertexSize; // Size of user defined vertex-data
LPVOID m_userVertex; // User defined data per vertex
DWORD m_userFaceSize; // Size of user defined face-data
LPVOID m_userFace; // User defined data per face
public:
//Constructor-Destructor
CSimpGlMesh();
virtual ~CSimpGlMesh();
virtual HRESULT Print (ostream& os);
virtual HRESULT RenderMesh (RenderType);
inline DWORD GetMeshNumFaces (void) const {return m_numFaces;}
inline DWORD GetMeshNumWedges (void) const {return m_numWedges;}
inline DWORD GetMeshNumVerts (void) const {return m_numVerts;}
inline DWORD GetMeshNumMaterials (void) const {return m_numMaterials;}
inline DWORD GetMeshNumTextures (void) const {return m_numTextures;}
inline LPGLmaterial GetMeshMaterial (int i) const
{
return &(m_matArray[i]);
}
inline WORD FindVertexIndex(WORD w) const;
inline LPVOID GetMeshUserFaceData (void) const {return m_userFace;}
inline LPVOID GetMeshUserWedgeData (void) const {return m_userWedge;}
inline LPVOID GetMeshUserVertexData (void) const {return m_userVertex;}
};
/*
* Inlines
*/
inline WORD CSimpGlMesh::FindVertexIndex(WORD w) const
{
WORD v = USHRT_MAX;
WORD p = w;
do
{
v = min(p,v);
p = m_wedgelist[p];
}
while (p != w);
return v;
}
#endif //_sglmesh_h_