From e8c54568b96b4fcfea07ef33d95e48dda778a0a8 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 15 Jul 2023 00:13:15 +0300 Subject: [PATCH] Retrieve sampler from technique in Text In some cases, like when using a pixelated retro font, it's important to use a specific sampler. --- source/render/text.cpp | 30 +++++++++++++++++++----------- source/render/text.h | 1 + 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/source/render/text.cpp b/source/render/text.cpp index 184865e1..3415ab30 100644 --- a/source/render/text.cpp +++ b/source/render/text.cpp @@ -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 diff --git a/source/render/text.h b/source/render/text.h index aa98cc96..d16d97e5 100644 --- a/source/render/text.h +++ b/source/render/text.h @@ -39,6 +39,7 @@ public: private: const Font &font; + const Sampler *sampler = nullptr; Mesh mesh; Object object; Tag texture_tag; -- 2.45.2