Merge branch '7.8'
[mesa.git] / progs / glsl / toyball.c
1 /**
2 * "Toy Ball" shader demo. Uses the example shaders from
3 * chapter 11 of the OpenGL Shading Language "orange" book.
4 * 16 Jan 2007
5 */
6
7 #include <assert.h>
8 #include <string.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <math.h>
12 #include <GL/glew.h>
13 #include <GL/glut.h>
14 #include "shaderutil.h"
15
16
17 static char *FragProgFile = "CH11-toyball.frag";
18 static char *VertProgFile = "CH11-toyball.vert";
19
20 /* program/shader objects */
21 static GLuint fragShader;
22 static GLuint vertShader;
23 static GLuint program;
24
25
26 static struct uniform_info Uniforms[] = {
27 { "LightDir", 1, GL_FLOAT_VEC4, { 0.57737, 0.57735, 0.57735, 0.0 }, -1 },
28 { "HVector", 1, GL_FLOAT_VEC4, { 0.32506, 0.32506, 0.88808, 0.0 }, -1 },
29 { "BallCenter", 1, GL_FLOAT_VEC4, { 0.0, 0.0, 0.0, 1.0 }, -1 },
30 { "SpecularColor", 1, GL_FLOAT_VEC4, { 0.4, 0.4, 0.4, 60.0 }, -1 },
31 { "Red", 1, GL_FLOAT_VEC4, { 0.6, 0.0, 0.0, 1.0 }, -1 },
32 { "Blue", 1, GL_FLOAT_VEC4, { 0.0, 0.3, 0.6, 1.0 }, -1 },
33 { "Yellow", 1, GL_FLOAT_VEC4, { 0.6, 0.5, 0.0, 1.0 }, -1 },
34 { "HalfSpace0", 1, GL_FLOAT_VEC4, { 1.0, 0.0, 0.0, 0.2 }, -1 },
35 { "HalfSpace1", 1, GL_FLOAT_VEC4, { 0.309016994, 0.951056516, 0.0, 0.2 }, -1 },
36 { "HalfSpace2", 1, GL_FLOAT_VEC4, { -0.809016994, 0.587785252, 0.0, 0.2 }, -1 },
37 { "HalfSpace3", 1, GL_FLOAT_VEC4, { -0.809016994, -0.587785252, 0.0, 0.2 }, -1 },
38 { "HalfSpace4", 1, GL_FLOAT_VEC4, { 0.309116994, -0.951056516, 0.0, 0.2 }, -1 },
39 { "InOrOutInit", 1, GL_FLOAT, { -3.0, 0, 0, 0 }, -1 },
40 { "StripeWidth", 1, GL_FLOAT, { 0.3, 0, 0, 0 }, -1 },
41 { "FWidth", 1, GL_FLOAT, { 0.005, 0, 0, 0 }, -1 },
42 END_OF_UNIFORMS
43 };
44
45 static GLint win = 0;
46 static GLboolean Anim = GL_FALSE;
47 static GLfloat TexRot = 0.0;
48 static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f;
49
50
51 static void
52 Idle(void)
53 {
54 TexRot += 2.0;
55 if (TexRot > 360.0)
56 TexRot -= 360.0;
57 glutPostRedisplay();
58 }
59
60
61 static void
62 Redisplay(void)
63 {
64 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
65
66 glPushMatrix();
67 glRotatef(xRot, 1.0f, 0.0f, 0.0f);
68 glRotatef(yRot, 0.0f, 1.0f, 0.0f);
69 glRotatef(zRot, 0.0f, 0.0f, 1.0f);
70
71 glMatrixMode(GL_TEXTURE);
72 glLoadIdentity();
73 glRotatef(TexRot, 0.0f, 1.0f, 0.0f);
74 glMatrixMode(GL_MODELVIEW);
75
76 glutSolidSphere(2.0, 20, 10);
77
78 glPopMatrix();
79
80 glutSwapBuffers();
81 }
82
83
84 static void
85 Reshape(int width, int height)
86 {
87 glViewport(0, 0, width, height);
88 glMatrixMode(GL_PROJECTION);
89 glLoadIdentity();
90 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
91 glMatrixMode(GL_MODELVIEW);
92 glLoadIdentity();
93 glTranslatef(0.0f, 0.0f, -15.0f);
94 }
95
96
97 static void
98 CleanUp(void)
99 {
100 glDeleteShader(fragShader);
101 glDeleteShader(vertShader);
102 glDeleteProgram(program);
103 glutDestroyWindow(win);
104 }
105
106
107 static void
108 Key(unsigned char key, int x, int y)
109 {
110 const GLfloat step = 2.0;
111 (void) x;
112 (void) y;
113
114 switch(key) {
115 case 'a':
116 Anim = !Anim;
117 if (Anim)
118 glutIdleFunc(Idle);
119 else
120 glutIdleFunc(NULL);
121 break;
122 case 'z':
123 zRot += step;
124 break;
125 case 'Z':
126 zRot -= step;
127 break;
128 case 27:
129 CleanUp();
130 exit(0);
131 break;
132 }
133 glutPostRedisplay();
134 }
135
136
137 static void
138 SpecialKey(int key, int x, int y)
139 {
140 const GLfloat step = 2.0;
141
142 (void) x;
143 (void) y;
144
145 switch(key) {
146 case GLUT_KEY_UP:
147 xRot += step;
148 break;
149 case GLUT_KEY_DOWN:
150 xRot -= step;
151 break;
152 case GLUT_KEY_LEFT:
153 yRot -= step;
154 break;
155 case GLUT_KEY_RIGHT:
156 yRot += step;
157 break;
158 }
159 glutPostRedisplay();
160 }
161
162
163
164 static void
165 Init(void)
166 {
167 if (!ShadersSupported())
168 exit(1);
169
170 vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile);
171 fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile);
172 program = LinkShaders(vertShader, fragShader);
173
174 glUseProgram(program);
175
176 SetUniformValues(program, Uniforms);
177 PrintUniforms(Uniforms);
178
179 assert(glGetError() == 0);
180
181 glClearColor(0.4f, 0.4f, 0.8f, 0.0f);
182
183 glEnable(GL_DEPTH_TEST);
184
185 glColor3f(1, 0, 0);
186 }
187
188
189 static void
190 ParseOptions(int argc, char *argv[])
191 {
192 int i;
193 for (i = 1; i < argc; i++) {
194 if (strcmp(argv[i], "-fs") == 0) {
195 FragProgFile = argv[i+1];
196 }
197 else if (strcmp(argv[i], "-vs") == 0) {
198 VertProgFile = argv[i+1];
199 }
200 }
201 }
202
203
204 int
205 main(int argc, char *argv[])
206 {
207 glutInit(&argc, argv);
208 glutInitWindowSize(400, 400);
209 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
210 win = glutCreateWindow(argv[0]);
211 glewInit();
212 glutReshapeFunc(Reshape);
213 glutKeyboardFunc(Key);
214 glutSpecialFunc(SpecialKey);
215 glutDisplayFunc(Redisplay);
216 ParseOptions(argc, argv);
217 Init();
218 glutMainLoop();
219 return 0;
220 }
221