progs/glsl: add type field to shtest config files
Plus, texture loading.
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user