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