multinoise.c revision 32001f49
1/** 2 * Another test for noise() functions (noise1 to noise4 tested independently). 3 * 13 Dec 2008 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 14static const char *VertShaderText = 15 "void main() {\n" 16 " gl_TexCoord[0].xyz = gl_Vertex.xyz;\n" 17 " gl_TexCoord[0].w = gl_MultiTexCoord1.x;\n" 18 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" 19 "}\n"; 20 21static const char *FragShaderText[ 4 ] = { 22 "void main()\n" 23 "{\n" 24 " gl_FragColor.rgb = noise3( gl_TexCoord[ 0 ].w ) * 0.5 + 0.5;\n" 25 " gl_FragColor.a = 1.0;\n" 26 "}\n", 27 "void main()\n" 28 "{\n" 29 " gl_FragColor.rgb = noise3( gl_TexCoord[ 0 ].xw ) * 0.5 + 0.5;\n" 30 " gl_FragColor.a = 1.0;\n" 31 "}\n", 32 "void main()\n" 33 "{\n" 34 " gl_FragColor.rgb = noise3( gl_TexCoord[ 0 ].xyw ) * 0.5 + 0.5;\n" 35 " gl_FragColor.a = 1.0;\n" 36 "}\n", 37 "void main()\n" 38 "{\n" 39 " gl_FragColor.rgb = noise3( gl_TexCoord[ 0 ].xyzw ) * 0.5 + 0.5;\n" 40 " gl_FragColor.a = 1.0;\n" 41 "}\n" 42}; 43 44struct uniform_info { 45 const char *name; 46 GLuint size; 47 GLint location; 48 GLfloat value[4]; 49}; 50 51/* program/shader objects */ 52static GLuint fragShader[ 4 ]; 53static GLuint vertShader; 54static GLuint program[ 4 ]; 55 56static GLint win = 0; 57static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f; 58static GLfloat Slice = 0.0; 59static GLboolean Anim = GL_FALSE; 60 61 62static void 63Idle(void) 64{ 65 Slice += 0.01; 66 glutPostRedisplay(); 67} 68 69 70static void 71Redisplay(void) 72{ 73 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 74 75 glMultiTexCoord1f( GL_TEXTURE1, Slice ); 76 77 glPushMatrix(); 78 glRotatef(xRot, 1.0f, 0.0f, 0.0f); 79 glRotatef(yRot, 0.0f, 1.0f, 0.0f); 80 glRotatef(zRot, 0.0f, 0.0f, 1.0f); 81 82 glutSolidTeapot( 1.0 ); 83 84 glPopMatrix(); 85 86 glutSwapBuffers(); 87} 88 89 90static void 91Reshape(int width, int height) 92{ 93 glViewport(0, 0, width, height); 94 glMatrixMode(GL_PROJECTION); 95 glLoadIdentity(); 96 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); 97 glMatrixMode(GL_MODELVIEW); 98 glLoadIdentity(); 99 glTranslatef(0.0f, 0.0f, -15.0f); 100} 101 102 103static void 104CleanUp(void) 105{ 106 GLint i; 107 108 glDeleteShader(vertShader); 109 for( i = 0; i < 4; i++ ) { 110 glDeleteShader(fragShader[ i ]); 111 glDeleteProgram(program[ i ]); 112 } 113 glutDestroyWindow(win); 114} 115 116 117static void 118Key(unsigned char key, int x, int y) 119{ 120 const GLfloat step = 0.01; 121 (void) x; 122 (void) y; 123 124 switch(key) { 125 case 'a': 126 Anim = !Anim; 127 glutIdleFunc(Anim ? Idle : NULL); 128 break; 129 case 's': 130 Slice -= step; 131 break; 132 case 'S': 133 Slice += step; 134 break; 135 case 'z': 136 zRot -= 1.0; 137 break; 138 case 'Z': 139 zRot += 1.0; 140 break; 141 case '1': 142 case '2': 143 case '3': 144 case '4': 145 glUseProgram(program[ key - '1' ]); 146 break; 147 case 27: 148 CleanUp(); 149 exit(0); 150 break; 151 } 152 glutPostRedisplay(); 153} 154 155 156static void 157SpecialKey(int key, int x, int y) 158{ 159 const GLfloat step = 3.0f; 160 161 (void) x; 162 (void) y; 163 164 switch(key) { 165 case GLUT_KEY_UP: 166 xRot -= step; 167 break; 168 case GLUT_KEY_DOWN: 169 xRot += step; 170 break; 171 case GLUT_KEY_LEFT: 172 yRot -= step; 173 break; 174 case GLUT_KEY_RIGHT: 175 yRot += step; 176 break; 177 } 178 glutPostRedisplay(); 179} 180 181 182 183static void 184LoadAndCompileShader(GLuint shader, const char *text) 185{ 186 GLint stat; 187 188 glShaderSource(shader, 1, (const GLchar **) &text, NULL); 189 190 glCompileShader(shader); 191 192 glGetShaderiv(shader, GL_COMPILE_STATUS, &stat); 193 if (!stat) { 194 GLchar log[1000]; 195 GLsizei len; 196 glGetShaderInfoLog(shader, 1000, &len, log); 197 fprintf(stderr, "multinoise: problem compiling shader: %s\n", log); 198 exit(1); 199 } 200 else { 201 printf("Shader compiled OK\n"); 202 } 203} 204 205 206static void 207CheckLink(GLuint prog) 208{ 209 GLint stat; 210 glGetProgramiv(prog, GL_LINK_STATUS, &stat); 211 if (!stat) { 212 GLchar log[1000]; 213 GLsizei len; 214 glGetProgramInfoLog(prog, 1000, &len, log); 215 fprintf(stderr, "Linker error:\n%s\n", log); 216 } 217 else { 218 fprintf(stderr, "Link success!\n"); 219 } 220} 221 222 223static void 224Init(void) 225{ 226 GLint i; 227 228 if (!GLEW_VERSION_2_0) { 229 printf("Warning: this program expects OpenGL 2.0\n"); 230 /*exit(1);*/ 231 } 232 233 vertShader = glCreateShader(GL_VERTEX_SHADER); 234 LoadAndCompileShader(vertShader, VertShaderText); 235 236 for( i = 0; i < 4; i++ ) { 237 fragShader[ i ] = glCreateShader(GL_FRAGMENT_SHADER); 238 LoadAndCompileShader(fragShader[ i ], FragShaderText[ i ]); 239 program[ i ] = glCreateProgram(); 240 glAttachShader(program[ i ], fragShader[ i ]); 241 glAttachShader(program[ i ], vertShader); 242 glLinkProgram(program[ i ]); 243 CheckLink(program[ i ]); 244 } 245 246 glUseProgram(program[ 0 ]); 247 248 assert(glGetError() == 0); 249 250 glClearColor(0.4f, 0.4f, 0.8f, 0.0f); 251 252 glColor3f(1, 0, 0); 253 254 glFrontFace( GL_CW ); 255 glEnable( GL_CULL_FACE ); 256 glEnable( GL_DEPTH_TEST ); 257} 258 259 260int 261main(int argc, char *argv[]) 262{ 263 glutInit(&argc, argv); 264 glutInitWindowSize(400, 400); 265 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 266 win = glutCreateWindow(argv[0]); 267 glewInit(); 268 glutReshapeFunc(Reshape); 269 glutKeyboardFunc(Key); 270 glutSpecialFunc(SpecialKey); 271 glutDisplayFunc(Redisplay); 272 Init(); 273 glutMainLoop(); 274 return 0; 275} 276 277