]> git.tdb.fi Git - libs/gl.git/commitdiff
Correct some #includes
authorMikko Rasa <tdb@tdb.fi>
Sat, 20 Feb 2010 19:06:37 +0000 (19:06 +0000)
committerMikko Rasa <tdb@tdb.fi>
Sat, 20 Feb 2010 19:06:37 +0000 (19:06 +0000)
Allow loaded objects to have an inline mesh

source/object.cpp
source/object.h
source/renderpass.cpp
source/technique.h

index edfe39e56008e580e85b292c7508395260de9e71..0a03b7a81a151da82ac76c41e04159e23fc4a963 100644 (file)
@@ -12,7 +12,6 @@ Distributed under the LGPL
 #include "mesh.h"
 #include "object.h"
 #include "objectinstance.h"
-#include "objectpass.h"
 #include "program.h"
 #include "programdata.h"
 #include "technique.h"
@@ -26,14 +25,17 @@ namespace GL {
 
 Object::Object():
        meshes(1),
-       own_technique(false),
-       technique(0)
+       technique(0),
+       own_mesh(false),
+       own_technique(false)
 { }
 
 Object::~Object()
 {
        if(own_technique)
                delete technique;
+       if(own_mesh)
+               delete meshes[0];
 }
 
 void Object::render(const Tag &tag) const
@@ -73,11 +75,25 @@ void Object::render_instance(const ObjectInstance &inst, const Tag &tag) const
 }
 
 
+Object::Loader::Loader(Object &o):
+       DataFile::CollectionObjectLoader<Object>(o, 0)
+{
+       init();
+}
+
 Object::Loader::Loader(Object &o, Collection &c):
        DataFile::CollectionObjectLoader<Object>(o, &c)
 {
+       init();
+}
+
+void Object::Loader::init()
+{
+       allow_pointer_reload=false;
+
        add("lod_mesh", &Loader::lod_mesh);
-       add("mesh",     &Loader::mesh);
+       add("mesh",     static_cast<void (Loader::*)()>(&Loader::mesh));
+       add("mesh",     static_cast<void (Loader::*)(const std::string &)>(&Loader::mesh));
        add("technique", &Loader::technique);
        add("technique", &Object::technique);
 }
@@ -88,8 +104,22 @@ void Object::Loader::lod_mesh(unsigned l, const string &n)
        obj.meshes[l]=get_collection().get<Mesh>(n);
 }
 
-void Object::Loader::mesh(const string &n)
+void Object::Loader::mesh()
+{
+       if(obj.meshes[0])
+               throw InvalidState("A mesh is already loaded");
+
+       RefPtr<Mesh> msh=new Mesh;
+       load_sub(*msh);
+       obj.meshes[0]=msh.release();
+       obj.own_mesh=true;
+}
+
+void Object::Loader::mesh(const std::string &n)
 {
+       if(obj.meshes[0])
+               throw InvalidState("A mesh is already loaded");
+
        obj.meshes[0]=get_collection().get<Mesh>(n);
 }
 
index d81c4ade6fa0453aadbd5fd27cb5a212204df36d..ad856323d732e6356d6708c123f688c1061b66c8 100644 (file)
@@ -10,8 +10,8 @@ Distributed under the LGPL
 
 #include <vector>
 #include "misc.h"
-#include "objectpass.h"
 #include "renderable.h"
+#include "renderpass.h"
 
 namespace Msp {
 namespace GL {
@@ -31,18 +31,23 @@ similar objects.  See class ObjectInstance.
 class Object: public Renderable
 {
 private:
-       std::vector<const Mesh *> meshes;
-       bool own_technique;
-       const Technique *technique;
+       std::vector<Mesh *> meshes;
+       Technique *technique;
+       bool own_mesh:1;
+       bool own_technique:1;
 
 public:
        class Loader: public DataFile::CollectionObjectLoader<Object>
        {
        public:
+               Loader(Object &);
                Loader(Object &, Collection &);
+       private:
+               void init();
 
        private:
                void lod_mesh(unsigned, const std::string &);
+               void mesh();
                void mesh(const std::string &);
                void technique();
        };
index d2fe668839816688fbab3d60414d2d092d15a7a8..9e5b71d91f6a7a778902400d58fb0f5316dc40b7 100644 (file)
@@ -36,19 +36,6 @@ RenderPass::RenderPass(const RenderPass &other):
        textures(other.textures)
 { }
 
-/*RenderPass &RenderPass::operator=(const RenderPass &other)
-{
-       shprog=other.shprog;
-       delete shdata;
-       shdata=(other.shdata ? new ProgramData(*other.shdata) : 0);
-       material=other.material;
-       use_material=other.use_material;
-       textures=other.textures;
-       use_textures=other.use_textures;
-
-       return *this;
-}*/
-
 RenderPass::~RenderPass()
 {
        delete shdata;
@@ -127,6 +114,8 @@ void RenderPass::unbind()
 RenderPass::Loader::Loader(RenderPass &p, Collection &c):
        DataFile::CollectionObjectLoader<RenderPass>(p, &c)
 {
+       allow_pointer_reload=false;
+
        add("shader",   &RenderPass::shprog);
        add("material", &Loader::material);
        add("material", &RenderPass::material);
@@ -151,7 +140,9 @@ void RenderPass::Loader::finish()
 
 void RenderPass::Loader::material()
 {
-       // XXX Potential memory management trouble with multiple material statements
+       if(obj.material)
+               throw InvalidState("A material is already loaded");
+
        RefPtr<Material> mat=new Material;
        load_sub(*mat);
        obj.material=mat.release();
index cc81b53120d3d9c408964902d8727d5bc0edd012..ce12b4f41f0e765c24705f5c94f5d0914c7661c4 100644 (file)
@@ -8,7 +8,7 @@ Distributed under the LGPL
 #ifndef TECHNIQUE_H_
 #define TECHNIQUE_H_
 
-#include "objectpass.h"
+#include "renderpass.h"
 
 namespace Msp {
 namespace GL {