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

132 lines
3.3 KiB
C++

/**
** File : glmesh.h
** Description: Mesh definition
**/
#ifndef _glmesh_h_
#define _glmesh_h_
#include <objidl.h>
#include <fstream.h>
#include <limits.h>
#include "glstructs.h"
#include "excptn.h"
/*************************************************************************
Defines
*************************************************************************/
#define UNDEF USHRT_MAX
/*************************************************************************
Typedefs, structs and classes
*************************************************************************/
typedef enum {
GLPM_SOLID=0x0001,
GLPM_WIRE=0x0002,
} RenderType;
struct hashentry
{
WORD v2;
WORD f, m; // face and it's matid
hashentry* next;
};
typedef hashentry* PHASHENTRY;
class CGlMesh
{
friend class CPMesh;
private:
public:
GLmaterial* m_matArray; // Array of Materials
/*
* 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_facemap; // Array remapping the face numbers
WORD* m_wedgelist; // circular linked lists of wedges sharing the same
// vertex
WORD (*m_fnei)[3]; // face neightbour information table
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
DWORD m_numFaces;
DWORD m_numWedges;
DWORD m_numVerts;
DWORD m_numMaterials;
DWORD m_numTextures;
public:
//Constructor-Destructor
CGlMesh();
~CGlMesh();
STDMETHODIMP Print (ostream& os);
STDMETHODIMP Render (RenderType);
#if 0
STDMETHODIMP AddWedge (WORD vertex_id, GLnormal& n, GLtexCoord& t,
DWORD* const wedge_id);
STDMETHODIMP AddWedge (WORD vertex_id, WORD old_wedge_id,
DWORD* const wedge_id);
STDMETHODIMP AddFace (WORD matid, GLface& f);
#endif
inline DWORD GetNumFaces (void) const {return m_numFaces;};
inline DWORD GetNumWedges (void) const {return m_numWedges;};
inline DWORD GetNumVerts (void) const {return m_numVerts;};
void ComputeAdjacency(void);
//inline LPGLMaterial GetMaterial (int i) {return &(m_matArray[i]);}
inline WORD FindVertexIndex(WORD w) const;
private:
#ifdef __MATPOS_IS_A_PTR
inline WORD GetFaceIndex(int m, int f) const;
#endif
void HashAdd(WORD va, WORD vb, WORD f);
WORD HashFind(WORD va, WORD vb);
};
/*************************************************************************
Inlines
*************************************************************************/
inline WORD CGlMesh::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;
}
#ifdef __MATPOS_IS_A_PTR
inline WORD CGlMesh::GetFaceIndex(int m, int f) const
{
return (WORD) (&(m_matpos[m][f].w[0]) -
&(m_matpos[0][0].w[0]))/(sizeof(GLface));
}
#endif
#endif //_glmesh_h_