]> git.tdb.fi Git - libs/gl.git/commitdiff
Add class MeshBuilder
authorMikko Rasa <tdb@tdb.fi>
Tue, 26 Feb 2008 10:28:32 +0000 (10:28 +0000)
committerMikko Rasa <tdb@tdb.fi>
Tue, 26 Feb 2008 10:28:32 +0000 (10:28 +0000)
Enable drawing text with a custom PrimitiveBuilder (possibly into a mesh)
Refactor VertexArray and VertexArrayBuilder so that the latter can be created in stack
Use the DataType enum in Texture[23]D

12 files changed:
source/font.cpp
source/font.h
source/mesh.cpp
source/mesh.h
source/texture2d.cpp
source/texture2d.h
source/texture3d.cpp
source/texture3d.h
source/vertexarray.cpp
source/vertexarray.h
source/vertexarraybuilder.cpp
source/vertexarraybuilder.h

index 7d9b306b87486f5590e6acd3f1d75600c707902b..766f011a97dc55708b3fb11da395342facfb6a92 100644 (file)
@@ -7,6 +7,7 @@ Distributed under the LGPL
 
 #include "gl.h"
 #include "font.h"
+#include "immediate.h"
 #include "primitivetype.h"
 #include "texture2d.h"
 
@@ -27,6 +28,13 @@ void Font::set_texture(const Texture2D &t)
        tex=&t;
 }
 
+const Texture2D &Font::get_texture() const
+{
+       if(!tex)
+               throw InvalidState("No texture");
+       return *tex;
+}
+
 void Font::add_glyph(unsigned code, float x1, float y1, float x2, float y2, float w, float h, float ox, float oy, float adv)
 {
        Glyph glyph;
@@ -55,26 +63,32 @@ float Font::get_string_width(const string &str, Codecs::Decoder &dec) const
 
 void Font::draw_string(const string &str, Codecs::Decoder &dec) const
 {
+       Immediate imm((TEXCOORD2, VERTEX2));
+       draw_string(str, dec, imm);
+}
+
+void Font::draw_string(const string &str, Codecs::Decoder &dec, PrimitiveBuilder &pbuilder) const
+{
+       if(!tex)
+               throw InvalidState("No texture");
+
        tex->bind();
 
-       VertexArray va((TEXCOORD2, VERTEX2));
-       va.reserve(str.size()*4);
-       RefPtr<VertexArrayBuilder> vab=va.modify();
        float x=0;
        unsigned count=0;
+
+       pbuilder.begin(QUADS);
        for(string::const_iterator i=str.begin(); i!=str.end();)
        {
                GlyphMap::const_iterator j=glyphs.find(dec.decode_char(str, i));
                if(j==glyphs.end())
                        continue;
 
-               create_glyph_vertices(j->second, *vab, x);
+               create_glyph_vertices(j->second, pbuilder, x);
                x+=j->second.advance;
                count+=4;
        }
-       vab=0;
-       va.apply();
-       glDrawArrays(QUADS, 0, count);
+       pbuilder.end();
 }
 
 void Font::create_glyph_vertices(const Glyph &glyph, VertexBuilder &vbuilder, float x) const
index f647dbbdef1a07a92bcb75e8373822e028cf1316..b48c6445bb53a6d4136cd1d3c2b040edbf913c40 100644 (file)
@@ -17,6 +17,7 @@ Distributed under the LGPL
 namespace Msp {
 namespace GL {
 
+class PrimitiveBuilder;
 class Texture2D;
 
 class Font
@@ -44,6 +45,7 @@ public:
        Font();
 
        void  set_texture(const Texture2D &);
+       const Texture2D &get_texture() const;
        void  add_glyph(unsigned, float, float, float, float, float, float, float, float, float);
        float get_default_size() const { return default_size; }
        float get_ascent() const { return ascent; }
@@ -51,7 +53,7 @@ public:
        float get_string_width(const std::string &, Codecs::Decoder &) const;
        void  draw_glyph(unsigned);
        void  draw_string(const std::string &, Codecs::Decoder &) const;
-       void  draw_multiline(const std::string &) const;
+       void  draw_string(const std::string &, Codecs::Decoder &, PrimitiveBuilder &) const;
 
        template<class C>
        float get_string_width(const std::string &str) const
@@ -73,6 +75,16 @@ public:
        void draw_string(const std::string &str) const
        { draw_string<Codecs::Utf8>(str); }
 
+       template<class C>
+       void draw_string(const std::string &str, PrimitiveBuilder &pb) const
+       {
+               typename C::Decoder dec;
+               draw_string(str, dec, pb);
+       }
+
+       void draw_string(const std::string &str, PrimitiveBuilder &pb) const
+       { return draw_string<Codecs::Utf8>(str, pb); }
+
 private:
        struct Glyph
        {
index 8d039977e0ff2532992adce536a9a73a20f2256f..cba1bf57fdbcd8737183c90d06fb1d9c7a511d51 100644 (file)
@@ -24,6 +24,11 @@ Mesh::Mesh(VertexFormat f):
        vertices.use_vertex_buffer();
 }
 
+RefPtr<MeshBuilder> Mesh::modify()
+{
+       return new MeshBuilder(*this);
+}
+
 void Mesh::add_batch(const Batch &b)
 {
        batches.push_back(b);
index 4af66a39e25555a7432d90439045f3ba3d8abb10..2a5ce47476a61807cccec7c4566ec5eb3ade322d 100644 (file)
@@ -10,6 +10,7 @@ Distributed under the LGPL
 
 #include <msp/datafile/loader.h>
 #include "batch.h"
+#include "meshbuilder.h"
 #include "vertexarray.h"
 
 namespace Msp {
@@ -17,6 +18,8 @@ namespace GL {
 
 class Mesh
 {
+       friend class MeshBuilder;
+
 public:
        class Loader: public DataFile::Loader
        {
@@ -29,16 +32,18 @@ public:
                void batch(PrimitiveType);
        };
 
+private:
+       VertexArray vertices;
+       std::list<Batch> batches;
+
+public:
        Mesh();
        Mesh(VertexFormat f);
-       RefPtr<VertexArrayBuilder> modify_vertices() { return vertices.modify(); }
-       void add_batch(const Batch &b);
+       RefPtr<MeshBuilder> modify();
        const VertexArray &get_vertices() const { return vertices; }
+       void add_batch(const Batch &b);
        const std::list<Batch> &get_batches() { return batches; }
        void draw() const;
-private:
-       VertexArray vertices;
-       std::list<Batch> batches;
 };
 
 } // namespace GL
index 8a93d031b6fd36a781ab5916e7019ba6036b0388..baee22eefc56b31f9fe41c44c53a888598c3cbba 100644 (file)
@@ -35,7 +35,7 @@ void Texture2D::storage(PixelFormat fmt, sizei wd, sizei ht, int brd)
        border=brd;
 }
 
-void Texture2D::image(int level, PixelFormat fmt, GLenum type, const void *data)
+void Texture2D::image(int level, PixelFormat fmt, DataType type, const void *data)
 {
        if(width==0)
                throw InvalidState("Texture storage has not been specified");
@@ -45,7 +45,7 @@ void Texture2D::image(int level, PixelFormat fmt, GLenum type, const void *data)
        glTexImage2D(target, level, ifmt, width, height, border, fmt, type, data);
 }
 
-void Texture2D::sub_image(int level, int x, int y, sizei wd, sizei ht, PixelFormat fmt, GLenum type, const void *data)
+void Texture2D::sub_image(int level, int x, int y, sizei wd, sizei ht, PixelFormat fmt, DataType type, const void *data)
 {
        if(width==0)
                throw InvalidState("Texture storage has not been specified");
@@ -73,7 +73,7 @@ void Texture2D::image(const Image &img)
        else if(w!=width || h!=height)
                throw IncompatibleData("Image does not match texture storage");
 
-       image(0, fmt, GL_UNSIGNED_BYTE, img.get_data());
+       image(0, fmt, UNSIGNED_BYTE, img.get_data());
 }
 
 
@@ -96,7 +96,7 @@ void Texture2D::Loader::image_data(const string &data)
 void Texture2D::Loader::raw_data(const string &data)
 {
        Texture2D &t2d=static_cast<Texture2D &>(tex);;
-       t2d.image(0, t2d.ifmt, GL_UNSIGNED_BYTE, data.data());
+       t2d.image(0, t2d.ifmt, UNSIGNED_BYTE, data.data());
 }
 
 void Texture2D::Loader::storage(PixelFormat fmt, unsigned w, unsigned h, unsigned b)
index 30eab26c47d648cd91bbc6ec7aab4c542ec7322e..13073a2d74ea98cade27a9212229a365137e7175 100644 (file)
@@ -54,13 +54,13 @@ public:
        this, and the image must have dimensions conforming to the specified
        storage.
        */
-       void image(int level, PixelFormat fmt, GLenum type, const void *data);
+       void image(int level, PixelFormat fmt, DataType type, const void *data);
 
        /**
        Uploads a sub-image into the texture.  Unlike full image upload, there are
        no constraints on the size of the sub-image.
        */
-       void sub_image(int level, int x, int y, sizei wd, sizei ht, PixelFormat fmt, GLenum type, const void *data);
+       void sub_image(int level, int x, int y, sizei wd, sizei ht, PixelFormat fmt, DataType type, const void *data);
 
        /**
        Loads an image from a file and uploads it to the texture.  If storage() has
index c38b44652d366c4c13fa9cd18bf3928de8da9080..fdf61cde4366600f2f37438a5824f25299b07f87 100644 (file)
@@ -41,10 +41,10 @@ void Texture3D::storage(PixelFormat f, sizei w, sizei h, sizei d, int b)
        ifmt=f;
        border=b;
 
-       image(0, ifmt, GL_UNSIGNED_BYTE, 0);
+       image(0, ifmt, UNSIGNED_BYTE, 0);
 }
 
-void Texture3D::image(int level, PixelFormat fmt, GLenum type, const void *data)
+void Texture3D::image(int level, PixelFormat fmt, DataType type, const void *data)
 {
        maybe_bind();
        glTexImage3D(target, level, ifmt, width, height, depth, border, fmt, type, data);
@@ -83,7 +83,7 @@ void Texture3D::load_image(const string &fn, int dp)
        else if(w!=width || h!=height || d!=depth)
                throw IncompatibleData("Image does not match texture storage");
 
-       image(0, fmt, GL_UNSIGNED_INT, img.get_data());
+       image(0, fmt, UNSIGNED_INT, img.get_data());
 }
 
 } // namespace GL
index b4260e88a0119930f3364c55d76d7399e88e8b76..ec3b57ba5f594942ab3ffa3f3cab5555a45f7e51 100644 (file)
@@ -27,8 +27,8 @@ private:
 public:
        Texture3D();
        void storage(PixelFormat, sizei, sizei, sizei, int);
-       void image(int, PixelFormat, GLenum, const void *);
-       void sub_image(int, int, int, sizei, sizei, sizei, PixelFormat, GLenum, const void *);
+       void image(int, PixelFormat, DataType, const void *);
+       void sub_image(int, int, int, sizei, sizei, sizei, PixelFormat, DataType, const void *);
        void load_image(const std::string &fn, int dp=-1);
        sizei get_width() const { return width; }
        sizei get_height() const { return height; }
index 38d490c05e8758511da2d0a92a2fc7ef5ca0e29d..c0ca8dca80f22b96f1efdfe8f9de6ccd9dc04ffd 100644 (file)
@@ -69,7 +69,7 @@ void VertexArray::reset(VertexFormat f)
 
 RefPtr<VertexArrayBuilder> VertexArray::modify()
 {
-       return new VertexArrayBuilder(*this, data);
+       return new VertexArrayBuilder(*this);
 }
 
 void VertexArray::apply() const
@@ -144,7 +144,7 @@ unsigned VertexArray::enabled_arrays=0;
 
 
 VertexArray::Loader::Loader(VertexArray &a):
-       VertexArrayBuilder(a, a.data)
+       VertexArrayBuilder(a)
 {
        add("vertex2",   static_cast<void (Loader::*)(float, float)>(&Loader::vertex));
        add("vertex3",   static_cast<void (Loader::*)(float, float, float)>(&Loader::vertex));
index b1b5fdee58baa672a6a45080e9909cc3ab0696b2..f0baf2d4a84fa8896b21c351149d9cd28612ee04 100644 (file)
@@ -23,6 +23,8 @@ class VertexBuffer;
 
 class VertexArray
 {
+       friend class VertexArrayBuilder;
+
 public:
        class Loader: public DataFile::Loader, public VertexArrayBuilder
        {
@@ -30,6 +32,16 @@ public:
                Loader(VertexArray &);
        };
 
+private:
+       VertexFormat format;
+       std::vector<float> data;
+       uint         stride;
+       VertexBuffer *vbuf;
+       bool         own_vbuf;
+
+       VertexArray(const VertexArray &);
+       VertexArray &operator=(const VertexArray &);
+public:
        VertexArray(VertexFormat);
        ~VertexArray();
 
@@ -45,14 +57,6 @@ public:
        void         apply() const;
        void         update_data();
 private:
-       VertexFormat format;
-       std::vector<float> data;
-       uint         stride;
-       VertexBuffer *vbuf;
-       bool         own_vbuf;
-
-       VertexArray(const VertexArray &);
-       VertexArray &operator=(const VertexArray &);
        void set_array(unsigned, unsigned, unsigned) const;
 
        static unsigned enabled_arrays;
index 5f469a985173b3f5f8cc0143ebe54406ee393703..32fa8392bda138029e5b1bae3d89163fbfea6d9c 100644 (file)
@@ -11,8 +11,8 @@ Distributed under the LGPL
 namespace Msp {
 namespace GL {
 
-VertexArrayBuilder::VertexArrayBuilder(VertexArray &a, std::vector<float> &d):
-       data(d),
+VertexArrayBuilder::VertexArrayBuilder(VertexArray &a):
+       data(a.data),
        array(a)
 { }
 
index 54357677d9fe671d99b63d6b68c9b2df1210c78f..0b8eef860c2b36952a2fc73d058e81de19d6701b 100644 (file)
@@ -22,7 +22,7 @@ class VertexArrayBuilder: public VertexBuilder
 public:
        std::vector<float> &data;
 
-       VertexArrayBuilder(VertexArray &, std::vector<float> &);
+       VertexArrayBuilder(VertexArray &);
        ~VertexArrayBuilder();
 
 private: