]> git.tdb.fi Git - libs/gl.git/commitdiff
Retrieve sampler from technique in Text
authorMikko Rasa <tdb@tdb.fi>
Fri, 14 Jul 2023 21:13:15 +0000 (00:13 +0300)
committerMikko Rasa <tdb@tdb.fi>
Fri, 14 Jul 2023 21:13:15 +0000 (00:13 +0300)
In some cases, like when using a pixelated retro font, it's important
to use a specific sampler.

source/render/text.cpp
source/render/text.h

index 184865e1a35e7042b63d4f1b3e6a62a8fc92114d..3415ab30cebd1175831b246f0a7ad29589447320 100644 (file)
@@ -24,18 +24,25 @@ void Text::set_technique(const Technique *tech, Tag tex_tag)
 {
        if(tech)
        {
-               if(!tex_tag.id && tech->has_method(Tag()))
-                       if(const Program *shprog = tech->get_method(Tag()).get_shader_program())
+               for(const auto &kvp: tech->get_methods())
+               {
+                       if(tex_tag.id)
                        {
-                               if(shprog->get_uniform_location(Tag("font_tex"))>=0)
-                                       tex_tag = "font_tex";
-                               else if(shprog->get_uniform_location(Tag("color_tex"))>=0)
-                                       tex_tag = "color_tex";
-                               else if(shprog->get_uniform_location(Tag("diffuse_map"))>=0)
-                                       tex_tag = "diffuse_map";
-                               else if(shprog->get_uniform_location(Tag("base_color_map"))>=0)
-                                       tex_tag = "base_color_map";
+                               if((sampler = kvp.second.get_sampler(tex_tag)))
+                                       break;
                        }
+                       else if(const Program *shprog = kvp.second.get_shader_program())
+                       {
+                               static const Tag possible_tags[] = { "font_tex", "color_tex", "diffuse_map", "base_color_map" };
+                               for(Tag t: possible_tags)
+                                       if(shprog->get_uniform_location(t)>=0)
+                                       {
+                                               tex_tag = t;
+                                               sampler = kvp.second.get_sampler(t);
+                                               break;
+                                       }
+                       }
+               }
 
                object.set_technique(tech);
                texture_tag = tex_tag;
@@ -44,6 +51,7 @@ void Text::set_technique(const Technique *tech, Tag tex_tag)
        {
                object.set_technique(0);
                texture_tag = Tag();
+               sampler = nullptr;
        }
 }
 
@@ -109,7 +117,7 @@ void Text::set_alignment(float h, float v)
 void Text::setup_render(Renderer &renderer, Tag tag) const
 {
        ObjectInstance::setup_render(renderer, tag);
-       renderer.set_texture(texture_tag, &font.get_texture());
+       renderer.set_texture(texture_tag, &font.get_texture(), sampler);
 }
 
 } // namespace GL
index aa98cc9670814e2e6e75c578d53aaf5088d4f467..d16d97e5b2be0e25e82ff07554f44fc992cf6d1f 100644 (file)
@@ -39,6 +39,7 @@ public:
 
 private:
        const Font &font;
+       const Sampler *sampler = nullptr;
        Mesh mesh;
        Object object;
        Tag texture_tag;