static void CALLBACK Paint(void) { glViewport(0,0,windW,windH); glDisable(GL_SCISSOR_TEST); glPushAttrib(GL_COLOR_BUFFER_BIT); glColorMask(1,1,1,1); glIndexMask((GLuint)~0); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glPopAttrib(); if(mode1)glShadeModel(GL_SMOOTH); else glShadeModel(GL_FLAT); if(mode2)glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); else glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); Viewport(0,0); Point(); Viewport(0,1); Lines(); Viewport(0,2); LineStrip(); Viewport(0,3); LineLoop(); Viewport(1,0); Bitmap(); Viewport(1,1); TriangleFan(); Viewport(1,2); Triangles(); Viewport(1,3); TriangleStrip(); Viewport(2,0); Rect(); Viewport(2,1); xPolygon(); Viewport(2,2); Quads(); Viewport(2,3); QuadStrip(); glFlush(); if(doubleBuffer)auxSwapBuffers(); }
static void Draw(EGLDisplay dpy, EGLSurface surf) { glViewport(0, 0, windW, windH); glDisable(GL_SCISSOR_TEST); glPushAttrib(GL_COLOR_BUFFER_BIT); glColorMask(1, 1, 1, 1); glIndexMask(~0); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glPopAttrib(); if (mode1) { glShadeModel(GL_SMOOTH); } else { glShadeModel(GL_FLAT); } if (mode2) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } else { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } Viewport(0, 0); Point(); Viewport(0, 1); Lines(); Viewport(0, 2); LineStrip(); Viewport(0, 3); LineLoop(); Viewport(1, 0); Bitmap(); Viewport(1, 1); TriangleFan(); Viewport(1, 2); Triangles(); Viewport(1, 3); TriangleStrip(); Viewport(2, 0); Rect(); Viewport(2, 1); PolygonFunc(); Viewport(2, 2); Quads(); Viewport(2, 3); QuadStrip(); glFlush(); if (doubleBuffer) { eglSwapBuffers(dpy, surf); } }
// **** Tetrahedral Polygonization **** // doTetra: triangulate the tetrahedron // b, c, d should appear clockwise when viewed from a void IsoSurfacePolygonizer::doTetra(const HashedCubeCorner &a, const HashedCubeCorner &b, const HashedCubeCorner &c, const HashedCubeCorner &d) { m_statistics.m_doTetraCalls++; BYTE index = 0; if(a.m_positive) index |= 8; if(b.m_positive) index |= 4; if(c.m_positive) index |= 2; if(d.m_positive) index |= 1; // index is now 4-bit number representing one of the 16 possible cases int ab, ac, ad, bc, bd, cd; if(a.m_positive != b.m_positive) ab = getVertexId(a, b); if(a.m_positive != c.m_positive) ac = getVertexId(a, c); if(a.m_positive != d.m_positive) ad = getVertexId(a, d); if(b.m_positive != c.m_positive) bc = getVertexId(b, c); if(b.m_positive != d.m_positive) bd = getVertexId(b, d); if(c.m_positive != d.m_positive) cd = getVertexId(c, d); // 14 productive tetrahedral cases (0000 and 1111 do not yield polygons TriangleStrip ts; switch (index) { case 0: //---- case 15: //++++ m_statistics.m_nonProduktiveCalls++; return; case 1: ts = TriangleStrip(ad,bd,cd ); break; //---+ case 2: ts = TriangleStrip(ac,cd,bc ); break; //--+- case 3: ts = TriangleStrip(ad,bd,bc,ac); break; //--++ case 4: ts = TriangleStrip(ab,bc,bd ); break; //-+-- case 5: ts = TriangleStrip(ad,ab,bc,cd); break; //-+-+ case 6: ts = TriangleStrip(ab,ac,cd,bd); break; //-++- case 7: ts = TriangleStrip(ab,ac,ad ); break; //-+++ case 8: ts = TriangleStrip(ab,ad,ac ); break; //+--- case 9: ts = TriangleStrip(ab,bd,cd,ac); break; //+--+ case 10: ts = TriangleStrip(ab,ad,cd,bc); break; //+-+- case 11: ts = TriangleStrip(ab,bd,bc ); break; //+-++ case 12: ts = TriangleStrip(ad,ac,bc,bd); break; //++-- case 13: ts = TriangleStrip(ac,bc,cd ); break; //++-+ case 14: ts = TriangleStrip(ad,cd,bd ); break; //+++- default: throwException(_T("doTetra:Invalid index:%d"), index); } putTriangleStrip(ts); }