1 #include <msp/core/hash.h>
11 Texturing::~Texturing()
17 int Texturing::find_free_unit(const string &name_hint) const
19 unsigned max_unit = TexUnit::get_n_units();
20 // Leave some space for effect textures
21 max_unit -= min(max_unit/4, 8U);
22 unsigned initial_unit = (name_hint.empty() ? 0 : hash32(name_hint)%max_unit);
23 unsigned unit = initial_unit;
24 while(get_attached_texture(unit))
26 unit = (unit+1)%max_unit;
27 if(unit==initial_unit)
34 void Texturing::attach(unsigned attch, const Texture &tex)
36 set_attachment(attch, &tex);
39 void Texturing::detach(unsigned attch)
41 set_attachment(attch, 0);
44 void Texturing::set_attachment(unsigned unit, const Texture *tex)
46 if(unit>=TexUnit::get_n_units())
47 throw out_of_range("Texturing::set_attachment");
51 vector<Attachment>::iterator i;
52 for(i=attachments.begin(); (i!=attachments.end() && i->unit<=unit); ++i)
61 attachments.insert(i, Attachment(unit, tex));
67 for(vector<Attachment>::iterator i=attachments.begin(); (i!=attachments.end() && i->unit<=unit); ++i)
72 Texture::unbind_from(unit);
78 const Texture *Texturing::get_attached_texture(unsigned unit) const
80 for(vector<Attachment>::const_iterator i=attachments.begin(); (i!=attachments.end() && i->unit<=unit); ++i)
86 void Texturing::bind() const
88 const Texturing *old = current();
93 vector<Attachment>::const_iterator i = attachments.begin();
94 vector<Attachment>::const_iterator j = old->attachments.begin();
95 while(i!=attachments.end() || j!=old->attachments.end())
97 if(i!=attachments.end() && (j==old->attachments.end() || i->unit<=j->unit))
99 i->texture->bind_to(i->unit);
100 if(j!=old->attachments.end() && j->unit==i->unit)
106 Texture::unbind_from(j->unit);
113 for(vector<Attachment>::const_iterator i=attachments.begin(); i!=attachments.end(); ++i)
114 i->texture->bind_to(i->unit);
119 void Texturing::unbind()
121 const Texturing *old = current();
124 for(vector<Attachment>::const_iterator i=old->attachments.begin(); i!=old->attachments.end(); ++i)
125 Texture::unbind_from(i->unit);
130 Texturing::Attachment::Attachment(unsigned u, const Texture *t):