xref: /haiku/src/tests/kits/opengl/glsl/brick.c (revision 6eba5912150d8bedb7d4e5f4bc883d499c2a0ce3)
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