132001f49Smrg
232001f49Smrg#include <stdio.h>
332001f49Smrg#include <stdlib.h>
432001f49Smrg#include <math.h>
532001f49Smrg#include "glut_wrap.h"
632001f49Smrg
732001f49Smrgstatic int Win;
832001f49Smrgstatic int WinWidth = 400, WinHeight = 400;
932001f49Smrgstatic GLfloat Xrot = 0, Yrot = 0, Zrot = 0;
1032001f49Smrgstatic GLboolean Anim = GL_FALSE;
1132001f49Smrg
1232001f49Smrgstatic int CurVert = 0, MoveAll = 0;
1332001f49Smrgstatic GLfloat Verts[3][2];
1432001f49Smrg
1532001f49Smrg
1632001f49Smrgstatic void
1732001f49SmrgIdle(void)
1832001f49Smrg{
1932001f49Smrg   Xrot += 3.0;
2032001f49Smrg   Yrot += 4.0;
2132001f49Smrg   Zrot += 2.0;
2232001f49Smrg   glutPostRedisplay();
2332001f49Smrg}
2432001f49Smrg
2532001f49Smrg
2632001f49Smrgstatic void
2732001f49SmrgDraw(void)
2832001f49Smrg{
2932001f49Smrg   glClear(GL_COLOR_BUFFER_BIT);
3032001f49Smrg
3132001f49Smrg   glBegin(GL_POLYGON);
3232001f49Smrg   glVertex2fv(Verts[0]);
3332001f49Smrg   glVertex2fv(Verts[1]);
3432001f49Smrg   glVertex2fv(Verts[2]);
3532001f49Smrg   glEnd();
3632001f49Smrg
3732001f49Smrg   glutSwapBuffers();
3832001f49Smrg}
3932001f49Smrg
4032001f49Smrg
4132001f49Smrgstatic void
4232001f49SmrgReshape(int width, int height)
4332001f49Smrg{
4432001f49Smrg   WinWidth = width;
4532001f49Smrg   WinHeight = height;
4632001f49Smrg   glViewport(0, 0, width, height);
4732001f49Smrg   glMatrixMode(GL_PROJECTION);
4832001f49Smrg   glLoadIdentity();
4932001f49Smrg   glMatrixMode(GL_MODELVIEW);
5032001f49Smrg   glLoadIdentity();
5132001f49Smrg}
5232001f49Smrg
5332001f49Smrg
5432001f49Smrgstatic void
5532001f49SmrgRotVerts(void)
5632001f49Smrg{
5732001f49Smrg   float tx = Verts[0][0], ty = Verts[0][1];
5832001f49Smrg   Verts[0][0] = Verts[1][0];   Verts[0][1] = Verts[1][1];
5932001f49Smrg   Verts[1][0] = Verts[2][0];   Verts[1][1] = Verts[2][1];
6032001f49Smrg   Verts[2][0] = tx;            Verts[2][1] = ty;
6132001f49Smrg}
6232001f49Smrg
6332001f49Smrgstatic void
6432001f49SmrgSave(void)
6532001f49Smrg{
6632001f49Smrg   int i;
6732001f49Smrg   FILE *f = fopen("verts.txt", "w");
6832001f49Smrg   for (i = 0; i < 3; i++)
6932001f49Smrg      fprintf(f, "%f %f\n", Verts[i][0], Verts[i][1]);
7032001f49Smrg   fclose(f);
7132001f49Smrg   printf("Saved data\n");
7232001f49Smrg}
7332001f49Smrg
7432001f49Smrgstatic void
7532001f49SmrgRestore(void)
7632001f49Smrg{
7732001f49Smrg   int i;
7832001f49Smrg   FILE *f = fopen("verts.txt", "r");
7932001f49Smrg   if (f) {
8032001f49Smrg      printf("Restoring data\n");
8132001f49Smrg      for (i = 0; i < 3; i++) {
8232001f49Smrg         int n =fscanf(f, "%f %f\n", &Verts[i][0], &Verts[i][1]);
8332001f49Smrg         (void) n;
8432001f49Smrg      }
8532001f49Smrg      fclose(f);
8632001f49Smrg   }
8732001f49Smrg}
8832001f49Smrg
8932001f49Smrgstatic void
9032001f49SmrgKey(unsigned char key, int x, int y)
9132001f49Smrg{
9232001f49Smrg   (void) x;
9332001f49Smrg   (void) y;
9432001f49Smrg   switch (key) {
9532001f49Smrg   case 'r':
9632001f49Smrg      RotVerts();
9732001f49Smrg      break;
9832001f49Smrg   case 'a':
9932001f49Smrg      MoveAll = 1;
10032001f49Smrg      break;
10132001f49Smrg   case '0':
10232001f49Smrg      MoveAll = 0;
10332001f49Smrg      CurVert = 0;
10432001f49Smrg      break;
10532001f49Smrg   case '1':
10632001f49Smrg      MoveAll = 0;
10732001f49Smrg      CurVert = 1;
10832001f49Smrg      break;
10932001f49Smrg   case '2':
11032001f49Smrg      MoveAll = 0;
11132001f49Smrg      CurVert = 2;
11232001f49Smrg      break;
11332001f49Smrg   case 's':
11432001f49Smrg      Save();
11532001f49Smrg      break;
11632001f49Smrg   case 27:
11732001f49Smrg      glutDestroyWindow(Win);
11832001f49Smrg      exit(0);
11932001f49Smrg      break;
12032001f49Smrg   }
12132001f49Smrg   glutPostRedisplay();
12232001f49Smrg}
12332001f49Smrg
12432001f49Smrgstatic void
12532001f49Smrgmove(float dx, float dy)
12632001f49Smrg{
12732001f49Smrg   int i;
12832001f49Smrg
12932001f49Smrg   dx *= 0.05;
13032001f49Smrg   dy *= 0.05;
13132001f49Smrg   if (MoveAll) {
13232001f49Smrg      for (i = 0; i < 3; i++) {
13332001f49Smrg         Verts[i][0] += dx;
13432001f49Smrg         Verts[i][1] += dy;
13532001f49Smrg      }
13632001f49Smrg   }
13732001f49Smrg   else {
13832001f49Smrg      Verts[CurVert][0] += dx;
13932001f49Smrg      Verts[CurVert][1] += dy;
14032001f49Smrg   }
14132001f49Smrg
14232001f49Smrg   printf("\n");
14332001f49Smrg   for (i = 0; i < 3; i++) {
14432001f49Smrg      printf("%f %f\n", Verts[i][0], Verts[i][1]);
14532001f49Smrg   }
14632001f49Smrg}
14732001f49Smrg
14832001f49Smrg
14932001f49Smrgstatic void
15032001f49SmrgSpecialKey(int key, int x, int y)
15132001f49Smrg{
15232001f49Smrg   switch (key) {
15332001f49Smrg   case GLUT_KEY_UP:
15432001f49Smrg      move(0, +1);
15532001f49Smrg      break;
15632001f49Smrg   case GLUT_KEY_DOWN:
15732001f49Smrg      move(0, -1);
15832001f49Smrg      break;
15932001f49Smrg   case GLUT_KEY_LEFT:
16032001f49Smrg      move(-1, 0);
16132001f49Smrg      break;
16232001f49Smrg   case GLUT_KEY_RIGHT:
16332001f49Smrg      move(1, 0);
16432001f49Smrg      break;
16532001f49Smrg   }
16632001f49Smrg   glutPostRedisplay();
16732001f49Smrg}
16832001f49Smrg
16932001f49Smrg
17032001f49Smrgstatic void
17132001f49SmrgInit(void)
17232001f49Smrg{
17332001f49Smrg   Verts[0][0] = 0.0; Verts[0][1] = 0.0;
17432001f49Smrg   Verts[1][0] = 1.2; Verts[1][1] = -0.5;
17532001f49Smrg   Verts[2][0] = 0.6; Verts[2][1] = -1.5;
17632001f49Smrg
17732001f49Smrg   Restore();
17832001f49Smrg
17932001f49Smrg   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
18032001f49Smrg}
18132001f49Smrg
18232001f49Smrg
18332001f49Smrgint
18432001f49Smrgmain(int argc, char *argv[])
18532001f49Smrg{
18632001f49Smrg   glutInit(&argc, argv);
18732001f49Smrg   glutInitWindowSize(WinWidth, WinHeight);
18832001f49Smrg   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
18932001f49Smrg   Win = glutCreateWindow(argv[0]);
19032001f49Smrg   glutReshapeFunc(Reshape);
19132001f49Smrg   glutKeyboardFunc(Key);
19232001f49Smrg   glutSpecialFunc(SpecialKey);
19332001f49Smrg   glutDisplayFunc(Draw);
19432001f49Smrg   if (Anim)
19532001f49Smrg      glutIdleFunc(Idle);
19632001f49Smrg   Init();
19732001f49Smrg   glutMainLoop();
19832001f49Smrg   return 0;
19932001f49Smrg}
200