From 62d113216090cd093c7cc6373c9115e31f921e7c Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 13 Aug 2009 15:53:49 -0600 Subject: [PATCH] progs/glsl: add type field to shtest config files Plus, texture loading. --- progs/glsl/brick.shtest | 10 ++-- progs/glsl/mandelbrot.shtest | 23 ++++----- progs/glsl/shtest.c | 99 ++++++++++++++++++++++++++++-------- progs/glsl/toyball.shtest | 30 +++++------ 4 files changed, 108 insertions(+), 54 deletions(-) diff --git a/progs/glsl/brick.shtest b/progs/glsl/brick.shtest index c806a0fc545..8a2152692eb 100644 --- a/progs/glsl/brick.shtest +++ b/progs/glsl/brick.shtest @@ -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 diff --git a/progs/glsl/mandelbrot.shtest b/progs/glsl/mandelbrot.shtest index f5cca2295f2..4f4e5c747ea 100644 --- a/progs/glsl/mandelbrot.shtest +++ b/progs/glsl/mandelbrot.shtest @@ -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 diff --git a/progs/glsl/shtest.c b/progs/glsl/shtest.c index 7eb72022748..09b2593841c 100644 --- a/progs/glsl/shtest.c +++ b/progs/glsl/shtest.c @@ -35,6 +35,7 @@ #include #include #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; diff --git a/progs/glsl/toyball.shtest b/progs/glsl/toyball.shtest index 2852ab043ea..887663abd32 100644 --- a/progs/glsl/toyball.shtest +++ b/progs/glsl/toyball.shtest @@ -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 -- 2.30.2