backspecular.c revision 32001f49
1#include <stdlib.h>
2#include <GL/glew.h>
3#include "glut_wrap.h"
4
5
6static const float black[4]    = { 0, 0, 0, 1 };
7static const float white[4]    = { 1, 1, 1, 1 };
8static const float diffuse[4]  = { 1, 0, 0, 1 };
9static const float diffuseb[4] = { 0, 1, 0, 1 };
10static const float specular[4] = { 0.5, 0.5, 0.5, 1 };
11static const float ambient[4]  = { 0.2, 0.2, 0.2, 1 };
12static const float lightpos[4] = { 0, 0, 10, 0 };
13static const float shininess = 50;
14
15static double angle = 0.0;
16
17static int autorotate = 1;
18static double angle_delta = 1.0;
19static int timeout = 10;
20
21
22static void
23display(void)
24{
25   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
26   glPushMatrix();
27   glRotated(angle, 0.0, 1.0, 0.0);
28
29   glBegin(GL_QUADS);
30   glColor3f(1, 1, 1);
31   glNormal3d(0, 0, 1);
32   glVertex3d(-1, -1, 0);
33   glVertex3d(+1, -1, 0);
34   glVertex3d(+1, +1, 0);
35   glVertex3d(-1, +1, 0);
36   glEnd();
37
38   glPopMatrix();
39
40   glutSwapBuffers();
41}
42
43
44static void
45timer(int value)
46{
47   angle += angle_delta;
48   glutTimerFunc(timeout, timer, 0);
49   glutPostRedisplay();
50}
51
52
53static void
54key(unsigned char key, int x, int y)
55{
56   if (key == 27) {
57      exit(0);
58   }
59}
60
61
62int
63main(int argc, char **argv)
64{
65   /* init glut */
66   glutInit(&argc, argv);
67   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
68   glutCreateWindow("Backface specular test");
69   glutDisplayFunc(display);
70   glutKeyboardFunc(key);
71   if (autorotate)
72      glutTimerFunc(timeout, timer, 0);
73
74   /* setup lighting */
75   glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
76   glMaterialfv(GL_BACK,  GL_DIFFUSE, diffuseb);
77
78   glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,  black);
79   glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,  specular);
80   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,   ambient);
81   glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shininess);
82
83   glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
84   glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
85   glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
86
87   glLightfv(GL_LIGHT0, GL_AMBIENT,  black);
88   glLightfv(GL_LIGHT0, GL_DIFFUSE,  white);
89   glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
90   glLightfv(GL_LIGHT0, GL_SPECULAR, white);
91
92   glDisable(GL_CULL_FACE);
93   glEnable(GL_LIGHTING);
94   glEnable(GL_LIGHT0);
95
96   /* setup camera */
97   glMatrixMode(GL_PROJECTION);
98   gluPerspective(30.0, 1.0, 1.0, 10.0);
99   glMatrixMode(GL_MODELVIEW);
100   gluLookAt(0.0, 0.0, 5.0,
101             0.0, 0.0, 0.0,
102             0.0, 1.0, 0.0);
103
104   /* setup misc */
105   glEnable(GL_DEPTH_TEST);
106   glClearColor(0, 0, 1, 1);
107
108   /* run */
109   glutMainLoop();
110
111   return 0;
112}
113