]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/sampler.cpp
Add CLAMP_TO_BORDER and border color to Sampler
[libs/gl.git] / source / core / sampler.cpp
index 3f853ea04126f1ac95ce2c164cc1ee1ff5229a2e..273f2bb712cf96a1acb0ee93f7afb6e0343f86c5 100644 (file)
@@ -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<Sampler>(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