108 lines
2.9 KiB
C++
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_
|