1/**
2 * Test noise() functions.
3 * 28 Jan 2007
4 */
5
6#include <assert.h>
7#include <string.h>
8#include <stdio.h>
9#include <stdlib.h>
10#include <math.h>
11#include <GL/glew.h>
12#include "glut_wrap.h"
13#include "shaderutil.h"
14
15
16static const char *VertShaderText =
17   "void main() {\n"
18   "   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
19   "   gl_TexCoord[0] = gl_MultiTexCoord0;\n"
20   "}\n";
21
22static const char *FragShaderText =
23   "uniform vec4 Scale, Bias;\n"
24   "uniform float Slice;\n"
25   "void main()\n"
26   "{\n"
27   "   vec4 scale = vec4(5.0);\n"
28   "   vec4 p;\n"
29   "   p.xy = gl_TexCoord[0].xy;\n"
30   "   p.z = Slice;\n"
31   "   p.w = 0.0;\n"
32   "   vec4 n = noise4(p * scale);\n"
33   "   gl_FragColor = n * Scale + Bias;\n"
34   "}\n";
35
36
37static struct uniform_info Uniforms[] = {
38   { "Scale",    1, GL_FLOAT_VEC4, { 0.5, 0.4, 0.0, 0}, -1 },
39   { "Bias",     1, GL_FLOAT_VEC4, { 0.5, 0.3, 0.0, 0}, -1 },
40   { "Slice",    1, GL_FLOAT, { 0.5, 0, 0, 0}, -1 },
41   END_OF_UNIFORMS
42};
43
44/* program/shader objects */
45static GLuint fragShader;
46static GLuint vertShader;
47static GLuint program;
48
49static GLint win = 0;
50static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f;
51static GLfloat Slice = 0.0;
52static GLboolean Anim = GL_FALSE;
53
54
55static void
56Idle(void)
57{
58   Slice += 0.01;
59   glutPostRedisplay();
60}
61
62
63static void
64Redisplay(void)
65{
66   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
67
68   glUniform1fv(Uniforms[2].location, 1, &Slice);
69
70   glPushMatrix();
71   glRotatef(xRot, 1.0f, 0.0f, 0.0f);
72   glRotatef(yRot, 0.0f, 1.0f, 0.0f);
73   glRotatef(zRot, 0.0f, 0.0f, 1.0f);
74
75   glBegin(GL_POLYGON);
76   glTexCoord2f(0, 0);   glVertex2f(-2, -2);
77   glTexCoord2f(1, 0);   glVertex2f( 2, -2);
78   glTexCoord2f(1, 1);   glVertex2f( 2,  2);
79   glTexCoord2f(0, 1);   glVertex2f(-2,  2);
80   glEnd();
81
82   glPopMatrix();
83
84   glutSwapBuffers();
85}
86
87
88static void
89Reshape(int width, int height)
90{
91   glViewport(0, 0, width, height);
92   glMatrixMode(GL_PROJECTION);
93   glLoadIdentity();
94   glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
95   glMatrixMode(GL_MODELVIEW);
96   glLoadIdentity();
97   glTranslatef(0.0f, 0.0f, -15.0f);
98}
99
100
101static void
102CleanUp(void)
103{
104   glDeleteShader(fragShader);
105   glDeleteShader(vertShader);
106   glDeleteProgram(program);
107   glutDestroyWindow(win);
108}
109
110
111static void
112Key(unsigned char key, int x, int y)
113{
114   const GLfloat step = 0.01;
115  (void) x;
116  (void) y;
117
118   switch(key) {
119   case 'a':
120      Anim = !Anim;
121      glutIdleFunc(Anim ? Idle : NULL);
122      break;
123   case 's':
124      Slice -= step;
125      break;
126   case 'S':
127      Slice += step;
128      break;
129   case 'z':
130      zRot -= 1.0;
131      break;
132   case 'Z':
133      zRot += 1.0;
134      break;
135   case 27:
136      CleanUp();
137      exit(0);
138      break;
139   }
140   glutPostRedisplay();
141}
142
143
144static void
145SpecialKey(int key, int x, int y)
146{
147   const GLfloat step = 3.0f;
148
149  (void) x;
150  (void) y;
151
152   switch(key) {
153   case GLUT_KEY_UP:
154      xRot -= step;
155      break;
156   case GLUT_KEY_DOWN:
157      xRot += step;
158      break;
159   case GLUT_KEY_LEFT:
160      yRot -= step;
161      break;
162   case GLUT_KEY_RIGHT:
163      yRot += step;
164      break;
165   }
166   glutPostRedisplay();
167}
168
169
170
171static void
172Init(void)
173{
174   if (!ShadersSupported())
175      exit(1);
176
177   vertShader = CompileShaderText(GL_VERTEX_SHADER, VertShaderText);
178   fragShader = CompileShaderText(GL_FRAGMENT_SHADER, FragShaderText);
179   program = LinkShaders(vertShader, fragShader);
180
181   glUseProgram(program);
182
183   SetUniformValues(program, Uniforms);
184   PrintUniforms(Uniforms);
185
186   assert(glGetError() == 0);
187
188   glClearColor(0.4f, 0.4f, 0.8f, 0.0f);
189
190   printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER));
191
192   assert(glIsProgram(program));
193   assert(glIsShader(fragShader));
194   assert(glIsShader(vertShader));
195
196   glColor3f(1, 0, 0);
197}
198
199
200int
201main(int argc, char *argv[])
202{
203   glutInit(&argc, argv);
204   glutInitWindowSize(400, 400);
205   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
206   win = glutCreateWindow(argv[0]);
207   glewInit();
208   glutReshapeFunc(Reshape);
209   glutKeyboardFunc(Key);
210   glutSpecialFunc(SpecialKey);
211   glutDisplayFunc(Redisplay);
212   Init();
213   glutMainLoop();
214   return 0;
215}
216
217