#include "meshbuilder.h"
+#include "program.h"
#include "text.h"
#include "texture2d.h"
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),
{
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);
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(); }