:) never say something like "I have fixed all the memleaks." it's trolling fate. now, i'm not sure, but it should be less than before.
113 lines
No EOL
2.4 KiB
C
113 lines
No EOL
2.4 KiB
C
/*
|
|
* This software is licensed under the terms of the MIT-License
|
|
* See COPYING for further information.
|
|
* ---
|
|
* Copyright (C) 2011, Lukas Weber <laochailan@web.de>
|
|
*/
|
|
|
|
#include "shader.h"
|
|
#include "global.h"
|
|
#include "list.h"
|
|
#include <stdio.h>
|
|
|
|
void print_info_log(GLuint shader) {
|
|
int len, alen;
|
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
|
|
|
|
if(len > 1) {
|
|
char *log = malloc(len);
|
|
memset(log, 0, len);
|
|
glGetShaderInfoLog(shader, len, &alen, log);
|
|
printf("%s\n", log);
|
|
free(log);
|
|
}
|
|
}
|
|
|
|
void load_shader(const char *filename) {
|
|
FILE *file = fopen(filename,"r");
|
|
if(file == NULL)
|
|
err(-1, "Error opening '%s'", filename);
|
|
|
|
fseek(file, 0, SEEK_END);
|
|
int size = ftell(file);
|
|
fseek(file, 0, SEEK_SET);
|
|
|
|
if(size == 0)
|
|
errx(-1, "File empty!");
|
|
|
|
char *text = malloc(size+1);
|
|
fread(text, size, 1, file);
|
|
text[size] = 0;
|
|
|
|
char *vtext = text;
|
|
char *delim = strstr(text, DELIM);
|
|
if(delim == NULL)
|
|
errx(-1, "Expected '%s' delimiter.", DELIM);
|
|
|
|
*delim = 0;
|
|
char *ftext = delim + DELIM_SIZE;
|
|
|
|
Shader *sha = create_element((void **)&global.shaders, sizeof(Shader));
|
|
GLuint vshaderobj;
|
|
GLuint fshaderobj;
|
|
|
|
sha->prog = glCreateProgram();
|
|
vshaderobj = glCreateShader(GL_VERTEX_SHADER);
|
|
fshaderobj = glCreateShader(GL_FRAGMENT_SHADER);
|
|
|
|
int s = -1;
|
|
|
|
glShaderSource(vshaderobj, 1, (const GLchar **)&vtext, &s);
|
|
glShaderSource(fshaderobj, 1, (const GLchar **)&ftext, &s);
|
|
|
|
glCompileShader(vshaderobj);
|
|
glCompileShader(fshaderobj);
|
|
|
|
print_info_log(vshaderobj);
|
|
print_info_log(fshaderobj);
|
|
|
|
glAttachShader(sha->prog, vshaderobj);
|
|
glAttachShader(sha->prog, fshaderobj);
|
|
|
|
glDeleteShader(vshaderobj);
|
|
glDeleteShader(fshaderobj);
|
|
|
|
glLinkProgram(sha->prog);
|
|
|
|
print_info_log(sha->prog);
|
|
|
|
free(text);
|
|
|
|
char *beg = strstr(filename, "shader/") + 7;
|
|
char *end = strrchr(filename, '.');
|
|
|
|
sha->name = malloc(end - beg + 1);
|
|
memset(sha->name, 0, end-beg + 1);
|
|
strncpy(sha->name, beg, end-beg);
|
|
|
|
printf("-- loaded '%s' as '%s'\n", filename, sha->name);
|
|
}
|
|
|
|
GLuint get_shader(const char *name) {
|
|
Shader *s, *res = NULL;
|
|
for(s = global.shaders; s; s = s->next) {
|
|
if(strcmp(s->name, name) == 0)
|
|
res = s;
|
|
}
|
|
|
|
if(res == NULL)
|
|
errx(-1,"get_shader():\n!- cannot load shader '%s'", name);
|
|
|
|
return res->prog;
|
|
}
|
|
|
|
void delete_shader(void **shas, void *sha) {
|
|
free(((Shader *)sha)->name);
|
|
glDeleteShader(((Shader*)sha)->prog);
|
|
|
|
delete_element(shas, sha);
|
|
}
|
|
|
|
void delete_shaders() {
|
|
delete_all_elements((void **)&global.shaders, delete_shader);
|
|
} |