blob: 1d08b231e7e45e32570d6752159ccb62322a09ab [file] [log] [blame]
Brian2ccd2642007-01-15 17:27:24 -07001/**
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>
Keith Whitwellb799af92009-06-29 14:13:58 +010012#include <GL/glew.h>
Brian2ccd2642007-01-15 17:27:24 -070013#include <GL/glut.h>
Brian2dca3372008-04-09 22:28:23 -060014#include "shaderutil.h"
Brian2ccd2642007-01-15 17:27:24 -070015
16
Brian Paulc0dd9122008-08-16 09:36:46 -060017static char *FragProgFile = "CH06-brick.frag";
18static char *VertProgFile = "CH06-brick.vert";
Brian2ccd2642007-01-15 17:27:24 -070019
20/* program/shader objects */
21static GLuint fragShader;
22static GLuint vertShader;
23static GLuint program;
24
Brian2ccd2642007-01-15 17:27:24 -070025static struct uniform_info Uniforms[] = {
26 /* vert */
Brian2dca3372008-04-09 22:28:23 -060027 { "LightPosition", 3, GL_FLOAT, { 0.1, 0.1, 9.0, 0}, -1 },
Brian2ccd2642007-01-15 17:27:24 -070028 /* frag */
Brian2dca3372008-04-09 22:28:23 -060029 { "BrickColor", 3, GL_FLOAT, { 0.8, 0.2, 0.2, 0 }, -1 },
30 { "MortarColor", 3, GL_FLOAT, { 0.6, 0.6, 0.6, 0 }, -1 },
31 { "BrickSize", 2, GL_FLOAT, { 1.0, 0.3, 0, 0 }, -1 },
32 { "BrickPct", 2, GL_FLOAT, { 0.9, 0.8, 0, 0 }, -1 },
33 END_OF_UNIFORMS
Brian2ccd2642007-01-15 17:27:24 -070034};
35
36static GLint win = 0;
37
38
39static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f;
40
41
42
43
44static void
45Redisplay(void)
46{
47 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
48
49 glPushMatrix();
50 glRotatef(xRot, 1.0f, 0.0f, 0.0f);
51 glRotatef(yRot, 0.0f, 1.0f, 0.0f);
52 glRotatef(zRot, 0.0f, 0.0f, 1.0f);
53
54 glBegin(GL_POLYGON);
55 glTexCoord2f(0, 0); glVertex2f(-2, -2);
56 glTexCoord2f(1, 0); glVertex2f( 2, -2);
57 glTexCoord2f(1, 1); glVertex2f( 2, 2);
58 glTexCoord2f(0, 1); glVertex2f(-2, 2);
59 glEnd();
60
61 glPopMatrix();
62
63 glutSwapBuffers();
64}
65
66
67static void
68Reshape(int width, int height)
69{
70 glViewport(0, 0, width, height);
71 glMatrixMode(GL_PROJECTION);
72 glLoadIdentity();
73 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
74 glMatrixMode(GL_MODELVIEW);
75 glLoadIdentity();
76 glTranslatef(0.0f, 0.0f, -15.0f);
77}
78
79
80static void
81CleanUp(void)
82{
Brian Paulee0b1bc2009-07-17 13:23:11 -060083 glDeleteShader(fragShader);
84 glDeleteShader(vertShader);
85 glDeleteProgram(program);
Brian2ccd2642007-01-15 17:27:24 -070086 glutDestroyWindow(win);
87}
88
89
90static void
91Key(unsigned char key, int x, int y)
92{
93 (void) x;
94 (void) y;
95
96 switch(key) {
97 case 'z':
98 zRot -= 1.0;
99 break;
100 case 'Z':
101 zRot += 1.0;
102 break;
103 case 27:
104 CleanUp();
105 exit(0);
106 break;
107 }
108 glutPostRedisplay();
109}
110
111
112static void
113SpecialKey(int key, int x, int y)
114{
115 const GLfloat step = 3.0f;
116
117 (void) x;
118 (void) y;
119
120 switch(key) {
121 case GLUT_KEY_UP:
122 xRot -= step;
123 break;
124 case GLUT_KEY_DOWN:
125 xRot += step;
126 break;
127 case GLUT_KEY_LEFT:
128 yRot -= step;
129 break;
130 case GLUT_KEY_RIGHT:
131 yRot += step;
132 break;
133 }
134 glutPostRedisplay();
135}
136
137
138
139static void
Brian2ccd2642007-01-15 17:27:24 -0700140Init(void)
141{
Brian2dca3372008-04-09 22:28:23 -0600142 if (!ShadersSupported())
143 exit(1);
Brian2ccd2642007-01-15 17:27:24 -0700144
Brian2dca3372008-04-09 22:28:23 -0600145 vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile);
146 fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile);
147 program = LinkShaders(vertShader, fragShader);
Brian2ccd2642007-01-15 17:27:24 -0700148
Brian Paulee0b1bc2009-07-17 13:23:11 -0600149 glUseProgram(program);
Brian2ccd2642007-01-15 17:27:24 -0700150
Brian2dca3372008-04-09 22:28:23 -0600151 InitUniforms(program, Uniforms);
Brian2ccd2642007-01-15 17:27:24 -0700152
153 assert(glGetError() == 0);
154
155 glClearColor(0.4f, 0.4f, 0.8f, 0.0f);
156
157 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER));
158
Brian Paulee0b1bc2009-07-17 13:23:11 -0600159 assert(glIsProgram(program));
160 assert(glIsShader(fragShader));
161 assert(glIsShader(vertShader));
Brian2ccd2642007-01-15 17:27:24 -0700162
163 glColor3f(1, 0, 0);
164}
165
166
167static void
168ParseOptions(int argc, char *argv[])
169{
170 int i;
171 for (i = 1; i < argc; i++) {
172 if (strcmp(argv[i], "-fs") == 0) {
173 FragProgFile = argv[i+1];
174 }
175 else if (strcmp(argv[i], "-vs") == 0) {
176 VertProgFile = argv[i+1];
177 }
178 }
179}
180
181
182int
183main(int argc, char *argv[])
184{
185 glutInit(&argc, argv);
186 glutInitWindowPosition( 0, 0);
187 glutInitWindowSize(400, 400);
188 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
189 win = glutCreateWindow(argv[0]);
Keith Whitwellb799af92009-06-29 14:13:58 +0100190 glewInit();
Brian2ccd2642007-01-15 17:27:24 -0700191 glutReshapeFunc(Reshape);
192 glutKeyboardFunc(Key);
193 glutSpecialFunc(SpecialKey);
194 glutDisplayFunc(Redisplay);
195 ParseOptions(argc, argv);
196 Init();
197 glutMainLoop();
198 return 0;
199}
200