#include "shader_glsl.h" ShaderProgramGLSL::ShaderProgramGLSL(const char *dir,const char *name,bool fragprogram): ShaderProgram(dir,name,fragprogram) { if (!is_valid) return; if (!GLEE_ARB_shading_language_100) { is_valid=false; return; } program=glCreateProgramObjectARB(); frag=glCreateShaderObjectARB(GL_FRAGMENT_SHADER); vert=glCreateShaderObjectARB(GL_VERTEX_SHADER); glShaderSourceARB(frag,1,(const GLcharARB **)&fpsrc,NULL); glShaderSourceARB(vert,1,(const GLcharARB **)&vpsrc,NULL); glCompileShaderARB(frag); glCompileShaderARB(vert); glAttachObjectARB(program,frag); glAttachObjectARB(program,vert); glLinkProgramARB(program); } ShaderProgramGLSL::~ShaderProgramGLSL() { glDeleteObjectARB(vert); glDeleteObjectARB(frag); glDeleteObjectARB(program); } void ShaderProgramGLSL::Bind() { for (register unsigned int i=0; i-1) { float *floats=(float *)uniforms[i].val; int *ints=(int *)uniforms[i].val; int sampler=*(int *)uniforms[i].val; switch (uniforms[i].type) { case RAVEN_SHADER_SAMPLER: glUniform1iARB(addr,sampler); break; case RAVEN_SHADER_FLOAT1: glUniform1fARB(addr,floats[0]); break; case RAVEN_SHADER_FLOAT2: glUniform2fARB(addr,floats[0],floats[1]); break; case RAVEN_SHADER_FLOAT3: glUniform3fARB(addr,floats[0],floats[1],floats[2]); break; case RAVEN_SHADER_FLOAT4: glUniform4fARB(addr,floats[0],floats[1],floats[2],floats[3]); break; case RAVEN_SHADER_INT1: glUniform1iARB(addr,ints[0]); break; case RAVEN_SHADER_INT2: glUniform2iARB(addr,ints[0],ints[1]); break; case RAVEN_SHADER_INT3: glUniform3iARB(addr,ints[0],ints[1],ints[2]); break; case RAVEN_SHADER_INT4: glUniform4iARB(addr,ints[0],ints[1],ints[2],ints[3]); break; case RAVEN_SHADER_MATRIX_2X2: glUniformMatrix2fvARB(addr,1,0,floats); break; case RAVEN_SHADER_MATRIX_3X3: glUniformMatrix3fvARB(addr,1,0,floats); break; case RAVEN_SHADER_MATRIX_4X4: glUniformMatrix4fvARB(addr,1,0,floats); break; } } } glUseProgramObjectARB(program); }