📄 shapes.c
字号:
glLoadIdentity(); gluOrtho2D(0, width, height, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor(0.0, 0.0, 0.0, 0.0);}
void
command_draw_color(GLuint ypos) {
drawstr(20, ypos, "glColor3f (");
drawstr(170, ypos, ",");
drawstr(230, ypos, ",");
drawstr(290, ypos, ");");
}
void
command_draw_vertex(GLuint ypos) {
drawstr(20, ypos, "glVertex2f (");
drawstr(170, ypos, ",");
drawstr(230, ypos, ");");
}void command_display(void){
int i;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3ub(255, 255, 255); setfont("helvetica", 18);
drawstr(20, 30, "glBegin (");
if (mode == GL_LINES)
drawstr(95, 30, "GL_LINES);");
else if (mode == GL_LINE_LOOP)
drawstr(95, 30, "GL_LINE_LOOP);");
else if (mode == GL_LINE_STRIP)
drawstr(95, 30, "GL_LINE_STRIP);");
else if (mode == GL_TRIANGLES)
drawstr(95, 30, "GL_TRIANGLES);");
else if (mode == GL_TRIANGLE_FAN)
drawstr(95, 30, "GL_TRIANGLE_FAN);");
else if (mode == GL_TRIANGLE_STRIP)
drawstr(95, 30, "GL_TRIANGLE_STRIP);");
else if (mode == GL_QUADS)
drawstr(95, 30, "GL_QUADS);");
else if (mode == GL_QUAD_STRIP)
drawstr(95, 30, "GL_QUAD_STRIP);");
else if (mode == GL_POLYGON)
drawstr(95, 30, "GL_POLYGON);");
else if (mode == GL_POINTS)
drawstr(95, 30, "GL_POINTS);");
if ((mode == GL_LINES) && !shaded ) {
command_draw_color(lines[0].y);
command_draw_vertex(lines[3].y);
command_draw_vertex(lines[5].y); command_draw_color(lines[7].y);
command_draw_vertex(lines[10].y);
command_draw_vertex(lines[12].y);
drawstr(20, lines[12].y + 30, "glEnd();");
for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++) { cell_draw(&lines[i]);
}
}
else if ((mode == GL_TRIANGLE_FAN) || (mode == GL_TRIANGLE_STRIP) ||
(shaded &&
((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
(mode == GL_LINE_STRIP) || (mode == GL_QUADS)))) {
command_draw_color(shadeFour[0].y);
command_draw_vertex(shadeFour[3].y);
command_draw_color(shadeFour[5].y);
command_draw_vertex(shadeFour[8].y);
command_draw_color(shadeFour[10].y);
command_draw_vertex(shadeFour[13].y);
command_draw_color(shadeFour[15].y);
command_draw_vertex(shadeFour[18].y);
drawstr(20, shadeFour[18].y + 30, "glEnd();");
if (mode == GL_TRIANGLE_STRIP) {
for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
cell_draw(&tStrip[i]);
}
else if (mode == GL_TRIANGLE_FAN) {
for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
cell_draw(&tFan[i]);
}
else if (mode == GL_QUADS) {
for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
cell_draw(&shadeQuad[i]);
}
else {
for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
cell_draw(&shadeFour[i]);
}
}
else if (!shaded &&
((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP) ||
(mode == GL_QUADS))) {
command_draw_color(flatFour[0].y);
command_draw_vertex(flatFour[3].y);
command_draw_vertex(flatFour[5].y);
command_draw_vertex(flatFour[7].y);
command_draw_vertex(flatFour[9].y);
drawstr(20, flatFour[9].y + 30, "glEnd();");
if (mode == GL_QUADS) {
for (i = 0; i < (sizeof(flatQuadInit)/sizeof(float)); i++)
cell_draw(&flatQuad[i]);
}
else {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
cell_draw(&flatFour[i]);
}
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
command_draw_color(shadeThree[0].y);
command_draw_vertex(shadeThree[3].y);
command_draw_color(shadeThree[5].y);
command_draw_vertex(shadeThree[8].y);
command_draw_color(shadeThree[10].y);
command_draw_vertex(shadeThree[13].y);
drawstr(20, shadeThree[13].y + 30, "glEnd();");
for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++) {
cell_draw(&shadeThree[i]);
}
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
command_draw_color(flatThree[0].y);
command_draw_vertex(flatThree[3].y);
command_draw_vertex(flatThree[5].y);
command_draw_vertex(flatThree[7].y);
drawstr(20, flatThree[7].y + 30, "glEnd();");
for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++) {
cell_draw(&flatThree[i]);
}
}
else if (mode == GL_QUAD_STRIP) {
command_draw_color(shadeQStrip[0].y);
command_draw_vertex(shadeQStrip[3].y);
command_draw_color(shadeQStrip[5].y);
command_draw_vertex(shadeQStrip[8].y);
command_draw_color(shadeQStrip[10].y);
command_draw_vertex(shadeQStrip[13].y);
command_draw_color(shadeQStrip[15].y);
command_draw_vertex(shadeQStrip[18].y);
command_draw_color(shadeQStrip[20].y);
command_draw_vertex(shadeQStrip[23].y);
command_draw_color(shadeQStrip[25].y);
command_draw_vertex(shadeQStrip[28].y);
drawstr(20, shadeQStrip[28].y + 30, "glEnd();");
for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++) {
cell_draw(&shadeQStrip[i]);
}
}
else if ((mode == GL_POINTS)) {
command_draw_color(shadePoints[0].y);
command_draw_vertex(shadePoints[3].y);
command_draw_color(shadePoints[5].y);
command_draw_vertex(shadePoints[8].y);
command_draw_color(shadePoints[10].y);
command_draw_vertex(shadePoints[13].y);
command_draw_color(shadePoints[15].y);
command_draw_vertex(shadePoints[18].y);
command_draw_color(shadePoints[20].y);
command_draw_vertex(shadePoints[23].y);
command_draw_color(shadePoints[25].y);
command_draw_vertex(shadePoints[28].y);
drawstr(20, shadePoints[28].y + 30, "glEnd();");
for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++) {
cell_draw(&shadePoints[i]);
}
}
if (!selection) { glColor3ub(255, 255, 0); drawstr(10, MESSAGEY, "Click on the arguments and");
drawstr(10, MESSAGEY+30, "move the mouse to modify values."); } glutSwapBuffers();}int old_y;voidcommand_mouse(int button, int state, int x, int y){
int i; selection = 0; if (state == GLUT_DOWN) { /* mouse should only hit _one_ of the cells, so adding up all the hits just propagates a single hit. */
if ((mode == GL_LINES) && !shaded ) {
for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++) selection += cell_hit(&lines[i], x, y);
}
else if ((shaded &&
((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
(mode == GL_LINE_STRIP)))) {
for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
selection += cell_hit(&shadeFour[i], x, y);
}
else if (!shaded &&
((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP))) {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
selection += cell_hit(&flatFour[i], x, y);
}
else if (shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
selection += cell_hit(&shadeQuad[i], x, y);
}
else if (!shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(flatQuadInit)/sizeof(float)); i++)
selection += cell_hit(&flatQuad[i], x, y);
}
else if (mode == GL_TRIANGLE_FAN) {
for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
selection += cell_hit(&tFan[i], x, y);
}
else if (mode == GL_TRIANGLE_STRIP) {
for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
selection += cell_hit(&tStrip[i], x, y);
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++)
selection += cell_hit(&shadeThree[i], x, y);
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++)
selection += cell_hit(&flatThree[i], x, y);
}
else if (mode == GL_QUAD_STRIP) {
for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++)
selection += cell_hit(&shadeQStrip[i], x, y);
}
else if (mode == GL_POINTS) {
for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++)
selection += cell_hit(&shadePoints[i], x, y);
}
} old_y = y; redisplay_all();}voidcommand_motion(int x, int y){
int i;
if ((mode == GL_LINES) && !shaded ) {
for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++) cell_update(&lines[i], old_y-y);
}
else if (shaded &&
((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
(mode == GL_LINE_STRIP))) {
for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
cell_update(&shadeFour[i], old_y-y);
}
else if (mode == GL_TRIANGLE_STRIP) {
for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
cell_update(&tStrip[i], old_y-y);
}
else if (mode == GL_TRIANGLE_FAN) {
for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
cell_update(&tFan[i], old_y-y);
}
else if (shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
cell_update(&shadeQuad[i], old_y-y);
}
else if (!shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
cell_update(&flatQuad[i], old_y-y);
}
else if (!shaded &&
((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP))) {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
cell_update(&flatFour[i], old_y-y);
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++)
cell_update(&shadeThree[i], old_y-y);
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++)
cell_update(&flatThree[i], old_y-y);
}
else if (mode == GL_QUAD_STRIP) {
for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++)
cell_update(&shadeQStrip[i], old_y-y);
}
else if (mode == GL_POINTS) {
for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++)
cell_update(&shadePoints[i], old_y-y);
}
old_y = y; redisplay_all();}
void
screen_menu(int value)
{
main_keyboard((unsigned char)value, 0, 0);
}
voidcommand_menu(int value){ main_keyboard((unsigned char)value, 0, 0);}voidredisplay_all(void){ glutSetWindow(command); glutPostRedisplay(); glutSetWindow(screen); screen_reshape(sub_width, sub_height); glutPostRedisplay();}intmain(int argc, char** argv){ glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutInitWindowSize(640+GAP*3, 512+GAP*2); glutInitWindowPosition(50, 50); glutInit(&argc, argv); window = glutCreateWindow("Shapes"); glutReshapeFunc(main_reshape); glutDisplayFunc(main_display); glutKeyboardFunc(main_keyboard); screen = glutCreateSubWindow(window, GAP, GAP, 256, 256); glutReshapeFunc(screen_reshape); glutDisplayFunc(screen_display); glutKeyboardFunc(main_keyboard); sm = glutCreateMenu(screen_menu); glutAddMenuEntry("Options", 0); glutAddMenuEntry("", 0); glutAddMenuEntry("Toggle big vertices", 'B'); glutAddMenuEntry("Specify colors@vertices", 'C'); glutAddMenuEntry("Toggle drawing outlines", 'O'); glutAttachMenu(GLUT_RIGHT_BUTTON);
createCircleList ();
command = glutCreateSubWindow(window, GAP+256+GAP, GAP, 256, 256); glutReshapeFunc(command_reshape); glutDisplayFunc(command_display); glutMotionFunc(command_motion); glutMouseFunc(command_mouse); glutKeyboardFunc(main_keyboard); glutCreateMenu(command_menu); glutAddMenuEntry("Shapes", 0); glutAddMenuEntry("", 0);
glutAddMenuEntry("POINTS [p] ", 'p'); glutAddMenuEntry("LINES [l] ", 'l'); glutAddMenuEntry("LINE_LOOP [n]", 'n'); glutAddMenuEntry("LINE_STRIP [y]", 'y');
glutAddMenuEntry("TRIANGLES [t]", 't');
glutAddMenuEntry("TRIANGLE_FAN [f]", 'f');
glutAddMenuEntry("TRIANGLE_STRIP [x]", 'x');
glutAddMenuEntry("QUADS [q]", 'q');
glutAddMenuEntry("QUAD_STRIP [u]", 'u');
glutAddMenuEntry("POLYGON [g]", 'g'); glutAddMenuEntry("Reset parameters [r]", 'r'); glutAddMenuEntry("", 0); glutAddMenuEntry("Quit", 27); glutAttachMenu(GLUT_RIGHT_BUTTON);
redisplay_all(); glutMainLoop(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -