Merge branch 'master' into i915-unification
[mesa.git] / progs / demos / renormal.c
1
2 /*
3 * Test GL_EXT_rescale_normal extension
4 * Brian Paul January 1998 This program is in the public domain.
5 */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <math.h>
10 #include <GL/glut.h>
11
12
13 static GLfloat Phi = 0.0;
14
15
16 static void Idle( void )
17 {
18 static double t0 = -1.;
19 double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
20 if (t0 < 0.0)
21 t0 = t;
22 dt = t - t0;
23 t0 = t;
24 Phi += 3.0 * dt;
25 glutPostRedisplay();
26 }
27
28
29 static void Display( void )
30 {
31 GLfloat scale = 0.6 + 0.5 * sin(Phi);
32 glClear( GL_COLOR_BUFFER_BIT );
33 glPushMatrix();
34 glScalef(scale, scale, scale);
35 glutSolidSphere(2.0, 20, 20);
36 glPopMatrix();
37 glutSwapBuffers();
38 }
39
40
41 static void Reshape( int width, int height )
42 {
43 glViewport( 0, 0, width, height );
44 glMatrixMode( GL_PROJECTION );
45 glLoadIdentity();
46 glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
47 glMatrixMode( GL_MODELVIEW );
48 glLoadIdentity();
49 glTranslatef( 0.0, 0.0, -15.0 );
50 }
51
52
53
54 static void Init( void )
55 {
56 static GLfloat mat[4] = { 0.8, 0.8, 0.0, 1.0 };
57 static GLfloat pos[4] = { -1.0, 1.0, 1.0, 0.0 };
58
59 /* setup lighting, etc */
60 glEnable(GL_LIGHTING);
61 glEnable(GL_LIGHT0);
62 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat);
63 glLightfv(GL_LIGHT0, GL_POSITION, pos);
64
65 glEnable(GL_CULL_FACE);
66
67 glDisable(GL_RESCALE_NORMAL_EXT);
68 glDisable(GL_NORMALIZE);
69 }
70
71
72 #define UNSCALED 1
73 #define NORMALIZE 2
74 #define RESCALE 3
75 #define QUIT 4
76
77
78 static void ModeMenu(int entry)
79 {
80 if (entry==UNSCALED) {
81 glDisable(GL_RESCALE_NORMAL_EXT);
82 glDisable(GL_NORMALIZE);
83 }
84 else if (entry==NORMALIZE) {
85 glEnable(GL_NORMALIZE);
86 glDisable(GL_RESCALE_NORMAL_EXT);
87 }
88 else if (entry==RESCALE) {
89 glDisable(GL_NORMALIZE);
90 glEnable(GL_RESCALE_NORMAL_EXT);
91 }
92 else if (entry==QUIT) {
93 exit(0);
94 }
95 glutPostRedisplay();
96 }
97
98 static void
99 key(unsigned char k, int x, int y)
100 {
101 (void) x;
102 (void) y;
103 switch (k) {
104 case 27: /* Escape */
105 exit(0);
106 break;
107 default:
108 return;
109 }
110 glutPostRedisplay();
111 }
112
113 int main( int argc, char *argv[] )
114 {
115 glutInit( &argc, argv );
116 glutInitWindowPosition(0, 0);
117 glutInitWindowSize( 400, 400 );
118
119 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
120
121 glutCreateWindow(argv[0]);
122
123 Init();
124
125 glutIdleFunc( Idle );
126 glutReshapeFunc( Reshape );
127 glutDisplayFunc( Display );
128 glutKeyboardFunc(key);
129
130 glutCreateMenu(ModeMenu);
131 glutAddMenuEntry("Unscaled", UNSCALED);
132 glutAddMenuEntry("Normalize", NORMALIZE);
133 glutAddMenuEntry("Rescale EXT", RESCALE);
134 glutAddMenuEntry("Quit", QUIT);
135 glutAttachMenu(GLUT_RIGHT_BUTTON);
136
137 glutMainLoop();
138 return 0;
139 }