/* Raydium - CQFD Corp. http://raydium.org/ License: GPL - GNU General Public License, see "gpl.txt" file. */ #ifndef DONT_INCLUDE_HEADERS #include "index.h" #else #include "headers/shader.h" #endif #include "shader.h" char *raydium_file_load(char *filename); void raydium_shader_init(void) { int i; raydium_shader_support= (glutExtensionSupported("GL_ARB_shader_objects") && glutExtensionSupported("GL_ARB_shading_language_100") ); for(i=0;i=0 && shader=0) { raydium_log("shader: Error: Cannot create shader \"%s\": name already exists",name); return -1; } for(i=0;i=0) glUseProgramObjectARB(raydium_shader_shaders[sid].prog); ret=raydium_shader_var_i(raydium_shader_variable(sid,variable),value); glUseProgramObjectARB(curr); return ret; } signed char raydium_shader_var_f(int var_id, float value) { if(!raydium_shader_support) return 0; glUniform1fARB(var_id,value); return 1; } signed char raydium_shader_var_f_name(char *shader, char *variable, float value) { signed char ret; GLhandleARB curr; int sid; if(!raydium_shader_support) return 0; curr=glGetHandleARB(GL_PROGRAM_OBJECT_ARB); sid=raydium_shader_find(shader); if(sid>=0) glUseProgramObjectARB(raydium_shader_shaders[sid].prog); ret=raydium_shader_var_f(raydium_shader_variable(sid,variable),value); glUseProgramObjectARB(curr); return ret; } signed char raydium_shader_var_2f(int var_id, float value1, float value2) { if(!raydium_shader_support) return 0; glUniform2fARB(var_id,value1,value2); return 1; } signed char raydium_shader_var_2f_name(char *shader, char *variable, float value1, float value2) { signed char ret; GLhandleARB curr; int sid; if(!raydium_shader_support) return 0; curr=glGetHandleARB(GL_PROGRAM_OBJECT_ARB); sid=raydium_shader_find(shader); if(sid>=0) glUseProgramObjectARB(raydium_shader_shaders[sid].prog); ret=raydium_shader_var_2f(raydium_shader_variable(sid,variable),value1,value2); glUseProgramObjectARB(curr); return ret; } signed char raydium_shader_var_3f(int var_id, float value1, float value2, float value3) { if(!raydium_shader_support) return 0; glUniform3fARB(var_id,value1,value2,value3); return 1; } signed char raydium_shader_var_3f_name(char *shader, char *variable, float value1, float value2, float value3) { signed char ret; GLhandleARB curr; int sid; if(!raydium_shader_support) return 0; curr=glGetHandleARB(GL_PROGRAM_OBJECT_ARB); sid=raydium_shader_find(shader); if(sid>=0) glUseProgramObjectARB(raydium_shader_shaders[sid].prog); ret=raydium_shader_var_3f(raydium_shader_variable(sid,variable),value1,value2,value3); glUseProgramObjectARB(curr); return ret; } signed char raydium_shader_var_4f(int var_id, float value1, float value2, float value3, float value4) { if(!raydium_shader_support) return 0; glUniform4fARB(var_id,value1,value2,value3,value4); return 1; } signed char raydium_shader_var_4f_name(char *shader, char *variable, float value1, float value2, float value3, float value4) { signed char ret; GLhandleARB curr; int sid; if(!raydium_shader_support) return 0; curr=glGetHandleARB(GL_PROGRAM_OBJECT_ARB); sid=raydium_shader_find(shader); if(sid>=0) glUseProgramObjectARB(raydium_shader_shaders[sid].prog); ret=raydium_shader_var_4f(raydium_shader_variable(sid,variable),value1,value2,value3,value4); glUseProgramObjectARB(curr); return ret; } // -1 = off signed char raydium_shader_current(int shader) { if(!raydium_shader_support) return 0; if(shader==-1) { glUseProgramObjectARB(0); return 1; } if(!raydium_shader_isvalid(shader)) { raydium_log("shader: cannot use shader: Invalid index or name"); return 0; } glUseProgramObjectARB(raydium_shader_shaders[shader].prog); return 1; } signed char raydium_shader_current_name(char *shader) { return raydium_shader_current(raydium_shader_find(shader)); } signed char raydium_shader_attach_texture(int shader, int texture) { if(shader!=-1 && !raydium_shader_isvalid(shader)) // -1 to disable shader { raydium_log("shader: cannot attach shader: Invalid shader"); return 0; } if(texture<=0 || texture>=raydium_texture_index) { raydium_log("shader: cannot attach shader: Invalid texture"); return 0; } raydium_texture_shader[texture]=shader; return 1; } signed char raydium_shader_attach_texture_name(char *shader, char *texture) { return raydium_shader_attach_texture(raydium_shader_find(shader), raydium_texture_find_by_name(texture)); }