📄 main.c
字号:
/*
* main.c - part of the chess demo in the glut distribution.
*
* (C) Henk Kok (kok@wins.uva.nl)
*
* This file can be freely copied, changed, redistributed, etc. as long as
* this copyright notice stays intact.
*/
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>
#include "chess.h"
/* Some <math.h> files do not define M_PI... */
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#define M_TEXTURING 1
#define M_REFLECTION 2
#define M_CHAOS 3
#define M_ANIMATION 4
extern int reflection, texturing, animating, chaos;
GLfloat lightpos[4] = { 2.0, 1.0, 1.0, 0.0 };
GLfloat lightamb[4] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat lightdif[4] = { 1.0, 1.0, 1.0, 1.0 };
float angle = 0.0, a2 = 45.0;
int speed = 0;
GLfloat px = -3.5, py = -16.5, pz = 9.5;
void SetCamera(void)
{
gluLookAt(0.0,2.0,2.0, 0.0,2.0,0.0, 0.0,1.0,0.0);
glRotatef(a2, 1.0, 0.0, 0.0);
glRotatef(angle, 0.0, 1.0, 0.0);
glTranslatef(px, -pz, py);
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
}
void display(void)
{
glLoadIdentity();
SetCamera();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
do_display();
glutSwapBuffers();
}
void myinit(void)
{
glShadeModel (GL_SMOOTH);
glFrontFace(GL_CCW);
glEnable(GL_DEPTH_TEST);
glLoadIdentity();
glClearColor(0.0, 0.0, 0.0, 1.0);
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightamb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightdif);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
init_lists();
}
void Animate(void)
{
px -= speed * 0.02 * sin(angle*M_PI/180);
py += speed * 0.02 * cos(angle*M_PI/180);
if (animating)
proceed();
glutPostRedisplay();
}
extern int chaosPieces;
/* ARGSUSED1 */
void parsekey(unsigned char key, int x, int y)
{
switch (key)
{
case 27: exit(0);
case 13: speed = 0; break;
case 'a': a2 += 5; break;
case 'z': a2 -= 5; break;
case 'A': pz += 0.5; break;
case 'Z': pz -= 0.5; break;
default:
return;
}
glutPostRedisplay();
if (animating || (chaosPieces > 0) || (speed != 0))
glutIdleFunc(Animate);
else
glutIdleFunc(NULL);
}
/* ARGSUSED1 */
void parsekey_special(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_UP: speed += 1; break;
case GLUT_KEY_DOWN: speed -= 1; break;
case GLUT_KEY_RIGHT: angle += 5; break;
case GLUT_KEY_LEFT: angle -= 5; break;
case GLUT_KEY_HOME:
angle = 0.0, a2 = 45.0;
speed = 0;
px = -3.5, py = -16.5, pz = 9.5;
break;
default:
return;
}
glutPostRedisplay();
if (animating || (chaosPieces > 0) || (speed != 0))
glutIdleFunc(Animate);
else
glutIdleFunc(NULL);
}
void handle_main_menu(int item)
{
switch(item) {
case M_REFLECTION:
reflection = !reflection;
glutPostRedisplay();
break;
case M_TEXTURING:
texturing = !texturing;
glutPostRedisplay();
break;
case M_ANIMATION:
animating = !animating;
if (animating || (chaosPieces > 0) || (speed != 0))
glutIdleFunc(Animate);
else
glutIdleFunc(NULL);
break;
case M_CHAOS:
chaos = !chaos;
if (animating || chaos || (speed != 0))
glutIdleFunc(Animate);
break;
}
}
void
Visible(int visible)
{
if (visible == GLUT_VISIBLE) {
if (animating || (chaosPieces > 0) || (speed != 0))
glutIdleFunc(Animate);
} else {
glutIdleFunc(NULL);
}
}
void myReshape(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum (-0.1, 0.1, -0.1, 0.1, 0.3, 200.0);
glMatrixMode (GL_MODELVIEW);
glViewport(0, 0, w, h);
glLoadIdentity();
SetCamera();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE | GLUT_STENCIL);
glutCreateWindow("Chess");
glutDisplayFunc(display);
glutInitWindowPosition(200, 0);
glutInitWindowSize(300, 300);
glutKeyboardFunc(parsekey);
glutSpecialFunc(parsekey_special);
glutReshapeFunc(myReshape);
glutVisibilityFunc(Visible);
myinit();
glutCreateMenu(handle_main_menu);
glutAddMenuEntry("Toggle texturing", M_TEXTURING);
glutAddMenuEntry("Toggle reflection", M_REFLECTION);
glutAddMenuEntry("-----------------", -1);
glutAddMenuEntry("Toggle animation", M_ANIMATION);
glutAddMenuEntry("Toggle CHAOS!", M_CHAOS);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutSwapBuffers();
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -