X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fsampler.cpp;h=273f2bb712cf96a1acb0ee93f7afb6e0343f86c5;hb=96bbfddc653826ee9848c468c53bca024711a6c3;hp=3f853ea04126f1ac95ce2c164cc1ee1ff5229a2e;hpb=be2d4eb0b735500a50d20ee2d9979c9f17d79e3a;p=libs%2Fgl.git diff --git a/source/core/sampler.cpp b/source/core/sampler.cpp index 3f853ea0..273f2bb7 100644 --- a/source/core/sampler.cpp +++ b/source/core/sampler.cpp @@ -44,6 +44,7 @@ void Sampler::init() wrap_s = REPEAT; wrap_t = REPEAT; wrap_r = REPEAT; + border_color = Color(0.0f, 0.0f, 0.0f, 0.0f); compare = false; cmp_func = LEQUAL; dirty_params = 0; @@ -84,6 +85,8 @@ void Sampler::update_parameter(int mask) const set_parameter_i(GL_TEXTURE_WRAP_T, wrap_t); if(mask&WRAP_R) set_parameter_i(GL_TEXTURE_WRAP_R, wrap_r); + if(mask&BORDER_COLOR) + set_parameter_fv(GL_TEXTURE_BORDER_COLOR, &border_color.r); if(mask&COMPARE) { set_parameter_i(GL_TEXTURE_COMPARE_MODE, (compare ? GL_COMPARE_R_TO_TEXTURE : GL_NONE)); @@ -112,6 +115,16 @@ void Sampler::set_parameter_f(unsigned param, float value) const glTexParameterf(owner->get_target(), param, value); } +void Sampler::set_parameter_fv(unsigned param, const float *value) const +{ + if(id) + glSamplerParameterfv(id, param, value); + else if(ARB_direct_state_access) + glTextureParameterfv(owner->get_id(), param, value); + else + glTexParameterfv(owner->get_target(), param, value); +} + void Sampler::set_min_filter(TextureFilter f) { min_filter = f; @@ -168,6 +181,12 @@ void Sampler::set_wrap_r(TextureWrap w) update_parameter(WRAP_R); } +void Sampler::set_border_color(const Color &c) +{ + border_color = c; + update_parameter(BORDER_COLOR); +} + void Sampler::disable_compare() { compare = false; @@ -240,6 +259,7 @@ void Sampler::unload() Sampler::Loader::Loader(Sampler &s): DataFile::ObjectLoader(s) { + add("border_color", &Loader::border_color); add("compare", &Loader::compare); add("filter", &Loader::filter); add("mag_filter", &Loader::mag_filter); @@ -251,6 +271,11 @@ Sampler::Loader::Loader(Sampler &s): add("wrap_t", &Loader::wrap_t); } +void Sampler::Loader::border_color(float r, float g, float b, float a) +{ + obj.set_border_color(Color(r, g, b, a)); +} + void Sampler::Loader::compare(Predicate c) { obj.set_compare(c); @@ -327,6 +352,8 @@ void operator>>(const LexicalConverter &c, TextureWrap &tw) tw = REPEAT; else if(c.get()=="CLAMP_TO_EDGE") tw = CLAMP_TO_EDGE; + else if(c.get()=="CLAMP_TO_BORDER") + tw = CLAMP_TO_BORDER; else if(c.get()=="MIRRORED_REPEAT") tw = MIRRORED_REPEAT; else