]> git.tdb.fi Git - libs/gl.git/blobdiff - source/renderpass.cpp
Rework Bind and enable it to restore the old binding
[libs/gl.git] / source / renderpass.cpp
index 9e5b71d91f6a7a778902400d58fb0f5316dc40b7..70fa546afcddc0a0f2bcafb04da1313ddbd2b85b 100644 (file)
@@ -19,8 +19,6 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-const RenderPass *RenderPass::current=0;
-
 RenderPass::RenderPass():
        shprog(0),
        shdata(0),
@@ -45,7 +43,7 @@ RenderPass::~RenderPass()
 
 void RenderPass::set_material(const Material *mat)
 {
-       material=mat;
+       material = mat;
 }
 
 unsigned RenderPass::get_texture_index(const string &slot) const
@@ -59,28 +57,26 @@ unsigned RenderPass::get_texture_index(const string &slot) const
 
 void RenderPass::set_texture(const string &slot, const Texture *tex)
 {
-       textures[get_texture_index(slot)]=tex;
+       textures[get_texture_index(slot)] = tex;
 }
 
 void RenderPass::bind() const
 {
-       if(this==current)
+       const RenderPass *old = current();
+       if(!set_current(this))
                return;
 
-       const RenderPass *old=current;
-       current=this;
-
        if(shprog)
        {
                shprog->bind();
                shdata->apply();
        }
-       else if(old && !old->shprog)
+       else if(old && old->shprog)
                GL::Program::unbind();
 
        if(material)
                material->bind();
-       else if(old && !old->material)
+       else if(old && old->material)
                GL::Material::unbind();
 
        for(unsigned i=0; i<textures.size(); ++i)
@@ -95,26 +91,36 @@ void RenderPass::bind() const
 
 void RenderPass::unbind()
 {
-       if(current)
-       {
-               if(current->shprog)
-                       GL::Program::unbind();
+       const RenderPass *old = current();
+       if(!set_current(0))
+               return;
 
-               if(current->material)
-                       GL::Material::unbind();
+       if(old->shprog)
+               GL::Program::unbind();
 
-               for(unsigned i=current->textures.size(); i--; )
-                       GL::Texture::unbind_from(i);
+       if(old->material)
+               GL::Material::unbind();
 
-               current=0;
-       }
+       for(unsigned i=old->textures.size(); i--; )
+               GL::Texture::unbind_from(i);
 }
 
 
+RenderPass::Loader::Loader(RenderPass &p):
+       DataFile::CollectionObjectLoader<RenderPass>(p, 0)
+{
+       init();
+}
+
 RenderPass::Loader::Loader(RenderPass &p, Collection &c):
        DataFile::CollectionObjectLoader<RenderPass>(p, &c)
 {
-       allow_pointer_reload=false;
+       init();
+}
+
+void RenderPass::Loader::init()
+{
+       allow_pointer_reload = false;
 
        add("shader",   &RenderPass::shprog);
        add("material", &Loader::material);
@@ -128,11 +134,11 @@ void RenderPass::Loader::finish()
        if(obj.shprog)
        {
                if(!obj.shdata)
-                       obj.shdata=new ProgramData;
+                       obj.shdata = new ProgramData;
 
                for(unsigned i=0; i<obj.textures.size(); ++i)
                {
-                       unsigned loc=obj.shprog->get_uniform_location(obj.textures[i].name);
+                       unsigned loc = obj.shprog->get_uniform_location(obj.textures[i].name);
                        obj.shdata->uniform(loc, static_cast<int>(i));
                }
        }
@@ -143,17 +149,17 @@ void RenderPass::Loader::material()
        if(obj.material)
                throw InvalidState("A material is already loaded");
 
-       RefPtr<Material> mat=new Material;
+       RefPtr<Material> mat = new Material;
        load_sub(*mat);
-       obj.material=mat.release();
-       obj.own_material=true;
+       obj.material = mat.release();
+       obj.own_material = true;
 }
 
 void RenderPass::Loader::texture(const string &n)
 {
-       const Texture *tex=(n.empty() ? 0 : get_collection().get<Texture>(n));
+       const Texture *tex = (n.empty() ? 0 : get_collection().get<Texture>(n));
        TextureSlot slot(tex);
-       slot.name=(obj.textures.empty() ? "texture" : format("texture%d", obj.textures.size()));
+       slot.name = (obj.textures.empty() ? "texture" : format("texture%d", obj.textures.size()));
        load_sub(slot);
        obj.textures.push_back(slot);
 }
@@ -163,7 +169,7 @@ void RenderPass::Loader::uniforms()
        if(!obj.shprog)
                throw InvalidState("Can't load uniforms without a shader program");
        if(!obj.shdata)
-               obj.shdata=new ProgramData;
+               obj.shdata = new ProgramData;
        load_sub(*obj.shdata, *obj.shprog);
 }