added shader attributes and added vertex buffer loading

This commit is contained in:
jp9000
2013-10-11 20:14:26 -07:00
parent 3951babc93
commit aeea0eadc9
8 changed files with 251 additions and 61 deletions

View File

@@ -108,13 +108,69 @@ static inline void gl_add_samplers(struct gs_shader *shader,
struct gl_shader_parser *glsp)
{
size_t i;
for (i = 0; i < glsp->parser.samplers.num; i++) {
struct shader_sampler *sampler = glsp->parser.samplers.array+i;
gl_add_sampler(shader, sampler);
}
}
static void get_attrib_type(const char *mapping, enum attrib_type *type,
size_t *index)
{
if (strcmp(mapping, "POSITION") == 0) {
*type = ATTRIB_POSITION;
} else if (strcmp(mapping, "NORMAL") == 0) {
*type = ATTRIB_NORMAL;
} else if (strcmp(mapping, "TANGENT") == 0) {
*type = ATTRIB_TANGENT;
} else if (strcmp(mapping, "COLOR") == 0) {
*type = ATTRIB_COLOR;
} else if (astrcmp_n(mapping, "TEXCOORD", 8) == 0) {
*type = ATTRIB_TEXCOORD;
*index = (*(mapping+8)) - '0';
return;
} else if (strcmp(mapping, "TARGET") == 0) {
*type = ATTRIB_TARGET;
}
*index = 0;
}
static inline bool gl_add_attrib(struct gs_shader *shader,
struct gl_parser_attrib *pa)
{
struct shader_attrib attrib = {0};
get_attrib_type(pa->mapping, &attrib.type, &attrib.index);
attrib.attrib = glGetAttribLocation(shader->program, pa->name.array);
if (!gl_success("glGetAttribLocation"))
return false;
if (attrib.attrib == -1)
return false;
da_push_back(shader->attribs, &attrib);
return true;
}
static inline bool gl_add_attribs(struct gs_shader *shader,
struct gl_shader_parser *glsp)
{
size_t i;
for (i = 0; i < glsp->attribs.num; i++) {
struct gl_parser_attrib *pa = glsp->attribs.array+i;
if (!gl_add_attrib(shader, pa))
return false;
}
return true;
}
static bool gl_shader_init(struct gs_shader *shader,
struct gl_shader_parser *glsp,
const char *file, char **error_string)
@@ -140,6 +196,8 @@ static bool gl_shader_init(struct gs_shader *shader,
if (success)
success = gl_add_params(shader, glsp);
if (success)
success = gl_add_attribs(shader, glsp);
if (success)
gl_add_samplers(shader, glsp);
@@ -176,14 +234,22 @@ shader_t device_create_vertexshader(device_t device,
const char *shader, const char *file,
char **error_string)
{
return shader_create(device, SHADER_VERTEX, shader, file, error_string);
struct gs_shader *ptr;
ptr = shader_create(device, SHADER_VERTEX, shader, file, error_string);
if (!ptr)
blog(LOG_ERROR, "device_create_vertexshader (GL) failed");
return ptr;
}
shader_t device_create_pixelshader(device_t device,
const char *shader, const char *file,
char **error_string)
{
return shader_create(device, SHADER_PIXEL, shader, file, error_string);
struct gs_shader *ptr;
ptr = shader_create(device, SHADER_PIXEL, shader, file, error_string);
if (!ptr)
blog(LOG_ERROR, "device_create_pixelshader (GL) failed");
return ptr;
}
void shader_destroy(shader_t shader)