]> git.tdb.fi Git - libs/gl.git/blobdiff - source/program.cpp
Fix color equations in the standard shaders
[libs/gl.git] / source / program.cpp
index a268850762ef2a78bddd6347fc0de53a1e619eb6..729018a1a4b1edc69438d426c32426e82b19b09b 100644 (file)
@@ -8,7 +8,6 @@
 #include "arb_vertex_shader.h"
 #include "buffer.h"
 #include "error.h"
-#include "extension.h"
 #include "program.h"
 #include "shader.h"
 
@@ -18,6 +17,7 @@ namespace {
 
 const char *standard_vertex_src[] =
 {
+       "s",   "uniform int shadow_unit;\n",
        "n",   "attribute vec3 tangent;\n",
        "n",   "attribute vec3 binormal;\n",
        "t|n", "varying vec2 v_texcoord;\n",
@@ -47,7 +47,7 @@ const char *standard_vertex_src[] =
        "p|en",  "\tv_eye_dir = vec3(dot(eye_tangent, eye_dir), dot(eye_binormal, eye_dir), dot(eye_normal, eye_dir));\n",
        "p|e!n", "\tv_eye_dir = eye_dir;\n",
        "t|n", "\tv_texcoord = gl_MultiTexCoord0.xy;\n",
-       "s",   "\tv_shadowcoord = vec3(dot(gl_EyePlaneS[3], eye_pos), dot(gl_EyePlaneT[3], eye_pos), dot(gl_EyePlaneR[3], eye_pos));\n",
+       "s",   "\tv_shadowcoord = vec3(dot(gl_EyePlaneS[shadow_unit], eye_pos), dot(gl_EyePlaneT[shadow_unit], eye_pos), dot(gl_EyePlaneR[shadow_unit], eye_pos));\n",
        "!lm", "\tv_color = gl_Color;\n",
         0,    "}",
        0, 0
@@ -79,9 +79,10 @@ const char *standard_fragment_src[] =
        "e",   "\tvec4 reflection = textureCube(environment, n_normal*(dot(n_normal, v_eye_dir)*2.0)-v_eye_dir);\n",
        "t",   "\tvec4 tex_sample = texture2D(texture, v_texcoord);\n",
         0,    "\tgl_FragColor.rgb = ",
-       "!t!l!m", "vec3(1.0)",
+       "!t!m",  "vec3(1.0)",
        "t",     "tex_sample.rgb",
        "l|mt",  "*",
+       "l!m!t",  "*",
        "!lm",   "v_color.rgb",
        "l",     "((l_diffuse",
        "lm",    "*gl_FrontLightProduct[0].diffuse.rgb",
@@ -94,10 +95,11 @@ const char *standard_fragment_src[] =
        "e",     "+reflection.rgb*reflectivity",
         0,      ";\n",
         0,    "\tgl_FragColor.a = ",
-       "!m",    "1.0",
+       "!t!m",  "1.0",
+       "t",     "tex_sample.a",
+       "tm",    "*",
        "!lm",   "v_color.a",
        "lm",    "gl_FrontMaterial.diffuse.a",
-       "t",     "*tex_sample.a",
         0,      ";\n",
         0,    "}\n",
        0, 0
@@ -133,24 +135,24 @@ Program::Program(const string &vert, const string &frag)
 
 void Program::init()
 {
-       static RequireExtension _ext("GL_ARB_shader_objects");
+       static Require _req(ARB_shader_objects);
 
        linked = false;
-       id = glCreateProgramObjectARB();
+       id = glCreateProgram();
 }
 
 Program::~Program()
 {
        for(ShaderList::iterator i=owned_data.begin(); i!=owned_data.end(); ++i)
                delete *i;
-       glDeleteObjectARB(id);
+       glDeleteProgram(id);
 }
 
 void Program::attach_shader(Shader &shader)
 {
        if(find(shaders.begin(), shaders.end(), &shader)==shaders.end())
        {
-               glAttachObjectARB(id, shader.get_id());
+               glAttachShader(id, shader.get_id());
                shaders.push_back(&shader);
        }
 }
@@ -168,7 +170,7 @@ void Program::detach_shader(Shader &shader)
        if(i!=shaders.end())
        {
                shaders.erase(i, shaders.end());
-               glDetachObjectARB(id, shader.get_id());
+               glDetachShader(id, shader.get_id());
        }
 }
 
@@ -220,8 +222,8 @@ string Program::process_standard_source(const char **source, const string &flags
 
 void Program::bind_attribute(unsigned index, const string &name)
 {
-       static RequireExtension _ext("GL_ARB_vertex_shader");
-       glBindAttribLocationARB(id, index, name.c_str());
+       static Require _req(ARB_vertex_shader);
+       glBindAttribLocation(id, index, name.c_str());
 }
 
 void Program::link()
@@ -232,13 +234,13 @@ void Program::link()
 
        uniforms.clear();
 
-       glLinkProgramARB(id);
+       glLinkProgram(id);
        int value;
-       glGetObjectParameterivARB(id, GL_OBJECT_LINK_STATUS_ARB, &value);
+       glGetProgramiv(id, GL_LINK_STATUS, &value);
        if(!(linked = value))
                throw compile_error(get_info_log());
 
-       glGetObjectParameterivARB(id, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &value);
+       glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &value);
        unsigned count = value;
        vector<UniformInfo *> uniforms_by_index(count);
        for(unsigned i=0; i<count; ++i)
@@ -247,7 +249,7 @@ void Program::link()
                int len = 0;
                int size;
                GLenum type;
-               glGetActiveUniformARB(id, i, 128, &len, &size, &type, name);
+               glGetActiveUniform(id, i, 128, &len, &size, &type, name);
                if(len && strncmp(name, "gl_", 3))
                {
                        UniformInfo &info = uniforms[name];
@@ -261,9 +263,9 @@ void Program::link()
                }
        }
 
-       if(is_supported("GL_ARB_uniform_buffer_object"))
+       if(ARB_uniform_buffer_object)
        {
-               glGetObjectParameterivARB(id, GL_ACTIVE_UNIFORM_BLOCKS, &value);
+               glGetProgramiv(id, GL_ACTIVE_UNIFORM_BLOCKS, &value);
                count = value;
                for(unsigned i=0; i<count; ++i)
                {
@@ -320,6 +322,7 @@ void Program::link()
                                        uniforms_by_index[indices[j]]->matrix_stride = values[j];
                        }
 
+                       sort(info.uniforms.begin(), info.uniforms.end(), uniform_location_compare);
                        info.layout_hash = compute_layout_hash(info.uniforms);
                        info.bind_point = info.layout_hash%BufferRange::get_n_uniform_buffer_bindings();
                        glUniformBlockBinding(id, i, info.bind_point);
@@ -330,7 +333,7 @@ void Program::link()
        for(UniformMap::iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
                if(!i->second.block)
                {
-                       i->second.location = glGetUniformLocationARB(id, i->second.name.c_str());
+                       i->second.location = glGetUniformLocation(id, i->second.name.c_str());
                        blockless_uniforms.push_back(&i->second);
                }
 
@@ -345,12 +348,17 @@ unsigned Program::compute_layout_hash(const vector<const UniformInfo *> &uniform
        return hash32(layout_descriptor);
 }
 
+bool Program::uniform_location_compare(const UniformInfo *uni1, const UniformInfo *uni2)
+{
+       return uni1->location<uni2->location;
+}
+
 string Program::get_info_log() const
 {
        GLsizei len = 0;
-       glGetObjectParameterivARB(id, GL_OBJECT_INFO_LOG_LENGTH_ARB, &len);
+       glGetProgramiv(id, GL_INFO_LOG_LENGTH, &len);
        char *buf = new char[len+1];
-       glGetInfoLogARB(id, len+1, &len, buf);
+       glGetProgramInfoLog(id, len+1, &len, buf);
        string log(buf, len);
        delete[] buf;
        return log;
@@ -399,7 +407,7 @@ void Program::bind() const
        if(!set_current(this))
                return;
 
-       glUseProgramObjectARB(id);
+       glUseProgram(id);
 }
 
 void Program::unbind()
@@ -407,7 +415,7 @@ void Program::unbind()
        if(!set_current(0))
                return;
 
-       glUseProgramObjectARB(0);
+       glUseProgram(0);
 }