+++ /dev/null
-#include <msp/core/hash.h>
-#include "texture.h"
-#include "texturing.h"
-#include "texunit.h"
-
-using namespace std;
-
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
-namespace Msp {
-namespace GL {
-
-Texturing::~Texturing()
-{
- if(current()==this)
- unbind();
-}
-
-int Texturing::find_free_unit(const string &name_hint) const
-{
- unsigned max_unit = TexUnit::get_n_units();
- // Leave some space for effect textures
- 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) || get_attached_sampler(unit))
- {
- unit = (unit+1)%max_unit;
- if(unit==initial_unit)
- return -1;
- }
-
- return unit;
-}
-
-void Texturing::attach(unsigned attch, const Texture &tex, const Sampler *samp)
-{
- 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, 0);
-}
-
-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 || 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)
- bind_attachment(*i);
- return;
- }
-
- attachments.insert(i, Attachment(unit, tex, samp));
- if(current()==this)
- tex->bind_to(unit);
- }
- else
- {
- for(vector<Attachment>::iterator i=attachments.begin(); (i!=attachments.end() && i->unit<=unit); ++i)
- if(i->unit==unit)
- {
- attachments.erase(i);
- if(current()==this)
- unbind_attachment(unit);
- return;
- }
- }
-}
-
-const Texture *Texturing::get_attached_texture(unsigned unit) const
-{
- for(vector<Attachment>::const_iterator i=attachments.begin(); (i!=attachments.end() && i->unit<=unit); ++i)
- if(i->unit==unit)
- return i->texture;
- 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();
- if(set_current(this))
- {
- if(old)
- {
- vector<Attachment>::const_iterator i = attachments.begin();
- vector<Attachment>::const_iterator j = old->attachments.begin();
- while(i!=attachments.end() || j!=old->attachments.end())
- {
- if(i!=attachments.end() && (j==old->attachments.end() || i->unit<=j->unit))
- {
- bind_attachment(*i);
- if(j!=old->attachments.end() && j->unit==i->unit)
- ++j;
- ++i;
- }
- else
- {
- unbind_attachment(j->unit);
- ++j;
- }
- }
- }
- else
- {
- for(vector<Attachment>::const_iterator i=attachments.begin(); i!=attachments.end(); ++i)
- 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);
- if(attch.texture)
- attch.texture->bind_to(attch.unit);
- else
- Texture::unbind_from(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)
- 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, const Sampler *s):
- unit(u),
- texture(t),
- sampler(s)
-{ }
-
-} // namespace GL
-} // namespace Msp;