4ee129281645101cbd9d0c687229d3c8da975fc0
[mesa.git] / progs / demos / glslnoise.c
1 /*
2 * GLSL noise demo.
3 *
4 * Michal Krol
5 * 20 February 2006
6 *
7 * Based on the original demo by:
8 * Stefan Gustavson (stegu@itn.liu.se) 2004, 2005
9 */
10
11 #ifdef WIN32
12 #include <windows.h>
13 #endif
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <GL/gl.h>
18 #include <GL/glut.h>
19 #include <GL/glext.h>
20
21 #ifdef WIN32
22 #define GETPROCADDRESS(F) wglGetProcAddress(F)
23 #else
24 #define GETPROCADDRESS(F) glutGetProcAddress(F)
25 #endif
26
27 static GLhandleARB fragShader;
28 static GLhandleARB vertShader;
29 static GLhandleARB program;
30
31 static GLint uTime;
32
33 static GLint t0 = 0;
34 static GLint frames = 0;
35
36 static GLfloat u_time = 0.0f;
37
38 static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
39 static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
40 static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
41 static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
42 static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
43 static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
44 static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
45 static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
46 static PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL;
47
48 static void Redisplay (void)
49 {
50 GLint t;
51
52 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
53
54 glUniform1fARB (uTime, 0.5f * u_time);
55
56 glPushMatrix ();
57 glutSolidSphere (2.0, 20, 10);
58 glPopMatrix ();
59
60 glutSwapBuffers();
61 frames++;
62
63 t = glutGet (GLUT_ELAPSED_TIME);
64 if (t - t0 >= 5000) {
65 GLfloat seconds = (GLfloat) (t - t0) / 1000.0f;
66 GLfloat fps = frames / seconds;
67 printf ("%d frames in %6.3f seconds = %6.3f FPS\n", frames, seconds, fps);
68 t0 = t;
69 frames = 0;
70 }
71 }
72
73 static void Idle (void)
74 {
75 u_time += 0.1f;
76 glutPostRedisplay ();
77 }
78
79 static void Reshape (int width, int height)
80 {
81 glViewport (0, 0, width, height);
82 glMatrixMode (GL_PROJECTION);
83 glLoadIdentity ();
84 glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
85 glMatrixMode (GL_MODELVIEW);
86 glLoadIdentity ();
87 glTranslatef (0.0f, 0.0f, -15.0f);
88 }
89
90 static void Key (unsigned char key, int x, int y)
91 {
92 (void) x;
93 (void) y;
94
95 switch (key)
96 {
97 case 27:
98 exit(0);
99 break;
100 }
101 glutPostRedisplay ();
102 }
103
104 static void Init (void)
105 {
106 static const char *fragShaderText =
107 "uniform float time;\n"
108 "varying vec3 position;\n"
109 "void main () {\n"
110 " gl_FragColor = vec4 (vec3 (0.5 + 0.5 * noise1 (vec4 (position, time))), 1.0);\n"
111 "}\n"
112 ;
113 static const char *vertShaderText =
114 "varying vec3 position;\n"
115 "void main () {\n"
116 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
117 " position = 4.0 * gl_Vertex.xyz;\n"
118 "}\n"
119 ;
120
121 if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
122 {
123 printf ("Sorry, this demo requires GL_ARB_fragment_shader\n");
124 exit(1);
125 }
126 if (!glutExtensionSupported ("GL_ARB_shader_objects"))
127 {
128 printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
129 exit(1);
130 }
131 if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
132 {
133 printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
134 exit(1);
135 }
136 if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
137 {
138 printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
139 exit(1);
140 }
141
142 glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)
143 GETPROCADDRESS("glCreateShaderObjectARB");
144 glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)
145 GETPROCADDRESS("glShaderSourceARB");
146 glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)
147 GETPROCADDRESS("glCompileShaderARB");
148 glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)
149 GETPROCADDRESS("glCreateProgramObjectARB");
150 glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)
151 GETPROCADDRESS("glAttachObjectARB");
152 glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)
153 GETPROCADDRESS ("glLinkProgramARB");
154 glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)
155 GETPROCADDRESS("glUseProgramObjectARB");
156
157 glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
158 GETPROCADDRESS("glGetUniformLocationARB");
159 glUniform1fARB = (PFNGLUNIFORM1FARBPROC)
160 GETPROCADDRESS("glUniform1fARB");
161
162 fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
163 glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
164 glCompileShaderARB (fragShader);
165
166 vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
167 glShaderSourceARB (vertShader, 1, &vertShaderText, NULL);
168 glCompileShaderARB (vertShader);
169
170 program = glCreateProgramObjectARB ();
171 glAttachObjectARB (program, fragShader);
172 glAttachObjectARB (program, vertShader);
173 glLinkProgramARB (program);
174 glUseProgramObjectARB (program);
175
176 uTime = glGetUniformLocationARB (program, "time");
177
178 glClearColor (0.0f, 0.1f, 0.3f, 1.0f);
179 glEnable (GL_CULL_FACE);
180 glEnable (GL_DEPTH_TEST);
181
182 printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER));
183 }
184
185 int main (int argc, char *argv[])
186 {
187 glutInit (&argc, argv);
188 glutInitWindowPosition ( 0, 0);
189 glutInitWindowSize (200, 200);
190 glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
191 glutCreateWindow (argv[0]);
192 glutReshapeFunc (Reshape);
193 glutKeyboardFunc (Key);
194 glutDisplayFunc (Redisplay);
195 glutIdleFunc (Idle);
196 Init ();
197 glutMainLoop ();
198 return 0;
199 }
200