File: decal.c

package info (click to toggle)
glut 3.7-14
  • links: PTS
  • area: main
  • in suites: woody
  • size: 12,556 kB
  • ctags: 45,170
  • sloc: ansic: 148,716; makefile: 35,208; ada: 2,062; yacc: 473; fortran: 290; lex: 131; csh: 51; sed: 49; sh: 33
file content (123 lines) | stat: -rw-r--r-- 2,454 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123

/* decal.c - by Tom McReynolds, SGI */

/* An Example of decaling, using stencil */

#include <GL/glut.h>
#include <stdlib.h>

/* ARGSUSED1 */
void 
key(unsigned char key, int x, int y)
{
  switch (key) {
  case '\033':
    exit(0);
  }
}

/* decal shape polygon onto base */
void 
decal_poly(void)
{
  glBegin(GL_QUADS);
  glNormal3f(0.f, 0.f, -1.f);
  glVertex3i(-2, 2, 0);
  glVertex3i(-2, 3, 0);
  glVertex3i(2, 3, 0);
  glVertex3i(2, 2, 0);

  glVertex3f(-.5, -3.f, 0);
  glVertex3f(-.5f, 2.f, 0);
  glVertex3f(.5f, 2.f, 0);
  glVertex3f(.5f, -3.f, 0);
  glEnd();
}

int angle = 0;

void 
redraw(void)
{
  /* clear stencil each time */
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

  glEnable(GL_STENCIL_TEST);
  glStencilFunc(GL_ALWAYS, 1, 1);
  glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
  glDepthFunc(GL_LESS);

  glPushMatrix();
  glColor3f(1.f, 0.f, 0.f);
  glTranslatef(0.f, 0.f, -10.f);
  glScalef(5.f, 5.f, 5.f);
  glRotatef((GLfloat) angle, 0.f, 1.f, 0.f);
  glEnable(GL_NORMALIZE);
  glutSolidDodecahedron();
  glDisable(GL_NORMALIZE);
  glPopMatrix();

  glStencilFunc(GL_EQUAL, 1, 1);
  glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  glDepthFunc(GL_ALWAYS);

  glPushMatrix();
  glTranslatef(0.f, 0.f, -10.f);
  glRotatef((GLfloat) angle, 0.f, 1.f, 0.f);
  glRotatef(58.285f, 0.f, 1.f, 0.f);
  glTranslatef(0.f, 0.f, -7.265f);
  glColor3f(0.f, 1.f, 0.f);
  decal_poly();
  glPopMatrix();

  glDisable(GL_STENCIL_TEST);

  glutSwapBuffers();
}

void 
anim(void)
{
  angle = (angle + 1) % 360;
  glutPostRedisplay();
}

void
visible(int vis)
{
  if (vis == GLUT_VISIBLE)
    glutIdleFunc(anim);
  else
    glutIdleFunc(NULL);
}

int
main(int argc, char *argv[])
{
  static GLfloat lightpos[] =
  {10.f, 5.f, 0.f, 1.f};

  glutInit(&argc, argv);
  glutInitWindowSize(512, 512);
  glutInitDisplayMode(GLUT_STENCIL | GLUT_DEPTH | GLUT_DOUBLE);
  (void) glutCreateWindow("decal");
  glutDisplayFunc(redraw);
  glutKeyboardFunc(key);
  glutVisibilityFunc(visible);
  glEnable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  glOrtho(-10., 10., -10., 10., 0., 20.);
  glMatrixMode(GL_MODELVIEW);

  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glEnable(GL_CULL_FACE);
  glCullFace(GL_BACK);

  glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  glEnable(GL_COLOR_MATERIAL);

  glutMainLoop();
  return 0;             /* ANSI C requires main to return int. */
}