📄 shapes.c
字号:
((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP) ||
(mode == GL_QUADS))) {
if (mode == GL_QUADS)
cell_vector (vals, flatQuad, sizeof(flatQuadInit)/sizeof(float));
else
cell_vector (vals, flatFour, sizeof(flatFourInit)/sizeof(float));
if (mode == GL_LINE_LOOP)
glBegin (GL_LINE_LOOP);
else if (mode == GL_LINE_STRIP)
glBegin (GL_LINE_STRIP);
else if (mode == GL_QUADS)
glBegin (GL_QUADS);
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[5]);
glVertex2fv (&vals[7]);
glVertex2fv (&vals[9]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
drawCircle (&vals[5]);
drawCircle (&vals[7]);
drawCircle (&vals[9]);
}
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
cell_vector (vals, shadeThree, sizeof(shadeThreeInit)/sizeof(float));
if (mode == GL_TRIANGLES)
glBegin (GL_TRIANGLES);
else if (mode == GL_POLYGON)
glBegin (GL_POLYGON);
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glColor3fv (&vals[5]);
glVertex2fv (&vals[8]);
glColor3fv (&vals[10]);
glVertex2fv (&vals[13]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
glColor3fv (&vals[5]);
drawCircle (&vals[8]);
glColor3fv (&vals[10]);
drawCircle (&vals[13]);
}
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
cell_vector (vals, flatThree, sizeof(flatThreeInit)/sizeof(float));
if (mode == GL_TRIANGLES)
glBegin (GL_TRIANGLES);
else if (mode == GL_POLYGON)
glBegin (GL_POLYGON);
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[5]);
glVertex2fv (&vals[7]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
drawCircle (&vals[5]);
drawCircle (&vals[7]);
}
}
else if ((mode == GL_POINTS) || (mode == GL_QUAD_STRIP)) {
if (mode == GL_POINTS) {
cell_vector (vals, shadePoints, sizeof(shadePointsInit)/sizeof(float));
glBegin (GL_POINTS);
}
else if (mode == GL_QUAD_STRIP) {
cell_vector (vals, shadeQStrip, sizeof(shadeQStripInit)/sizeof(float));
glBegin (GL_QUAD_STRIP);
}
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glColor3fv (&vals[5]);
glVertex2fv (&vals[8]);
glColor3fv (&vals[10]);
glVertex2fv (&vals[13]);
glColor3fv (&vals[15]);
glVertex2fv (&vals[18]);
glColor3fv (&vals[20]);
glVertex2fv (&vals[23]);
glColor3fv (&vals[25]);
glVertex2fv (&vals[28]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
glColor3fv (&vals[5]);
drawCircle (&vals[8]);
glColor3fv (&vals[10]);
drawCircle (&vals[13]);
glColor3fv (&vals[15]);
drawCircle (&vals[18]);
glColor3fv (&vals[20]);
drawCircle (&vals[23]);
glColor3fv (&vals[25]);
drawCircle (&vals[28]);
}
if (outlined && (mode == GL_QUAD_STRIP)) {
glLineWidth (3.0);
glColor3f (1.0f, 1.0f, 1.0f);
glBegin (GL_LINE_LOOP);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[18]);
glVertex2fv (&vals[28]);
glVertex2fv (&vals[23]);
glVertex2fv (&vals[13]);
glEnd();
glBegin (GL_LINES);
glVertex2fv (&vals[13]);
glVertex2fv (&vals[18]);
glEnd();
glLineWidth (1.0);
glColor3f (0.0f, 0.0f, 0.0f);
glBegin (GL_LINE_LOOP);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[18]);
glVertex2fv (&vals[28]);
glVertex2fv (&vals[23]);
glVertex2fv (&vals[13]);
glEnd();
glBegin (GL_LINES);
glVertex2fv (&vals[13]);
glVertex2fv (&vals[18]);
glEnd();
}
}
}
void
drawaxes(void)
{
glColor3ub(255, 255, 255);
glLineWidth (2.0);
glBegin (GL_LINE_STRIP);
glVertex2i (200, 0);
glVertex2i (0, 0);
glVertex2i (0, 200);
glEnd ();
glBegin (GL_LINE_STRIP);
glVertex2i (-5, 195);
glVertex2i (0, 200);
glVertex2i (5, 195);
glEnd ();
glBegin (GL_LINE_STRIP);
glVertex2i (195, -5);
glVertex2i (200, 0);
glVertex2i (195, 5);
glEnd ();
glLineWidth (1.0);
setfont("helvetica", 12);
drawstr(205, -3, "X");
drawstr(-5, 205, "Y");
drawstr(-10, -10, "0");
drawstr(-27, 195, "200");
drawstr(186, -16, "200");
}voidmain_reshape(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, width, height, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); #define GAP 25 /* gap between subwindows */ sub_width = (width-GAP*3)/2.0; sub_height = (height-GAP*2); glutSetWindow(screen); glutPositionWindow(GAP, GAP); glutReshapeWindow(sub_width, sub_height);
glutSetWindow(command); glutPositionWindow(GAP+sub_width+GAP, GAP); glutReshapeWindow(sub_width, sub_height);}voidmain_display(void){ glClearColor(0.8f, 0.8f, 0.8f, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3ub(0, 0, 0); setfont("helvetica", 12); drawstr(GAP, GAP-5, "Screen-space view"); drawstr(GAP+sub_width+GAP, GAP-5, "Command manipulation window"); glutSwapBuffers();}voidmain_keyboard(unsigned char key, int x, int y){
int i;
switch (key) {
case 'B':
bigVertices = !bigVertices;
break;
case 'C':
shaded = !shaded;
break;
case 'O':
outlined = !outlined;
break;
case 'f':
mode = GL_TRIANGLE_FAN;
glutSetWindow(screen);
glutDestroyMenu (sm);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle drawing outlines", 'O');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'g':
mode = GL_POLYGON;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break; case 'l':
mode = GL_LINES;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'n':
mode = GL_LINE_LOOP;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'p':
mode = GL_POINTS;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'q':
mode = GL_QUADS;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'r':
if (!shaded && (mode == GL_LINES)) {
for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++)
lines[i].value = linesInit[i];
}
else if (shaded &&
((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
(mode == GL_LINE_STRIP))) {
for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
shadeFour[i].value = shadeFourInit[i];
}
else if (!shaded &&
(mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP)) {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
flatFour[i].value = flatFourInit[i];
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++)
shadeThree[i].value = shadeThreeInit[i];
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++)
flatThree[i].value = flatThreeInit[i];
}
else if (mode == GL_TRIANGLE_FAN) {
for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
tFan[i].value = tFanInit[i];
}
else if (mode == GL_TRIANGLE_STRIP) {
for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
tStrip[i].value = tStripInit[i];
}
else if (!shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(flatQuadInit)/sizeof(float)); i++)
flatQuad[i].value = flatQuadInit[i];
}
else if (shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
shadeQuad[i].value = shadeQuadInit[i];
}
else if (mode == GL_QUAD_STRIP) {
for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++)
shadeQStrip[i].value = shadeQStripInit[i];
}
else if (mode == GL_POINTS) {
for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++)
shadePoints[i].value = shadePointsInit[i];
}
break;
case 't':
mode = GL_TRIANGLES;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'u':
mode = GL_QUAD_STRIP;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle drawing outlines", 'O');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'x':
mode = GL_TRIANGLE_STRIP;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle drawing outlines", 'O');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'y':
mode = GL_LINE_STRIP;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break; case 27: exit(0);
default:
break; } redisplay_all();}voidscreen_reshape(int width, int height){ glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D ((GLdouble) 100-width/2, (GLdouble) 100+width/2,
(GLdouble) 100-height/2, (GLdouble) 100+height/2); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}voidscreen_display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawaxes();
drawmodel(); glutSwapBuffers();}voidcommand_reshape(int width, int height){ glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -