bool doMeshNoBumps(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); // Reset The View glTranslatef(0.0f,0.0f,z); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); if (useMultitexture) { glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE0_ARB); } glDisable(GL_BLEND); glBindTexture(GL_TEXTURE_2D,texture[filter]); glBlendFunc(GL_DST_COLOR,GL_SRC_COLOR); glEnable(GL_LIGHTING); doCube(); xrot+=xspeed; yrot+=yspeed; if (xrot>360.0f) xrot-=360.0f; if (xrot<0.0f) xrot+=360.0f; if (yrot>360.0f) yrot-=360.0f; if (yrot<0.0f) yrot+=360.0f; /* LAST PASS: Do The Logos! */ doLogo(); return true; // Keep Going }
bool IsoSurfacePolygonizer::addSurfaceVertices(const StackedCube &cube) { if(m_tetrahedralMode) { // either decompose into tetrahedra and polygonize each: doTetra(cube, LBN, LTN, RBN, LBF); doTetra(cube, RTN, LTN, LBF, RBN); doTetra(cube, RTN, LTN, LTF, LBF); doTetra(cube, RTN, RBN, LBF, RBF); doTetra(cube, RTN, LBF, LTF, RBF); doTetra(cube, RTN, LTF, RTF, RBF); } else { doCube(cube); // or polygonize the cube directly: } if(!m_adaptiveCellSize || (cube.getLevel()==MAXSPLITLEVEL) || acceptPendingFaces()) { flushFaceBuffer(); return true; } else { clearFaceBuffer(); return false; } }
bool doMesh2TexelUnits(void) { GLfloat c[4]={0.0f,0.0f,0.0f,1.0f}; // holds current vertex GLfloat n[4]={0.0f,0.0f,0.0f,1.0f}; // normalized normal of current surface GLfloat s[4]={0.0f,0.0f,0.0f,1.0f}; // s-texture coordinate direction, normalized GLfloat t[4]={0.0f,0.0f,0.0f,1.0f}; // t-texture coordinate direction, normalized GLfloat l[4]; // holds our lightposition to be transformed into object space GLfloat Minv[16]; // holds the inverted modelview matrix to do so. int i; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer // Build Inverse Modelview Matrix First. This Substitutes One Push/Pop With One glLoadIdentity(); // Simply Build It By Doing All Transformations Negated And In Reverse Order. glLoadIdentity(); glRotatef(-yrot,0.0f,1.0f,0.0f); glRotatef(-xrot,1.0f,0.0f,0.0f); glTranslatef(0.0f,0.0f,-z); glGetFloatv(GL_MODELVIEW_MATRIX,Minv); glLoadIdentity(); glTranslatef(0.0f,0.0f,z); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); // Transform The Lightposition Into Object Coordinates: l[0]=LightPosition[0]; l[1]=LightPosition[1]; l[2]=LightPosition[2]; l[3]=1.0f; // Homogenous Coordinate VMatMult(Minv,l); /* PASS#1: Texel-Unit 0: Use Texture "Bump" No Blend No Lighting No Offset Texture-Coordinates Texture-Operation "Replace" Texel-Unit 1: Use Texture "Invbump" No Lighting Offset Texture Coordinates Texture-Operation "Replace" */ // TEXTURE-UNIT #0 glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, bump[filter]); glTexEnvf(GL_TEXTURE_ENV, (GLenum)GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT); glTexEnvf(GL_TEXTURE_ENV, (GLenum)GL_COMBINE_RGB_EXT, GL_REPLACE); // TEXTURE-UNIT #1: glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, invbump[filter]); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT); glTexEnvf (GL_TEXTURE_ENV, (GLenum)GL_COMBINE_RGB_EXT, GL_ADD); // General Switches: glDisable(GL_BLEND); glDisable(GL_LIGHTING); glBegin(GL_QUADS); // Front Face n[0]=0.0f; n[1]=0.0f; n[2]=1.0f; s[0]=1.0f; s[1]=0.0f; s[2]=0.0f; t[0]=0.0f; t[1]=1.0f; t[2]=0.0f; for (i=0; i<4; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,data[5*i] , data[5*i+1]); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Back Face n[0]=0.0f; n[1]=0.0f; n[2]=-1.0f; s[0]=-1.0f; s[1]=0.0f; s[2]=0.0f; t[0]=0.0f; t[1]=1.0f; t[2]=0.0f; for (i=4; i<8; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,data[5*i] , data[5*i+1]); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Top Face n[0]=0.0f; n[1]=1.0f; n[2]=0.0f; s[0]=1.0f; s[1]=0.0f; s[2]=0.0f; t[0]=0.0f; t[1]=0.0f; t[2]=-1.0f; for (i=8; i<12; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,data[5*i] , data[5*i+1] ); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Bottom Face n[0]=0.0f; n[1]=-1.0f; n[2]=0.0f; s[0]=-1.0f; s[1]=0.0f; s[2]=0.0f; t[0]=0.0f; t[1]=0.0f; t[2]=-1.0f; for (i=12; i<16; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,data[5*i] , data[5*i+1] ); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Right Face n[0]=1.0f; n[1]=0.0f; n[2]=0.0f; s[0]=0.0f; s[1]=0.0f; s[2]=-1.0f; t[0]=0.0f; t[1]=1.0f; t[2]=0.0f; for (i=16; i<20; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,data[5*i] , data[5*i+1] ); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Left Face n[0]=-1.0f; n[1]=0.0f; n[2]=0.0f; s[0]=0.0f; s[1]=0.0f; s[2]=1.0f; t[0]=0.0f; t[1]=1.0f; t[2]=0.0f; for (i=20; i<24; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,data[5*i] , data[5*i+1] ); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } glEnd(); /* PASS#2 Use Texture "Base" Blend GL_DST_COLOR To GL_SRC_COLOR (Multiplies By 2) Lighting Enabled No Offset Texture-Coordinates */ glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE0_ARB); if (!emboss) { glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBindTexture(GL_TEXTURE_2D,texture[filter]); glBlendFunc(GL_DST_COLOR,GL_SRC_COLOR); glEnable(GL_BLEND); glEnable(GL_LIGHTING); doCube(); } xrot+=xspeed; yrot+=yspeed; if (xrot>360.0f) xrot-=360.0f; if (xrot<0.0f) xrot+=360.0f; if (yrot>360.0f) yrot-=360.0f; if (yrot<0.0f) yrot+=360.0f; /* LAST PASS: Do The Logos! */ doLogo(); return true; // Keep Going }
bool doMesh1TexelUnits(void) { GLfloat c[4]={0.0f,0.0f,0.0f,1.0f}; // Holds Current Vertex GLfloat n[4]={0.0f,0.0f,0.0f,1.0f}; // Normalized Normal Of Current Surface GLfloat s[4]={0.0f,0.0f,0.0f,1.0f}; // s-Texture Coordinate Direction, Normalized GLfloat t[4]={0.0f,0.0f,0.0f,1.0f}; // t-Texture Coordinate Direction, Normalized GLfloat l[4]; // Holds Our Lightposition To Be Transformed Into Object Space GLfloat Minv[16]; // Holds The Inverted Modelview Matrix To Do So. int i; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer // Build Inverse Modelview Matrix First. This Substitutes One Push/Pop With One glLoadIdentity(); // Simply Build It By Doing All Transformations Negated And In Reverse Order. glLoadIdentity(); glRotatef(-yrot,0.0f,1.0f,0.0f); glRotatef(-xrot,1.0f,0.0f,0.0f); glTranslatef(0.0f,0.0f,-z); glGetFloatv(GL_MODELVIEW_MATRIX,Minv); glLoadIdentity(); glTranslatef(0.0f,0.0f,z); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); // Transform The Lightposition Into Object Coordinates: l[0]=LightPosition[0]; l[1]=LightPosition[1]; l[2]=LightPosition[2]; l[3]=1.0f; // Homogenous Coordinate VMatMult(Minv,l); /* PASS#1: Use Texture "Bump" No Blend No Lighting No Offset Texture-Coordinates */ glBindTexture(GL_TEXTURE_2D, bump[filter]); glDisable(GL_BLEND); glDisable(GL_LIGHTING); doCube(); /* PASS#2: Use Texture "Invbump" Blend GL_ONE To GL_ONE No Lighting Offset Texture Coordinates */ glBindTexture(GL_TEXTURE_2D,invbump[filter]); glBlendFunc(GL_ONE,GL_ONE); glDepthFunc(GL_LEQUAL); glEnable(GL_BLEND); glBegin(GL_QUADS); // Front Face n[0]=0.0f; n[1]=0.0f; n[2]=1.0f; s[0]=1.0f; s[1]=0.0f; s[2]=0.0f; t[0]=0.0f; t[1]=1.0f; t[2]=0.0f; for (i=0; i<4; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Back Face n[0]=0.0f; n[1]=0.0f; n[2]=-1.0f; s[0]=-1.0f; s[1]=0.0f; s[2]=0.0f; t[0]=0.0f; t[1]=1.0f; t[2]=0.0f; for (i=4; i<8; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Top Face n[0]=0.0f; n[1]=1.0f; n[2]=0.0f; s[0]=1.0f; s[1]=0.0f; s[2]=0.0f; t[0]=0.0f; t[1]=0.0f; t[2]=-1.0f; for (i=8; i<12; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Bottom Face n[0]=0.0f; n[1]=-1.0f; n[2]=0.0f; s[0]=-1.0f; s[1]=0.0f; s[2]=0.0f; t[0]=0.0f; t[1]=0.0f; t[2]=-1.0f; for (i=12; i<16; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Right Face n[0]=1.0f; n[1]=0.0f; n[2]=0.0f; s[0]=0.0f; s[1]=0.0f; s[2]=-1.0f; t[0]=0.0f; t[1]=1.0f; t[2]=0.0f; for (i=16; i<20; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } // Left Face n[0]=-1.0f; n[1]=0.0f; n[2]=0.0f; s[0]=0.0f; s[1]=0.0f; s[2]=1.0f; t[0]=0.0f; t[1]=1.0f; t[2]=0.0f; for (i=20; i<24; i++) { c[0]=data[5*i+2]; c[1]=data[5*i+3]; c[2]=data[5*i+4]; SetUpBumps(n,c,l,s,t); glTexCoord2f(data[5*i]+c[0], data[5*i+1]+c[1]); glVertex3f(data[5*i+2], data[5*i+3], data[5*i+4]); } glEnd(); /* PASS#3: Use Texture "Base" Blend GL_DST_COLOR To GL_SRC_COLOR (Multiplies By 2) Lighting Enabled No Offset Texture-Coordinates */ if (!emboss) { glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBindTexture(GL_TEXTURE_2D,texture[filter]); glBlendFunc(GL_DST_COLOR,GL_SRC_COLOR); glEnable(GL_LIGHTING); doCube(); } xrot+=xspeed; yrot+=yspeed; if (xrot>360.0f) xrot-=360.0f; if (xrot<0.0f) xrot+=360.0f; if (yrot>360.0f) yrot-=360.0f; if (yrot<0.0f) yrot+=360.0f; /* LAST PASS: Do The Logos! */ doLogo(); return true; // Keep Going }