X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Ftexturing.cpp;h=ab5d39b4c42e2b38d51c9ba1dfea5258e851a23a;hp=c30216f139ebbf91e4a7fdcb53021e1fa6cbc39f;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hpb=96e13fc706ba4e1702ff90eb999ee0660278cb0d diff --git a/source/texturing.cpp b/source/texturing.cpp index c30216f1..ab5d39b4 100644 --- a/source/texturing.cpp +++ b/source/texturing.cpp @@ -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::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::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::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::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