/* Demo of a possible color interpolation bug. The pictures in the first row are (1) a quad with RGBW vetices, (2) Two triangles cut along the ul-lr diagonal, (3) two triangles cut along the ur-ll diagonal. The pictures in the second row are (4) the quad cut into four triangles using the middle point, and (5) the quad cut into 400 quads using a mesh. The main problem is that the two triangulations are different, when it seems that they should be the same. Next, none of the elements on the first row matches the four-part triangulation in the second row. The fifth version is the smoothest yet, but they really should all match. Implemented Fall 2003 Scott D. Anderson */ #include #include #include const int both = 1; twTriple Quad[4] = { {0,0,0}, {0,1,0}, {1,1,0}, {1,0,0} }; GLfloat BLACK[3] = {0,0,0}; GLfloat color0[3] = {0,0,1}; GLfloat color1[3] = {0,1,0}; // {0.1,0.7,0.4}; GLfloat color2[3] = {1,0,0}; // {0.6,0.6,0.6}; GLfloat color3[3] = {1,1,1}; // {0.1,0.8,0.5}; void drawQuad() { glBegin(GL_QUADS); { glColor3fv(color0); glVertex3fv(Quad[0]); glColor3fv(color1); glVertex3fv(Quad[1]); glColor3fv(color2); glVertex3fv(Quad[2]); glColor3fv(color3); glVertex3fv(Quad[3]); } glEnd(); } void drawQuad1() { glBegin(GL_TRIANGLES); { glColor3fv(color0); glVertex3fv(Quad[0]); glColor3fv(color1); glVertex3fv(Quad[1]); glColor3fv(color2); glVertex3fv(Quad[2]); if(both) { glColor3fv(color2); glVertex3fv(Quad[2]); glColor3fv(color3); glVertex3fv(Quad[3]); glColor3fv(color0); glVertex3fv(Quad[0]); } } glEnd(); } void drawQuad2() { glBegin(GL_TRIANGLES); { glColor3fv(color0); glVertex3fv(Quad[0]); glColor3fv(color1); glVertex3fv(Quad[1]); glColor3fv(color3); glVertex3fv(Quad[3]); if(both) { glColor3fv(color1); glVertex3fv(Quad[1]); glColor3fv(color2); glVertex3fv(Quad[2]); glColor3fv(color3); glVertex3fv(Quad[3]); } } glEnd(); } void drawTri() { GLfloat mid[3]; GLfloat colormid[3]; mid[0] = (Quad[0][0]+Quad[1][0]+Quad[2][0]+Quad[3][0])/4; mid[1] = (Quad[0][1]+Quad[1][1]+Quad[2][1]+Quad[3][1])/4; mid[2] = 0; colormid[0] = (color0[0]+color1[0]+color2[0]+color3[0])/4; colormid[1] = (color0[1]+color1[1]+color2[1]+color3[1])/4; colormid[2] = (color0[2]+color1[2]+color2[2]+color3[2])/4; glBegin(GL_TRIANGLES); { glColor3fv(color0); glVertex3fv(Quad[0]); glColor3fv(color1); glVertex3fv(Quad[1]); glColor3fv(colormid); glVertex3fv(mid); glColor3fv(color1); glVertex3fv(Quad[1]); glColor3fv(color2); glVertex3fv(Quad[2]); glColor3fv(colormid); glVertex3fv(mid); glColor3fv(color2); glVertex3fv(Quad[2]); glColor3fv(color3); glVertex3fv(Quad[3]); glColor3fv(colormid); glVertex3fv(mid); glColor3fv(color3); glVertex3fv(Quad[3]); glColor3fv(color0); glVertex3fv(Quad[0]); glColor3fv(colormid); glVertex3fv(mid); } glEnd(); } void drawGrid() { const int steps = 20; GLfloat cp[4][3] = { {0,1,0}, {0,0,0}, {1,1,0}, {1,0,0} }; GLfloat colors[4][4] = { {0,1,0,1}, {0,0,1,1}, {1,0,0,1}, {1,1,1,1}}; glMap2f(GL_MAP2_VERTEX_3,0,1,3,2,0,1,6,2,&cp[0][0]); glMap2f(GL_MAP2_COLOR_4,0,1,4,2,0,1,8,2,&colors[0][0]); glEnable(GL_MAP2_COLOR_4); glEnable(GL_MAP2_VERTEX_3); glMapGrid2f(steps,0,1,steps,0,1); glEvalMesh2(GL_FILL,0,steps,0,steps); } void display(void) { twDisplayInit(); twCamera(); glShadeModel(GL_SMOOTH); drawQuad(); glPushMatrix(); glTranslatef(1,0,0); drawQuad1(); glPopMatrix(); glPushMatrix(); glTranslatef(2,0,0); drawQuad2(); glPopMatrix(); glPushMatrix(); glTranslatef(0.5,-1,0); drawTri(); glPopMatrix(); glPushMatrix(); glTranslatef(1.5,-1,0); drawGrid(); glPopMatrix(); glFlush(); glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); twInitWindowSize(800,500); glutCreateWindow(argv[0]); glLineWidth(2); glutDisplayFunc(display); twBoundingBox(0,3,-1,1,-1,1); twMainInit(); glutMainLoop(); return 0; }