progs/glsl: add type field to shtest config files

Plus, texture loading.
This commit is contained in:
Brian Paul
2009-08-13 15:53:49 -06:00
parent 823703418e
commit 62d1132160
4 changed files with 108 additions and 54 deletions

View 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;