1/**
2 * "Brick" shader demo.  Uses the example shaders from chapter 6 of
3 * the OpenGL Shading Language "orange" book.
4 * 10 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 <GL/glext.h>
15#include "shaderutil.h"
16
17
18static char *FragProgFile = "CH06-brick.frag";
19static char *VertProgFile = "CH06-brick.vert";
20
21/* program/shader objects */
22static GLuint fragShader;
23static GLuint vertShader;
24static GLuint program;
25
26static struct uniform_info Uniforms[] = {
27   /* vert */
28   { "LightPosition",     1, GL_FLOAT_VEC3, { 0.1, 0.1, 9.0, 0}, -1 },
29   /* frag */
30   { "BrickColor",        1, GL_FLOAT_VEC3, { 0.8, 0.2, 0.2, 0 }, -1 },
31   { "MortarColor",       1, GL_FLOAT_VEC3, { 0.6, 0.6, 0.6, 0 }, -1 },
32   { "BrickSize",         1, GL_FLOAT_VEC2, { 1.0, 0.3, 0, 0 }, -1 },
33   { "BrickPct",          1, GL_FLOAT_VEC2, { 0.9, 0.8, 0, 0 }, -1 },
34   END_OF_UNIFORMS
35};
36
37static GLint win = 0;
38
39
40static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f;
41
42
43
44
45static void
46Redisplay(void)
47{
48   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
49
50   glPushMatrix();
51   glRotatef(xRot, 1.0f, 0.0f, 0.0f);
52   glRotatef(yRot, 0.0f, 1.0f, 0.0f);
53   glRotatef(zRot, 0.0f, 0.0f, 1.0f);
54
55   glBegin(GL_POLYGON);
56   glTexCoord2f(0, 0);   glVertex2f(-2, -2);
57   glTexCoord2f(1, 0);   glVertex2f( 2, -2);
58   glTexCoord2f(1, 1);   glVertex2f( 2,  2);
59   glTexCoord2f(0, 1);   glVertex2f(-2,  2);
60   glEnd();
61
62   glPopMatrix();
63
64   glutSwapBuffers();
65}
66
67
68static void
69Reshape(int width, int height)
70{
71   glViewport(0, 0, width, height);
72   glMatrixMode(GL_PROJECTION);
73   glLoadIdentity();
74   glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
75   glMatrixMode(GL_MODELVIEW);
76   glLoadIdentity();
77   glTranslatef(0.0f, 0.0f, -15.0f);
78}
79
80
81static void
82CleanUp(void)
83{
84   glDeleteShader(fragShader);
85   glDeleteShader(vertShader);
86   glDeleteProgram(program);
87   glutDestroyWindow(win);
88}
89
90
91static void
92Key(unsigned char key, int x, int y)
93{
94  (void) x;
95  (void) y;
96
97   switch(key) {
98   case 'z':
99      zRot -= 1.0;
100      break;
101   case 'Z':
102      zRot += 1.0;
103      break;
104   case 27:
105      CleanUp();
106      exit(0);
107      break;
108   }
109   glutPostRedisplay();
110}
111
112
113static void
114SpecialKey(int key, int x, int y)
115{
116   const GLfloat step = 3.0f;
117
118  (void) x;
119  (void) y;
120
121   switch(key) {
122   case GLUT_KEY_UP:
123      xRot -= step;
124      break;
125   case GLUT_KEY_DOWN:
126      xRot += step;
127      break;
128   case GLUT_KEY_LEFT:
129      yRot -= step;
130      break;
131   case GLUT_KEY_RIGHT:
132      yRot += step;
133      break;
134   }
135   glutPostRedisplay();
136}
137
138
139
140static void
141Init(void)
142{
143   if (!ShadersSupported())
144      exit(1);
145
146   vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile);
147   fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile);
148   program = LinkShaders(vertShader, fragShader);
149
150   glUseProgram(program);
151
152   SetUniformValues(program, Uniforms);
153   PrintUniforms(Uniforms);
154
155   assert(glGetError() == 0);
156
157   glClearColor(0.4f, 0.4f, 0.8f, 0.0f);
158
159   printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER));
160
161   assert(glIsProgram(program));
162   assert(glIsShader(fragShader));
163   assert(glIsShader(vertShader));
164
165   glColor3f(1, 0, 0);
166}
167
168
169static void
170ParseOptions(int argc, char *argv[])
171{
172   int i;
173   for (i = 1; i < argc; i++) {
174      if (strcmp(argv[i], "-fs") == 0) {
175         FragProgFile = argv[i+1];
176      }
177      else if (strcmp(argv[i], "-vs") == 0) {
178         VertProgFile = argv[i+1];
179      }
180   }
181}
182
183
184int
185main(int argc, char *argv[])
186{
187   glutInit(&argc, argv);
188   glutInitWindowSize(400, 400);
189   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
190   win = glutCreateWindow(argv[0]);
191   // glewInit();
192   glutReshapeFunc(Reshape);
193   glutKeyboardFunc(Key);
194   glutSpecialFunc(SpecialKey);
195   glutDisplayFunc(Redisplay);
196   ParseOptions(argc, argv);
197   Init();
198   glutMainLoop();
199   return 0;
200}
201
202