progs/glsl: add type field to shtest config files
authorBrian Paul <brianp@vmware.com>
Thu, 13 Aug 2009 21:53:49 +0000 (15:53 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 13 Aug 2009 23:03:56 +0000 (17:03 -0600)
Plus, texture loading.

progs/glsl/brick.shtest
progs/glsl/mandelbrot.shtest
progs/glsl/shtest.c
progs/glsl/toyball.shtest

index c806a0fc545bcb26eeaaccb0020027b94753f03e..8a2152692ebecb369ce033bf98f4050f8a3e8d72 100644 (file)
@@ -1,8 +1,8 @@
 vs CH06-brick.vert
 fs CH06-brick.frag
-uniform LightPosition 0.1 0.1 9.0
-uniform BrickColor 0.8 0.2 0.2
-uniform MortarColor 0.6 0.6 0.6
-uniform BrickSize  1.0 0.3
-uniform BrickPct 0.9 0.8
+uniform LightPosition GL_FLOAT_VEC3 0.1 0.1 9.0
+uniform BrickColor GL_FLOAT_VEC3 0.8 0.2 0.2
+uniform MortarColor GL_FLOAT_VEC3 0.6 0.6 0.6
+uniform BrickSize  GL_FLOAT_VEC2 1.0 0.3
+uniform BrickPct GL_FLOAT_VEC2 0.9 0.8
 
index f5cca2295f2830647ac74b8ca464e32377ac4908..4f4e5c747eab383107a80e342cc5b7a0e9738b0e 100644 (file)
@@ -1,14 +1,13 @@
 vs CH18-mandel.vert
 fs CH18-mandel.frag
-uniform LightPosition        0.1 0.1 9.0
-uniform SpecularContribution 0.5
-uniform DiffuseContribution  0.5
-uniform Shininess            20.0
-uniform Iterations           12
-uniform Zoom                 0.125
-uniform Xcenter              -1.5
-uniform Ycenter              .005
-uniform InnerColor           1 0 0
-uniform OuterColor1          0 1 0
-uniform OuterColor2          0 0 1
-
+uniform LightPosition        GL_FLOAT_VEC3 0.1 0.1 9.0
+uniform SpecularContribution GL_FLOAT 0.5
+uniform DiffuseContribution  GL_FLOAT 0.5
+uniform Shininess            GL_FLOAT 20.0
+uniform Iterations           GL_FLOAT 12
+uniform Zoom                 GL_FLOAT 0.125
+uniform Xcenter              GL_FLOAT -1.5
+uniform Ycenter              GL_FLOAT .005
+uniform InnerColor           GL_FLOAT_VEC3 1 0 0
+uniform OuterColor1          GL_FLOAT_VEC3 0 1 0
+uniform OuterColor2          GL_FLOAT_VEC3 0 0 1
index 7eb7202274813f90427864ae8edcd23f917b862a..09b2593841c03af8a1962d0bcca6f47b11916e27 100644 (file)
@@ -35,6 +35,7 @@
 #include <GL/glu.h>
 #include <GL/glut.h>
 #include "shaderutil.h"
+#include "readtex.h"
 
 
 typedef enum
@@ -361,6 +362,69 @@ InitUniforms(const struct config_file *conf,
 }
 
 
+static void
+LoadTexture(GLint unit, const char *texFileName)
+{
+   GLint imgWidth, imgHeight;
+   GLenum imgFormat;
+   GLubyte *image = NULL;
+   GLuint tex;
+   GLenum filter = GL_LINEAR;
+
+   image = LoadRGBImage(texFileName, &imgWidth, &imgHeight, &imgFormat);
+   if (!image) {
+      printf("Couldn't read %s\n", texFileName);
+      exit(1);
+   }
+
+   printf("Load Texture: unit %d: %s %d x %d\n",
+          unit, texFileName, imgWidth, imgHeight);
+
+   glActiveTexture(GL_TEXTURE0 + unit);
+   glGenTextures(1, &tex);
+   glBindTexture(GL_TEXTURE_2D, tex);
+
+   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 GLenum
+TypeFromName(const char *n)
+{
+   static const struct {
+      const char *name;
+      GLenum type;
+   } types[] = {
+      { "GL_FLOAT", GL_FLOAT },
+      { "GL_FLOAT_VEC2", GL_FLOAT_VEC2 },
+      { "GL_FLOAT_VEC3", GL_FLOAT_VEC3 },
+      { "GL_FLOAT_VEC4", GL_FLOAT_VEC4 },
+      { "GL_INT", GL_INT },
+      { "GL_INT_VEC2", GL_INT_VEC2 },
+      { "GL_INT_VEC3", GL_INT_VEC3 },
+      { "GL_INT_VEC4", GL_INT_VEC4 },
+      { "GL_SAMPLER_2D", GL_SAMPLER_2D },
+      { NULL, 0 }
+   };
+   GLuint i;
+
+   for (i = 0; types[i].name; i++) {
+      if (strcmp(types[i].name, n) == 0)
+         return types[i].type;
+   }
+   abort();
+   return GL_NONE;
+}
+
+
+
 /**
  * Read a config file.
  */
@@ -381,7 +445,7 @@ ReadConfigFile(const char *filename, struct config_file *conf)
    /* ugly but functional parser */
    while (!feof(f)) {
       fgets(line, sizeof(line), f);
-      if (line[0]) {
+      if (!feof(f) && line[0]) {
          if (strncmp(line, "vs ", 3) == 0) {
             VertShaderFile = strdup(line + 3);
             VertShaderFile[strlen(VertShaderFile) - 1] = 0;
@@ -390,32 +454,23 @@ ReadConfigFile(const char *filename, struct config_file *conf)
             FragShaderFile = strdup(line + 3);
             FragShaderFile[strlen(FragShaderFile) - 1] = 0;
          }
+         else if (strncmp(line, "texture ", 8) == 0) {
+            char texFileName[100];
+            int unit, k;
+            k = sscanf(line + 8, "%d %s", &unit, texFileName);
+            assert(k == 2);
+            LoadTexture(unit, texFileName);
+         }
          else if (strncmp(line, "uniform ", 8) == 0) {
-            char name[1000];
+            char name[1000], typeName[100];
             int k;
-            float v1, v2, v3, v4;
+            float v1 = 0.0F, v2 = 0.0F, v3 = 0.0F, v4 = 0.0F;
             GLenum type;
 
-            k = sscanf(line + 8, "%s %f %f %f %f", name, &v1, &v2, &v3, &v4);
+            k = sscanf(line + 8, "%s %s %f %f %f %f", name, typeName,
+                       &v1, &v2, &v3, &v4);
 
-            switch (k) {
-            case 1:
-               type = GL_NONE;
-               abort();
-               break;
-            case 2:
-               type = GL_FLOAT;
-               break;
-            case 3:
-               type = GL_FLOAT_VEC2;
-               break;
-            case 4:
-               type = GL_FLOAT_VEC3;
-               break;
-            case 5:
-               type = GL_FLOAT_VEC4;
-               break;
-            }
+            type = TypeFromName(typeName);
 
             strcpy(conf->uniforms[conf->num_uniforms].name, name);
             conf->uniforms[conf->num_uniforms].value[0] = v1;
index 2852ab043eaae2096e4ec4cc9edeee43d7307bd6..887663abd329cef9196342a660c93f6e4dea7275 100644 (file)
@@ -1,17 +1,17 @@
 vs CH11-toyball.vert
 fs CH11-toyball.frag
-uniform LightDir  0.57737 0.57735 0.57735 0.0
-uniform HVector 0.32506 0.32506 0.88808 0.0
-uniform BallCenter 0.0 0.0 0.0 1.0
-uniform SpecularColor 0.4 0.4 0.4 60.0
-uniform Red     0.6 0.0 0.0 1.0
-uniform Blue    0.0 0.3 0.6 1.0
-uniform Yellow  0.6 0.5 0.0 1.0
-uniform HalfSpace0 1.0 0.0 0.0 0.2
-uniform HalfSpace1 .309016994 0.951056516 0.0 0.2
-uniform HalfSpace2 -0.809016994 0.587785252 0.0 0.2
-uniform HalfSpace3 -0.809016994 -0.587785252 0.0 0.2
-uniform HalfSpace4 .309116994 -0.951056516 0.0 0.2
-uniform InOrOutInit -3.0
-uniform StripeWidth 0.3
-uniform FWidth  .005
+uniform LightDir      GL_FLOAT_VEC4 0.57737 0.57735 0.57735 0.0
+uniform HVector       GL_FLOAT_VEC4 0.32506 0.32506 0.88808 0.0
+uniform BallCenter    GL_FLOAT_VEC4 0.0 0.0 0.0 1.0
+uniform SpecularColor GL_FLOAT_VEC4 0.4 0.4 0.4 60.0
+uniform Red           GL_FLOAT_VEC4 0.6 0.0 0.0 1.0
+uniform Blue          GL_FLOAT_VEC4 0.0 0.3 0.6 1.0
+uniform Yellow        GL_FLOAT_VEC4 0.6 0.5 0.0 1.0
+uniform HalfSpace0    GL_FLOAT_VEC4 1.0 0.0 0.0 0.2
+uniform HalfSpace1    GL_FLOAT_VEC4 .309016994 0.951056516 0.0 0.2
+uniform HalfSpace2    GL_FLOAT_VEC4 -0.809016994 0.587785252 0.0 0.2
+uniform HalfSpace3    GL_FLOAT_VEC4 -0.809016994 -0.587785252 0.0 0.2
+uniform HalfSpace4    GL_FLOAT_VEC4 .309116994 -0.951056516 0.0 0.2
+uniform InOrOutInit   GL_FLOAT -3.0
+uniform StripeWidth   GL_FLOAT 0.3
+uniform FWidth        GL_FLOAT .005