|
|
/**
** 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_
|