]> git.tdb.fi Git - libs/gl.git/commitdiff
Support specifying elements in PrimitiveBuilder
authorMikko Rasa <tdb@tdb.fi>
Mon, 24 Mar 2008 00:10:57 +0000 (00:10 +0000)
committerMikko Rasa <tdb@tdb.fi>
Mon, 24 Mar 2008 00:10:57 +0000 (00:10 +0000)
Add use_textures flag to ObjectPass
Add type indicator to uniform* statements of ProgramData

source/immediate.cpp
source/immediate.h
source/meshbuilder.cpp
source/meshbuilder.h
source/object.cpp
source/objectpass.cpp
source/objectpass.h
source/primitivebuilder.cpp
source/primitivebuilder.h
source/programdata.cpp
source/programdata.h

index 8e761f4329c4c5cec8921d62753849fb5ff98e2d..8b62d2c4cc9cb6c3cee1d8b6f42a23d719490f95 100644 (file)
@@ -18,9 +18,15 @@ Immediate::Immediate(VertexFormat f):
 void Immediate::end_()
 {
        array.apply();
-       glDrawArrays(type, 0, array.size());
+       glDrawElements(type, indices.size(), UNSIGNED_INT, &indices[0]);
 
        array.clear();
+       indices.clear();
+}
+
+void Immediate::element_(unsigned i)
+{
+       indices.push_back(i);
 }
 
 } // namespace GL
index 7e99272bb19e7b0d925b69f62a05b09c979bf8c4..c4d8aca5abb0bf83bc97f216c60a59e2d6af6798 100644 (file)
@@ -24,12 +24,14 @@ class Immediate: public PrimitiveBuilder
 {
 private:
        VertexArray array;
+       std::vector<unsigned> indices;
 
 public:
        Immediate(VertexFormat);
 private:
        virtual void begin_() { }
        virtual void end_();
+       virtual void element_(unsigned);
 };
 
 } // namespace GL
index cd3be666780285da52c0adfff0e69cd1b0833319..025bced159fc999c748e244efdb1a87df12fd3f3 100644 (file)
@@ -14,21 +14,24 @@ namespace GL {
 MeshBuilder::MeshBuilder(Mesh &m):
        PrimitiveBuilder(m.vertices),
        mesh(m),
-       first(0)
+       batch(0)
 { }
 
 void MeshBuilder::begin_()
 {
-       first=array.size();
+       batch=new Batch(type);
 }
 
 void MeshBuilder::end_()
 {
-       Batch batch(type);
-       unsigned last=array.size();
-       for(unsigned i=first; i<last; ++i)
-               batch.append(i);
-       mesh.add_batch(batch);
+       mesh.add_batch(*batch);
+       delete batch;
+       batch=0;
+}
+
+void MeshBuilder::element_(unsigned i)
+{
+       batch->append(i);
 }
 
 } // namespace GL
index dbeb0f52659c52eea077cf5ea8e0d574eb05a7d1..c8354b9e0d3f3f5b6dd5fdeb3f7d77f7d3cdf989 100644 (file)
@@ -13,19 +13,21 @@ Distributed under the LGPL
 namespace Msp {
 namespace GL {
 
+class Batch;
 class Mesh;
 
 class MeshBuilder: public PrimitiveBuilder
 {
 private:
        Mesh  &mesh;
-       unsigned first;
+       Batch *batch;
 
 public:
        MeshBuilder(Mesh &);
 private:
        virtual void begin_();
        virtual void end_();
+       virtual void element_(unsigned);
 };
 
 } // namespace GL
index 56b2648203992a8ad10ea55725dbfd1f75788d4d..f710145a08cb23913aa6db794ca878bb2b6649ef 100644 (file)
@@ -79,7 +79,7 @@ void Object::setup_render(const ObjectPass &pass) const
                        textures[i]->bind();
                }
        }
-       else if(main_texture)
+       else if(main_texture && pass.use_textures)
                main_texture->bind();
 
        if(material)
index 153186d8388583b8778621567097f87353aec582..92864b45a39f3f26055f1b4af1c7cc6651051299 100644 (file)
@@ -29,6 +29,7 @@ ObjectPass::Loader::Loader(ObjectPass &p, Collection &c):
        coll(c)
 {
        add("shader", &Loader::shader);
+       add("use_textures", &ObjectPass::use_textures);
 }
 
 void ObjectPass::Loader::shader(const string &n)
index 59a1dfb47d9ae757d269a11f5fb1a213e6f9f7b0..e8190fa7f7c98e4cf13044b08fb446f750ec6d98 100644 (file)
@@ -37,6 +37,7 @@ struct ObjectPass
 
        Program *shprog;
        ProgramData *shdata;
+       bool use_textures;
 
        ObjectPass();
        ~ObjectPass();
index e461cf211bf77f2fe79b7f25b67a579c2d99fca3..92b2cb0eb0b76ef97c73875bd00f14651409c3b8 100644 (file)
@@ -38,6 +38,15 @@ void PrimitiveBuilder::end()
        end_();
 }
 
+void PrimitiveBuilder::element(unsigned i)
+{
+       if(!in_batch)
+               throw InvalidState("Element specification not between begin() and end()");
+       if(i>=array.size())
+               throw InvalidParameterValue("Element index out of range");
+       element_(i);
+}
+
 PrimitiveType PrimitiveBuilder::get_type() const
 {
        if(!in_batch)
@@ -47,13 +56,13 @@ PrimitiveType PrimitiveBuilder::get_type() const
 
 void PrimitiveBuilder::vertex_(float x, float y, float z, float w)
 {
-       if(!in_batch)
-               throw InvalidState("Vertex specification not between begin() and end()");
-
        builder->texcoord(ts, tt, tr,tq);
        builder->color(cr, cg, cb, ca);
        builder->normal(nx, ny, nz);
        builder->vertex(x, y, z, w);
+
+       if(in_batch)
+               element_(array.size()-1);
 }
 
 } // namespace GL
index cfe0a02c8bbea18cf04ba114d8999c3514f70009..ee8a8477c0cb9fac49e673502e067fd936615948 100644 (file)
@@ -35,11 +35,13 @@ protected:
 public:
        void begin(PrimitiveType);
        void end();
+       void element(unsigned);
        PrimitiveType get_type() const;
 protected:
        virtual void vertex_(float, float, float, float);
        virtual void begin_() =0;
        virtual void end_() =0;
+       virtual void element_(unsigned) =0;
 };
 
 } // namespace GL
index f627f2f1039c7fbefb12d198b5937217d3ca7108..2a8b5970c86edfd3054d4931946dbb40c5bf7746 100644 (file)
@@ -95,28 +95,34 @@ ProgramData::Loader::Loader(ProgramData &pd, Program &pr):
        pdata(pd),
        prog(pr)
 {
-       add("uniform1", &Loader::uniform1);
-       add("uniform2", &Loader::uniform2);
-       add("uniform3", &Loader::uniform3);
-       add("uniform4", &Loader::uniform4);
+       add("uniform1i", &Loader::uniform1i);
+       add("uniform1f", &Loader::uniform1f);
+       add("uniform2f", &Loader::uniform2f);
+       add("uniform3f", &Loader::uniform3f);
+       add("uniform4f", &Loader::uniform4f);
 }
 
-void ProgramData::Loader::uniform1(const string &n, float v)
+void ProgramData::Loader::uniform1i(const string &n, int v)
 {
        pdata.uniform(prog.get_uniform_location(n), v);
 }
 
-void ProgramData::Loader::uniform2(const string &n, float v0, float v1)
+void ProgramData::Loader::uniform1f(const string &n, float v)
+{
+       pdata.uniform(prog.get_uniform_location(n), v);
+}
+
+void ProgramData::Loader::uniform2f(const string &n, float v0, float v1)
 {
        pdata.uniform(prog.get_uniform_location(n), v0, v1);
 }
 
-void ProgramData::Loader::uniform3(const string &n, float v0, float v1, float v2)
+void ProgramData::Loader::uniform3f(const string &n, float v0, float v1, float v2)
 {
        pdata.uniform(prog.get_uniform_location(n), v0, v1, v2);
 }
 
-void ProgramData::Loader::uniform4(const string &n, float v0, float v1, float v2, float v3)
+void ProgramData::Loader::uniform4f(const string &n, float v0, float v1, float v2, float v3)
 {
        pdata.uniform(prog.get_uniform_location(n), v0, v1, v2, v3);
 }
index 986bd7b1f444cda423f878557efc3a4bb907e268..4d7938bf1dc7850bd4021f81cf21bdf4df19d1ac 100644 (file)
@@ -32,10 +32,11 @@ public:
        public:
                Loader(ProgramData &, Program &);
        private:
-               void uniform1(const std::string &, float);
-               void uniform2(const std::string &, float, float);
-               void uniform3(const std::string &, float, float, float);
-               void uniform4(const std::string &, float, float, float, float);
+               void uniform1i(const std::string &, int);
+               void uniform1f(const std::string &, float);
+               void uniform2f(const std::string &, float, float);
+               void uniform3f(const std::string &, float, float, float);
+               void uniform4f(const std::string &, float, float, float, float);
        };
 
 private: