]> git.tdb.fi Git - libs/gl.git/commitdiff
Make Text more flexible about which texture slot it uses
authorMikko Rasa <tdb@tdb.fi>
Sun, 28 Mar 2021 22:28:06 +0000 (01:28 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 29 Mar 2021 11:14:36 +0000 (14:14 +0300)
Different material types have different names for their textures so
using a fixed name here does not cut it anymore.

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

index b408bbe1780040cef29e600d2dab1b504b2d41b8..639beac142e1d66f85edfaa2bef2354074344f78 100644 (file)
@@ -1,4 +1,5 @@
 #include "meshbuilder.h"
+#include "program.h"
 #include "text.h"
 #include "texture2d.h"
 
@@ -7,7 +8,7 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-Text::Text(const Font &f, const Technique *tech):
+Text::Text(const Font &f, const Technique *tech, const string &tex_slot):
        font(f),
        mesh((TEXCOORD2, VERTEX2)),
        horz_align(0.0f),
@@ -16,16 +17,35 @@ Text::Text(const Font &f, const Technique *tech):
 {
        object.set_mesh(&mesh);
        if(tech)
-               set_technique(tech);
+               set_technique(tech, tex_slot);
 }
 
-void Text::set_technique(const Technique *tech)
+void Text::set_technique(const Technique *tech, const string &ts)
 {
        if(tech)
        {
-               technique = *tech;
-               technique.replace_texture("diffuse_map", font.get_texture());
-               object.set_technique(&technique);
+               const char *tex_slot = ts.c_str();
+               if(!*tex_slot && tech->has_pass(Tag()))
+                       if(const Program *shprog = tech->get_pass(Tag()).get_shader_program())
+                       {
+                               if(shprog->get_uniform_location("font_tex")>=0)
+                                       tex_slot = "font_tex";
+                               else if(shprog->get_uniform_location("color_tex")>=0)
+                                       tex_slot = "color_tex";
+                               else if(shprog->get_uniform_location("diffuse_map")>=0)
+                                       tex_slot = "diffuse_map";
+                               else if(shprog->get_uniform_location("base_color_map")>=0)
+                                       tex_slot = "base_color_map";
+                       }
+
+               if(tex_slot)
+               {
+                       technique = *tech;
+                       technique.replace_texture(tex_slot, font.get_texture());
+                       object.set_technique(&technique);
+               }
+               else
+                       object.set_technique(tech);
        }
        else
                object.set_technique(0);
index 40c9b8500097d1591f8be68b1ad6b3234870729b..cbcef957f8be9b0293f687732e6dfec72660a00c 100644 (file)
@@ -41,13 +41,14 @@ private:
        float width;
 
 public:
-       Text(const Font &, const Technique * = 0);
+       Text(const Font &, const Technique * = 0, const std::string & = std::string());
 
        const Mesh *get_mesh() const { return &mesh; }
 
-       /** Sets technique to render with.  It should have a texture slot named
-       "diffuse_map", which will be replaced with the font's texture. */
-       void set_technique(const Technique *);
+       /** Sets technique to render with, replacing the given texture slot with
+       the font texture.  If no texture slot is specified, heuristics are used to
+       choose a suitable one. */
+       void set_technique(const Technique *, const std::string & = std::string());
 
        const Technique *get_technique() const { return object.get_technique(); }