/** ** File : glmesh.cxx ** Description: Implementations of CGlMesh class **/ #include "precomp.h" #pragma hdrstop #include "glmesh.h" #include "pmerrors.h" /**************************************************************************/ /* * CGlMesh: Constructor */ CGlMesh::CGlMesh() { //Dynamically allocated arrays m_matArray = NULL; m_varray = NULL; m_narray = NULL; m_tarray = NULL; m_wedgelist = NULL; m_fnei = NULL; m_facemap = NULL; m_numFaces = m_numWedges = m_numVerts = m_numMaterials = m_numTextures = 0; } /* * CGlMesh: Destructor */ CGlMesh::~CGlMesh() { delete [] m_matArray; delete [] m_varray; delete [] m_narray; delete [] m_tarray; delete [] m_wedgelist; delete [] m_fnei; delete [] m_facemap; } /* * CGlMesh: Print */ STDMETHODIMP CGlMesh::Print(ostream& os) { os << "\n\nMaterials:"; for (int i=0; ishininess; os << "\nDiffuse : (" << lpglm->diffuse.r << ", " << lpglm->diffuse.g << ", " << lpglm->diffuse.b << ", " << lpglm->diffuse.a << ")"; os << "\nSpecular : (" << lpglm->specular.r << ", " << lpglm->specular.g << ", " << lpglm->specular.b << ", " << lpglm->specular.a << ")"; os << "\nEmissive : (" << lpglm->emissive.r << ", " << lpglm->emissive.g << ", " << lpglm->emissive.b << ", " << lpglm->emissive.a << ")"; os << "\nNumber of faces: " << m_matcnt[i]; for (int j=0; j< m_matcnt[i]; j++) { #ifdef __MATPOS_IS_A_PTR os << "\n(" << m_matpos[i][j].w[0] << "," << (m_matpos[i][j]).w[1] << "," << (m_matpos[i][j]).w[2] << ")"; #else os << "\n(" << (m_farray[m_matpos[i] + j]).w[0] << "," << (m_farray[m_matpos[i] + j]).w[0] << "," << (m_farray[m_matpos[i] + j]).w[0] << ")"; #endif } } os << "\n\nWedge connectivity:"; for (i=0; ishininess); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (GLfloat *) &(lpglm->specular)); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, (GLfloat *) &(lpglm->diffuse)); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (GLfloat *) &(lpglm->emissive)); glDrawElements (GL_TRIANGLES, (GLuint) m_matcnt[i]*3, GL_UNSIGNED_SHORT, #ifdef __MATPOS_IS_A_PTR (void *) m_matpos[i]); #else (void *) &(m_farray[m_matpos[i]])); #endif } return S_OK; } else { return E_NOTIMPL; } } PHASHENTRY* hashtable; PHASHENTRY hashentries; int freeptr, maxptr; void CGlMesh::HashAdd(WORD va, WORD vb, WORD f) { #ifdef _DEBUG if (va > m_numWedges || va < 0) throw CHashOvrflw(); #endif for (PHASHENTRY* t = &(hashtable[va]); *t; t = &((*t)->next)); PHASHENTRY p = &(hashentries[freeptr++]); p->f = f; p->v2 = vb; p->next = NULL; *t=p; } WORD CGlMesh::HashFind(WORD va, WORD vb) { #ifdef _DEBUG if (va > m_baseWedges || va < 0) throw CHashOvrflw(); #endif for (PHASHENTRY* t = &(hashtable[va]); *t; t = &((*t)->next)) { if ((*t)->v2 == vb) { return (*t)->f; } } return USHRT_MAX; } void CGlMesh::ComputeAdjacency(void) { freeptr = 0; maxptr = m_numFaces*3; hashtable = new PHASHENTRY[m_numWedges]; // An entry for each 3 edges of each face in base mesh hashentries = new hashentry[maxptr]; if (!hashtable) throw CExNewFailed(); memset(hashtable, 0, sizeof(PHASHENTRY)*m_numWedges); /* * For each group of faces */ for(int i=0; i maxptr) throw CHashOvrflw(); #endif /* * For each group of faces */ for(i=0; i