]> git.tdb.fi Git - libs/gl.git/blobdiff - source/texturing.cpp
Remove the deprecated ProgramBuilder class
[libs/gl.git] / source / texturing.cpp
index c30216f139ebbf91e4a7fdcb53021e1fa6cbc39f..ab5d39b4c42e2b38d51c9ba1dfea5258e851a23a 100644 (file)
@@ -21,7 +21,7 @@ int Texturing::find_free_unit(const string &name_hint) const
        max_unit -= min(max_unit/4, 8U);
        unsigned initial_unit = (name_hint.empty() ? 0 : hash32(name_hint)%max_unit);
        unsigned unit = initial_unit;
-       while(get_attached_texture(unit))
+       while(get_attached_texture(unit) || get_attached_sampler(unit))
        {
                unit = (unit+1)%max_unit;
                if(unit==initial_unit)
@@ -31,34 +31,40 @@ int Texturing::find_free_unit(const string &name_hint) const
        return unit;
 }
 
-void Texturing::attach(unsigned attch, const Texture &tex)
+void Texturing::attach(unsigned attch, const Texture &tex, const Sampler *samp)
 {
-       set_attachment(attch, &tex);
+       set_attachment(attch, &tex, samp);
+}
+
+void Texturing::attach(unsigned attch, const Sampler &samp)
+{
+       set_attachment(attch, 0, &samp);
 }
 
 void Texturing::detach(unsigned attch)
 {
-       set_attachment(attch, 0);
+       set_attachment(attch, 0, 0);
 }
 
-void Texturing::set_attachment(unsigned unit, const Texture *tex)
+void Texturing::set_attachment(unsigned unit, const Texture *tex, const Sampler *samp)
 {
        if(unit>=TexUnit::get_n_units())
                throw out_of_range("Texturing::set_attachment");
 
-       if(tex)
+       if(tex || samp)
        {
                vector<Attachment>::iterator i;
                for(i=attachments.begin(); (i!=attachments.end() && i->unit<=unit); ++i)
                        if(i->unit==unit)
                        {
                                i->texture = tex;
+                               i->sampler = samp;
                                if(current()==this)
-                                       tex->bind_to(unit);
+                                       bind_attachment(*i);
                                return;
                        }
 
-               attachments.insert(i, Attachment(unit, tex));
+               attachments.insert(i, Attachment(unit, tex, samp));
                if(current()==this)
                        tex->bind_to(unit);
        }
@@ -69,7 +75,7 @@ void Texturing::set_attachment(unsigned unit, const Texture *tex)
                        {
                                attachments.erase(i);
                                if(current()==this)
-                                       Texture::unbind_from(unit);
+                                       unbind_attachment(unit);
                                return;
                        }
        }
@@ -83,6 +89,14 @@ const Texture *Texturing::get_attached_texture(unsigned unit) const
        return 0;
 }
 
+const Sampler *Texturing::get_attached_sampler(unsigned unit) const
+{
+       for(vector<Attachment>::const_iterator i=attachments.begin(); (i!=attachments.end() && i->unit<=unit); ++i)
+               if(i->unit==unit)
+                       return i->sampler;
+       return 0;
+}
+
 void Texturing::bind() const
 {
        const Texturing *old = current();
@@ -96,14 +110,14 @@ void Texturing::bind() const
                        {
                                if(i!=attachments.end() && (j==old->attachments.end() || i->unit<=j->unit))
                                {
-                                       i->texture->bind_to(i->unit);
+                                       bind_attachment(*i);
                                        if(j!=old->attachments.end() && j->unit==i->unit)
                                                ++j;
                                        ++i;
                                }
                                else
                                {
-                                       Texture::unbind_from(j->unit);
+                                       unbind_attachment(j->unit);
                                        ++j;
                                }
                        }
@@ -111,25 +125,41 @@ void Texturing::bind() const
                else
                {
                        for(vector<Attachment>::const_iterator i=attachments.begin(); i!=attachments.end(); ++i)
-                               i->texture->bind_to(i->unit);
+                               bind_attachment(*i);
                }
        }
 }
 
+void Texturing::bind_attachment(const Attachment &attch) const
+{
+       if(attch.sampler)
+               attch.sampler->bind_to(attch.unit);
+       else
+               Sampler::unbind_from(attch.unit);
+       attch.texture->bind_to(attch.unit);
+}
+
 void Texturing::unbind()
 {
        const Texturing *old = current();
        if(set_current(0))
        {
                for(vector<Attachment>::const_iterator i=old->attachments.begin(); i!=old->attachments.end(); ++i)
-                       Texture::unbind_from(i->unit);
+                       unbind_attachment(i->unit);
        }
 }
 
+void Texturing::unbind_attachment(unsigned unit)
+{
+       Texture::unbind_from(unit);
+       Sampler::unbind_from(unit);
+}
+
 
-Texturing::Attachment::Attachment(unsigned u, const Texture *t):
+Texturing::Attachment::Attachment(unsigned u, const Texture *t, const Sampler *s):
        unit(u),
-       texture(t)
+       texture(t),
+       sampler(s)
 { }
 
 } // namespace GL