#include "error.h"
#include "sampler.h"
#include "texture.h"
-#include "texunit.h"
using namespace std;
glGenSamplers(1, &id);
}
-void Sampler::update_parameter(int mask) const
+void Sampler::update() const
{
- if(mask&MIN_FILTER)
- glSamplerParameteri(id, GL_TEXTURE_MIN_FILTER, min_filter);
- if(mask&MAG_FILTER)
- glSamplerParameteri(id, GL_TEXTURE_MAG_FILTER, mag_filter);
- if(mask&MAX_ANISOTROPY)
+ if(dirty_params&MIN_FILTER)
+ glSamplerParameteri(id, GL_TEXTURE_MIN_FILTER, get_gl_filter(min_filter));
+ if(dirty_params&MAG_FILTER)
+ glSamplerParameteri(id, GL_TEXTURE_MAG_FILTER, get_gl_filter(mag_filter));
+ if(dirty_params&MAX_ANISOTROPY)
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy);
- if(mask&WRAP_S)
- glSamplerParameteri(id, GL_TEXTURE_WRAP_S, wrap_s);
- if(mask&WRAP_T)
- glSamplerParameteri(id, GL_TEXTURE_WRAP_T, wrap_t);
- if(mask&WRAP_R)
- glSamplerParameteri(id, GL_TEXTURE_WRAP_R, wrap_r);
- if(mask&BORDER_COLOR)
+ if(dirty_params&WRAP_S)
+ glSamplerParameteri(id, GL_TEXTURE_WRAP_S, get_gl_wrap(wrap_s));
+ if(dirty_params&WRAP_T)
+ glSamplerParameteri(id, GL_TEXTURE_WRAP_T, get_gl_wrap(wrap_t));
+ if(dirty_params&WRAP_R)
+ glSamplerParameteri(id, GL_TEXTURE_WRAP_R, get_gl_wrap(wrap_r));
+ if(dirty_params&BORDER_COLOR)
glSamplerParameterfv(id, GL_TEXTURE_BORDER_COLOR, &border_color.r);
- if(mask&COMPARE)
+ if(dirty_params&COMPARE)
{
glSamplerParameteri(id, GL_TEXTURE_COMPARE_MODE, (compare ? GL_COMPARE_R_TO_TEXTURE : GL_NONE));
if(compare)
- glSamplerParameteri(id, GL_TEXTURE_COMPARE_FUNC, cmp_func);
+ glSamplerParameteri(id, GL_TEXTURE_COMPARE_FUNC, get_gl_predicate(cmp_func));
}
+
+ dirty_params = 0;
}
void Sampler::set_min_filter(TextureFilter f)
{
min_filter = f;
- update_parameter(MIN_FILTER);
+ dirty_params |= MIN_FILTER;
}
void Sampler::set_mag_filter(TextureFilter f)
{
mag_filter = f;
- update_parameter(MAG_FILTER);
+ dirty_params |= MAG_FILTER;
}
void Sampler::set_filter(TextureFilter f)
static Require _req(EXT_texture_filter_anisotropic);
max_anisotropy = a;
if(EXT_texture_filter_anisotropic)
- update_parameter(MAX_ANISOTROPY);
+ dirty_params |= MAX_ANISOTROPY;
}
void Sampler::set_wrap(TextureWrap w)
void Sampler::set_wrap_s(TextureWrap w)
{
wrap_s = w;
- update_parameter(WRAP_S);
+ dirty_params |= WRAP_S;
}
void Sampler::set_wrap_t(TextureWrap w)
{
wrap_t = w;
- update_parameter(WRAP_T);
+ dirty_params |= WRAP_T;
}
void Sampler::set_wrap_r(TextureWrap w)
{
static Require _req(EXT_texture3D);
wrap_r = w;
- update_parameter(WRAP_R);
+ dirty_params |= WRAP_R;
}
void Sampler::set_border_color(const Color &c)
{
border_color = c;
- update_parameter(BORDER_COLOR);
+ dirty_params |= BORDER_COLOR;
}
void Sampler::disable_compare()
{
compare = false;
- update_parameter(COMPARE);
+ dirty_params |= COMPARE;
}
void Sampler::set_compare(Predicate f)
dirty_params |= COMPARE;
}
-void Sampler::bind_to(unsigned i) const
-{
- TexUnit &unit = TexUnit::get_unit(i);
-
- if(unit.set_sampler(this))
- {
- glBindSampler(i, id);
-
- if(dirty_params)
- {
- update_parameter(dirty_params);
- dirty_params = 0;
- }
- }
-}
-
-const Sampler *Sampler::current(unsigned i)
-{
- return TexUnit::get_unit(i).get_sampler();
-}
-
-void Sampler::unbind_from(unsigned i)
-{
- TexUnit &unit = TexUnit::get_unit(i);
- if(unit.set_sampler(0))
- glBindSampler(i, 0);
-}
-
void Sampler::set_debug_name(const string &name)
{
#ifdef DEBUG
filter==LINEAR_MIPMAP_NEAREST || filter==LINEAR_MIPMAP_LINEAR);
}
+unsigned get_gl_filter(TextureFilter filter)
+{
+ switch(filter)
+ {
+ case NEAREST: return GL_NEAREST;
+ case LINEAR: return GL_LINEAR;
+ case NEAREST_MIPMAP_NEAREST: return GL_NEAREST_MIPMAP_NEAREST;
+ case NEAREST_MIPMAP_LINEAR: return GL_NEAREST_MIPMAP_LINEAR;
+ case LINEAR_MIPMAP_NEAREST: return GL_LINEAR_MIPMAP_NEAREST;
+ case LINEAR_MIPMAP_LINEAR: return GL_LINEAR_MIPMAP_LINEAR;
+ default: throw invalid_argument("get_gl_filter");
+ }
+}
+
+unsigned get_gl_wrap(TextureWrap wrap)
+{
+ switch(wrap)
+ {
+ case REPEAT: return GL_REPEAT;
+ case CLAMP_TO_EDGE: return GL_CLAMP_TO_EDGE;
+ case CLAMP_TO_BORDER: return GL_CLAMP_TO_BORDER;
+ case MIRRORED_REPEAT: return GL_MIRRORED_REPEAT;
+ default: throw invalid_argument("get_gl_wrap");
+ }
+}
+
void operator>>(const LexicalConverter &c, TextureFilter &tf)
{
if(c.get()=="NEAREST")