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

108 lines
2.9 KiB
C++

/**
** File : aglmesh.h
** Description: Augmented Mesh definition
** mesh augmented with adjacency data.
**/
#ifndef _aglmesh_h_
#define _aglmesh_h_
#include "global.h"
#include "sglmesh.h"
#include "vsplit.h"
#include "hash.h"
class CAugGlMesh : public CSimpGlMesh
{
protected:
public:
WORD* m_facemap; // Array remapping the face numbers
WORD (*m_fnei)[3]; // face neightbour information table
void HashAdd(WORD va, WORD vb, WORD f);
WORD HashFind(WORD va, WORD vb);
void apply_vsplit(Vsplit& vspl);
void undo_vsplit(const Vsplit& vspl);
/*
* get index of vertex v in face f
*/
inline WORD get_jvf(WORD v, WORD f) const;
/*
* gather functions
*/
void gather_vf_jw (WORD v, WORD f, int& j, WORD& w) const;
void gather_vf_j0j2pw (WORD v, WORD f, int& j0, int& j2, WORD*& w);
void gather_vf_j2w (WORD v, WORD f, int& j2, WORD& w) const;
void gather_vf_j1w (WORD v, WORD f, int& j1, WORD& w) const;
void gather_vf_jpw (WORD v, WORD f, int& j, WORD*& pw);
WORD MatidOfFace (WORD f);
inline WORD face_prediction (WORD fa, WORD fb, WORD ii);
inline void WedgeListDelete (WORD w);
inline void add_zero (WORD a, const WEDGEATTRD& ad);
inline void add (WORD a, const GLwedgeAttrib& a1, const WEDGEATTRD& ad);
void sub_reflect (WORD a, const GLwedgeAttrib& abase,
const WEDGEATTRD& ad);
void sub_noreflect (WORD a, WORD abase, const WEDGEATTRD& ad);
public:
CAugGlMesh();
virtual ~CAugGlMesh();
void ComputeAdjacency(void);
};
/*************************************************************************
Inlines
*************************************************************************/
inline WORD CAugGlMesh::get_jvf (WORD v, WORD f) const
{
WORD *w = m_farray[f].w;
if (FindVertexIndex(w[0]) == v)
return 0;
else if (FindVertexIndex(w[1]) == v)
return 1;
else if (FindVertexIndex(w[2]) == v)
return 2;
else
throw CVertexNotFound();
return 0; // Never! To make compiler happy
}
inline WORD CAugGlMesh::face_prediction(WORD fa, WORD fb, WORD ii)
{
return (ii == 0 ? (fb != UNDEF ? fb : fa) : (fa != UNDEF ? fa : fb));
}
inline void CAugGlMesh::WedgeListDelete(WORD w)
{
for (WORD p = w; m_wedgelist[p] != w;
p = m_wedgelist[p]);
m_wedgelist[p] = m_wedgelist[m_wedgelist[p]];
}
inline void CAugGlMesh::add_zero(WORD a, const WEDGEATTRD& ad)
{
m_narray[a].x = ad[0];
m_narray[a].y = ad[1];
m_narray[a].z = ad[2];
m_tarray[a].s = ad[3];
m_tarray[a].t = ad[4];
}
inline void CAugGlMesh::add(WORD a, const GLwedgeAttrib& a1,
const WEDGEATTRD& ad)
{
m_narray[a].x = a1.n.x + ad[0];
m_narray[a].y = a1.n.y + ad[1];
m_narray[a].z = a1.n.z + ad[2];
m_tarray[a].s = a1.t.s + ad[3];
m_tarray[a].t = a1.t.t + ad[4];
}
#endif //_aglmesh_h_