]> git.tdb.fi Git - libs/gl.git/blobdiff - source/renderpass.cpp
Drop Shader::get_param and Program::get_param
[libs/gl.git] / source / renderpass.cpp
index 5b5f72984b3bbfdbfe293d594ba68b3c17b4bd43..b95bd4bcfe1977c9ce327c0e5189883efd97800a 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007-2008, 2010-2011  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -30,11 +30,11 @@ RenderPass::RenderPass():
 { }
 
 RenderPass::RenderPass(const RenderPass &other):
-       Bindable<RenderPass>(other),
        shprog(other.shprog),
        shdata(other.shdata ? new ProgramData(*other.shdata) : 0),
        material(other.material),
-       texturing(other.texturing ? new Texturing(*other.texturing) : 0)
+       texturing(other.texturing ? new Texturing(*other.texturing) : 0),
+       tex_names(other.tex_names)
 { }
 
 RenderPass::~RenderPass()
@@ -57,45 +57,12 @@ void RenderPass::set_texture(unsigned index, const Texture *tex)
        texturing->attach(index, *tex);
 }
 
-void RenderPass::bind() const
+int RenderPass::get_texture_index(const string &n) const
 {
-       const RenderPass *old = current();
-       if(!set_current(this))
-               return;
-
-       if(shprog)
-       {
-               shprog->bind();
-               shdata->apply();
-       }
-       else if(old && old->shprog)
-               Program::unbind();
-
-       if(material)
-               material->bind();
-       else if(old && old->material)
-               Material::unbind();
-
-       if(texturing)
-               texturing->bind();
-       else if(old && old->texturing)
-               Texturing::unbind();
-}
-
-void RenderPass::unbind()
-{
-       const RenderPass *old = current();
-       if(!set_current(0))
-               return;
-
-       if(old->shprog)
-               Program::unbind();
-
-       if(old->material)
-               Material::unbind();
-
-       if(old->texturing)
-               Texturing::unbind();
+       map<string, unsigned>::const_iterator i = tex_names.find(n);
+       if(i==tex_names.end())
+               return -1;
+       return i->second;
 }
 
 
@@ -116,20 +83,14 @@ void RenderPass::Loader::init()
        allow_pointer_reload = false;
 
        add("shader",   &RenderPass::shprog);
-       add("material", static_cast<void (Loader::*)()>(&Loader::material));
-       add("material", static_cast<void (Loader::*)(const string &)>(&Loader::material));
+       add("material", &Loader::material_inline);
+       add("material", &Loader::material);
        add("texunit",  &Loader::texunit);
+       add("texunit",  &Loader::texunit_named);
        add("uniforms", &Loader::uniforms);
 }
 
-void RenderPass::Loader::finish()
-{
-       // XXX Make shdata optional
-       if(obj.shprog && !obj.shdata)
-               obj.shdata = new ProgramData;
-}
-
-void RenderPass::Loader::material()
+void RenderPass::Loader::material_inline()
 {
        RefPtr<Material> mat = new Material;
        load_sub(*mat);
@@ -150,13 +111,19 @@ void RenderPass::Loader::texunit(unsigned i)
        load_sub_with(ldr);
 }
 
+void RenderPass::Loader::texunit_named(unsigned i, const string &n)
+{
+       texunit(i);
+       obj.tex_names[n] = i;
+}
+
 void RenderPass::Loader::uniforms()
 {
        if(!obj.shprog)
                throw InvalidState("Can't load uniforms without a shader program");
        if(!obj.shdata)
-               obj.shdata = new ProgramData;
-       load_sub(*obj.shdata, *obj.shprog);
+               obj.shdata = new ProgramData(*obj.shprog);
+       load_sub(*obj.shdata);
 }