]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/text.cpp
Check the flat qualifier from the correct member
[libs/gl.git] / source / render / text.cpp
index 3b2380c4200cf74cd1d4080ddd35b14d76042ca9..a51d2cf16778a82bc3778c47203a618f39b5cc91 100644 (file)
@@ -1,5 +1,7 @@
 #include "meshbuilder.h"
 #include "program.h"
+#include "renderer.h"
+#include "technique.h"
 #include "text.h"
 #include "texture2d.h"
 
@@ -8,25 +10,22 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-Text::Text(const Font &f, const Technique *tech, const string &tex_slot):
+Text::Text(const Font &f, const Technique *tech, Tag tex_slot):
+       ObjectInstance(object),
        font(f),
-       mesh((TEXCOORD2, VERTEX2)),
-       horz_align(0.0f),
-       vert_offset(0.0f),
-       width(0.0f)
+       mesh((TEXCOORD2, VERTEX2))
 {
        object.set_mesh(&mesh);
        if(tech)
                set_technique(tech, tex_slot);
 }
 
-void Text::set_technique(const Technique *tech, const string &ts)
+void Text::set_technique(const Technique *tech, Tag tex_slot)
 {
        if(tech)
        {
-               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(!tex_slot.id && tech->has_method(Tag()))
+                       if(const Program *shprog = tech->get_method(Tag()).get_shader_program())
                        {
                                if(shprog->get_uniform_location(Tag("font_tex"))>=0)
                                        tex_slot = "font_tex";
@@ -38,17 +37,14 @@ void Text::set_technique(const Technique *tech, const string &ts)
                                        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);
+               object.set_technique(tech);
+               texture_slot = tex_slot;
        }
        else
+       {
                object.set_technique(0);
+               texture_slot = Tag();
+       }
 }
 
 void Text::set_text(const string &text, StringCodec::Decoder &dec)
@@ -104,15 +100,16 @@ void Text::set_alignment(float h, float v)
        unsigned n_vertices = mesh.get_n_vertices();
        for(unsigned i=0; i<n_vertices; ++i)
        {
-               float *pos = mesh.modify_vertex(i)+pos_offset;
+               float *pos = reinterpret_cast<float *>(mesh.modify_vertex(i)+pos_offset);
                pos[0] += horz_adjust;
                pos[1] += vert_adjust;
        }
 }
 
-void Text::render(Renderer &renderer, Tag tag) const
+void Text::setup_render(Renderer &renderer, Tag tag) const
 {
-       object.render(renderer, tag);
+       ObjectInstance::setup_render(renderer, tag);
+       renderer.set_texture(texture_slot, &font.get_texture());
 }
 
 } // namespace GL