-Sampler::Sampler(const Texture &tex):
- id(0),
- owner(&tex)
-{
- if(this!=&tex.get_default_sampler())
- throw invalid_argument("Sampler::Sampler");
-
- init();
-}
-
-void Sampler::init()
-{
- min_filter = NEAREST_MIPMAP_LINEAR;
- mag_filter = LINEAR;
- max_anisotropy = 1.0f;
- wrap_s = REPEAT;
- wrap_t = REPEAT;
- wrap_r = REPEAT;
- compare = false;
- cmp_func = LEQUAL;
- dirty_params = 0;
-}
-
-void Sampler::update_parameter(int mask) const
-{
- if(owner)
- {
- if(!owner->get_id())
- {
- dirty_params |= mask;
- return;
- }
-
- if(!ARB_direct_state_access && TexUnit::current().get_texture()!=owner)
- {
- TexUnit *unit = TexUnit::find_unit(owner);
- if(!unit)
- {
- dirty_params |= mask;
- return;
- }
-
- unit->bind();
- }
- }
-
- if(mask&MIN_FILTER)
- set_parameter_i(GL_TEXTURE_MIN_FILTER, min_filter);
- if(mask&MAG_FILTER)
- set_parameter_i(GL_TEXTURE_MAG_FILTER, mag_filter);
- if(mask&MAX_ANISOTROPY)
- set_parameter_f(GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy);
- if(mask&WRAP_S)
- set_parameter_i(GL_TEXTURE_WRAP_S, wrap_s);
- if(mask&WRAP_T)
- set_parameter_i(GL_TEXTURE_WRAP_T, wrap_t);
- if(mask&WRAP_R)
- set_parameter_i(GL_TEXTURE_WRAP_R, wrap_r);
- if(mask&COMPARE)
+void Sampler::update() const
+{
+ 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(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(dirty_params&COMPARE)