summaryrefslogtreecommitdiff
path: root/progs/glsl/multitex.c
diff options
context:
space:
mode:
Diffstat (limited to 'progs/glsl/multitex.c')
-rw-r--r--progs/glsl/multitex.c412
1 files changed, 0 insertions, 412 deletions
diff --git a/progs/glsl/multitex.c b/progs/glsl/multitex.c
deleted file mode 100644
index 49b32253ee..0000000000
--- a/progs/glsl/multitex.c
+++ /dev/null
@@ -1,412 +0,0 @@
-/**
- * Test multi-texturing with GL shading language.
- *
- * Copyright (C) 2008 Brian Paul All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-
-#include <assert.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <GL/glew.h>
-#include "GL/glut.h"
-#include "readtex.h"
-#include "shaderutil.h"
-
-static const char *Demo = "multitex";
-
-static const char *VertFile = "multitex.vert";
-static const char *FragFile = "multitex.frag";
-
-static const char *TexFiles[2] =
- {
- "../images/tile.rgb",
- "../images/tree2.rgba"
- };
-
-
-static GLuint Program;
-
-static GLfloat Xrot = 0.0, Yrot = .0, Zrot = 0.0;
-static GLfloat EyeDist = 10;
-static GLboolean Anim = GL_TRUE;
-static GLboolean UseArrays = GL_TRUE;
-static GLboolean UseVBO = GL_TRUE;
-static GLuint VBO = 0;
-
-static GLint VertCoord_attr = -1, TexCoord0_attr = -1, TexCoord1_attr = -1;
-
-
-/* value[0] = tex unit */
-static struct uniform_info Uniforms[] = {
- { "tex1", 1, GL_SAMPLER_2D, { 0, 0, 0, 0 }, -1 },
- { "tex2", 1, GL_SAMPLER_2D, { 1, 0, 0, 0 }, -1 },
- END_OF_UNIFORMS
-};
-
-
-static const GLfloat Tex0Coords[4][2] = {
- { 0.0, 0.0 }, { 2.0, 0.0 }, { 2.0, 2.0 }, { 0.0, 2.0 }
-};
-
-static const GLfloat Tex1Coords[4][2] = {
- { 0.0, 0.0 }, { 1.0, 0.0 }, { 1.0, 1.0 }, { 0.0, 1.0 }
-};
-
-static const GLfloat VertCoords[4][2] = {
- { -3.0, -3.0 }, { 3.0, -3.0 }, { 3.0, 3.0 }, { -3.0, 3.0 }
-};
-
-
-
-static void
-SetupVertexBuffer(void)
-{
- glGenBuffersARB(1, &VBO);
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBO);
-
- glBufferDataARB(GL_ARRAY_BUFFER_ARB,
- sizeof(VertCoords) +
- sizeof(Tex0Coords) +
- sizeof(Tex1Coords),
- NULL,
- GL_STATIC_DRAW_ARB);
-
- /* non-interleaved vertex arrays */
-
- glBufferSubDataARB(GL_ARRAY_BUFFER_ARB,
- 0, /* offset */
- sizeof(VertCoords), /* size */
- VertCoords); /* data */
-
- glBufferSubDataARB(GL_ARRAY_BUFFER_ARB,
- sizeof(VertCoords), /* offset */
- sizeof(Tex0Coords), /* size */
- Tex0Coords); /* data */
-
- glBufferSubDataARB(GL_ARRAY_BUFFER_ARB,
- sizeof(VertCoords) +
- sizeof(Tex0Coords), /* offset */
- sizeof(Tex1Coords), /* size */
- Tex1Coords); /* data */
-
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
-}
-
-
-static void
-DrawPolygonArray(void)
-{
- void *vertPtr, *tex0Ptr, *tex1Ptr;
-
- if (UseVBO) {
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBO);
- vertPtr = (void *) 0;
- tex0Ptr = (void *) sizeof(VertCoords);
- tex1Ptr = (void *) (sizeof(VertCoords) + sizeof(Tex0Coords));
- }
- else {
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
- vertPtr = VertCoords;
- tex0Ptr = Tex0Coords;
- tex1Ptr = Tex1Coords;
- }
-
- if (VertCoord_attr >= 0) {
- glVertexAttribPointer(VertCoord_attr, 2, GL_FLOAT, GL_FALSE,
- 0, vertPtr);
- glEnableVertexAttribArray(VertCoord_attr);
- }
- else {
- glVertexPointer(2, GL_FLOAT, 0, vertPtr);
- glEnableClientState(GL_VERTEX_ARRAY);
- }
-
- glVertexAttribPointer(TexCoord0_attr, 2, GL_FLOAT, GL_FALSE,
- 0, tex0Ptr);
- glEnableVertexAttribArray(TexCoord0_attr);
-
- glVertexAttribPointer(TexCoord1_attr, 2, GL_FLOAT, GL_FALSE,
- 0, tex1Ptr);
- glEnableVertexAttribArray(TexCoord1_attr);
-
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
-}
-
-
-static void
-DrawPolygonVert(void)
-{
- GLuint i;
-
- glBegin(GL_TRIANGLE_FAN);
-
- for (i = 0; i < 4; i++) {
- glVertexAttrib2fv(TexCoord0_attr, Tex0Coords[i]);
- glVertexAttrib2fv(TexCoord1_attr, Tex1Coords[i]);
-
- if (VertCoord_attr >= 0)
- glVertexAttrib2fv(VertCoord_attr, VertCoords[i]);
- else
- glVertex2fv(VertCoords[i]);
- }
-
- glEnd();
-}
-
-
-static void
-draw(void)
-{
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix(); /* modelview matrix */
- glTranslatef(0.0, 0.0, -EyeDist);
- glRotatef(Zrot, 0, 0, 1);
- glRotatef(Yrot, 0, 1, 0);
- glRotatef(Xrot, 1, 0, 0);
-
- if (UseArrays)
- DrawPolygonArray();
- else
- DrawPolygonVert();
-
- glPopMatrix();
-
- glutSwapBuffers();
-}
-
-
-static void
-idle(void)
-{
- GLfloat t = 0.05 * glutGet(GLUT_ELAPSED_TIME);
- Yrot = t;
- glutPostRedisplay();
-}
-
-
-static void
-key(unsigned char k, int x, int y)
-{
- (void) x;
- (void) y;
- switch (k) {
- case 'a':
- UseArrays = !UseArrays;
- printf("Arrays: %d\n", UseArrays);
- break;
- case 'v':
- UseVBO = !UseVBO;
- printf("Use VBO: %d\n", UseVBO);
- break;
- case ' ':
- Anim = !Anim;
- if (Anim)
- glutIdleFunc(idle);
- else
- glutIdleFunc(NULL);
- break;
- case 'z':
- EyeDist -= 0.5;
- if (EyeDist < 3.0)
- EyeDist = 3.0;
- break;
- case 'Z':
- EyeDist += 0.5;
- if (EyeDist > 90.0)
- EyeDist = 90;
- break;
- case 27:
- exit(0);
- }
- glutPostRedisplay();
-}
-
-
-static void
-specialkey(int key, int x, int y)
-{
- GLfloat step = 2.0;
- (void) x;
- (void) y;
- switch (key) {
- case GLUT_KEY_UP:
- Xrot += step;
- break;
- case GLUT_KEY_DOWN:
- Xrot -= step;
- break;
- case GLUT_KEY_LEFT:
- Yrot -= step;
- break;
- case GLUT_KEY_RIGHT:
- Yrot += step;
- break;
- }
- glutPostRedisplay();
-}
-
-
-/* new window size or exposure */
-static void
-Reshape(int width, int height)
-{
- GLfloat ar = (float) width / (float) height;
- glViewport(0, 0, (GLint)width, (GLint)height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-2.0*ar, 2.0*ar, -2.0, 2.0, 4.0, 100.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-}
-
-
-static void
-InitTextures(void)
-{
- GLenum filter = GL_LINEAR;
- int i;
-
- for (i = 0; i < 2; i++) {
- GLint imgWidth, imgHeight;
- GLenum imgFormat;
- GLubyte *image = NULL;
-
- image = LoadRGBImage(TexFiles[i], &imgWidth, &imgHeight, &imgFormat);
- if (!image) {
- printf("Couldn't read %s\n", TexFiles[i]);
- exit(0);
- }
-
- glActiveTexture(GL_TEXTURE0 + i);
- glBindTexture(GL_TEXTURE_2D, 42 + i);
- gluBuild2DMipmaps(GL_TEXTURE_2D, 4, imgWidth, imgHeight,
- imgFormat, GL_UNSIGNED_BYTE, image);
- free(image);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
- }
-}
-
-
-static GLuint
-CreateProgram(const char *vertProgFile, const char *fragProgFile,
- struct uniform_info *uniforms)
-{
- GLuint fragShader, vertShader, program;
-
- vertShader = CompileShaderFile(GL_VERTEX_SHADER, vertProgFile);
- fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, fragProgFile);
- assert(vertShader);
- program = LinkShaders(vertShader, fragShader);
-
- glUseProgram(program);
-
- SetUniformValues(program, uniforms);
- PrintUniforms(Uniforms);
-
- assert(ValidateShaderProgram(program));
-
- VertCoord_attr = glGetAttribLocation(program, "VertCoord");
- if (VertCoord_attr > 0) {
- /* We want the VertCoord attrib to have position zero so that
- * the call to glVertexAttrib(0, xyz) triggers vertex processing.
- * Otherwise, if TexCoord0 or TexCoord1 gets position 0 we'd have
- * to set that attribute last (which is a PITA to manage).
- */
- glBindAttribLocation(program, 0, "VertCoord");
- /* re-link */
- glLinkProgram(program);
- /* VertCoord_attr should be zero now */
- VertCoord_attr = glGetAttribLocation(program, "VertCoord");
- assert(VertCoord_attr == 0);
- }
-
- TexCoord0_attr = glGetAttribLocation(program, "TexCoord0");
- TexCoord1_attr = glGetAttribLocation(program, "TexCoord1");
-
- printf("TexCoord0_attr = %d\n", TexCoord0_attr);
- printf("TexCoord1_attr = %d\n", TexCoord1_attr);
- printf("VertCoord_attr = %d\n", VertCoord_attr);
-
- return program;
-}
-
-
-static void
-InitPrograms(void)
-{
- Program = CreateProgram(VertFile, FragFile, Uniforms);
-}
-
-
-static void
-InitGL(void)
-{
- if (!ShadersSupported())
- exit(1);
-
- printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER));
- printf("Usage:\n");
- printf(" a - toggle arrays vs. immediate mode rendering\n");
- printf(" v - toggle VBO usage for array rendering\n");
- printf(" z/Z - change viewing distance\n");
- printf(" SPACE - toggle animation\n");
- printf(" Esc - exit\n");
-
- InitTextures();
- InitPrograms();
-
- SetupVertexBuffer();
-
- glEnable(GL_DEPTH_TEST);
-
- glClearColor(.6, .6, .9, 0);
- glColor3f(1.0, 1.0, 1.0);
-}
-
-
-int
-main(int argc, char *argv[])
-{
- glutInit(&argc, argv);
- glutInitWindowSize(500, 400);
- glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
- glutCreateWindow(Demo);
- glewInit();
- glutReshapeFunc(Reshape);
- glutKeyboardFunc(key);
- glutSpecialFunc(specialkey);
- glutDisplayFunc(draw);
- if (Anim)
- glutIdleFunc(idle);
- InitGL();
- glutMainLoop();
- return 0;
-}