]> git.tdb.fi Git - libs/gl.git/commitdiff
Add class Renderable
authorMikko Rasa <tdb@tdb.fi>
Sun, 4 Nov 2007 18:05:19 +0000 (18:05 +0000)
committerMikko Rasa <tdb@tdb.fi>
Sun, 4 Nov 2007 18:05:19 +0000 (18:05 +0000)
Inherit Object and ObjectInstance from Renderable
Add class Scene
Include GL/gl.h in renderable.h

source/framebuffer.h
source/object.cpp
source/object.h
source/objectinstance.cpp
source/objectinstance.h
source/renderable.h [new file with mode: 0644]
source/scene.cpp [new file with mode: 0644]
source/scene.h [new file with mode: 0644]

index 0dd8f5d79a5ab14c644e795350102a9dca980fff..8563d2f98418d0f315720a9e4b734a3dc6c58817 100644 (file)
@@ -8,6 +8,7 @@ Distributed under the LGPL
 #ifndef MSP_GL_FRAMEBUFFER_H_
 #define MSP_GL_FRAMEBUFFER_H_
 
+#include <GL/gl.h>
 #include "types.h"
 
 namespace Msp {
index e406755c1e81e2e1d27e5f77658c19d5034c6b21..dba9774e7531fa0f7549f56341ed08d19646a6be 100644 (file)
@@ -48,14 +48,24 @@ const ObjectPass &Object::get_pass(const string &pn) const
        return i->second;
 }
 
-void Object::render(const ObjectInstance *inst) const
+void Object::render() const
 {
-       render(*normal_pass, inst);
+       render(*normal_pass, 0);
 }
 
-void Object::render(const string &pn, const ObjectInstance *inst) const
+void Object::render(const ObjectInstance &inst) const
 {
-       render(get_pass(pn), inst);
+       render(*normal_pass, &inst);
+}
+
+void Object::render(const string &pn) const
+{
+       render(get_pass(pn), 0);
+}
+
+void Object::render(const string &pn, const ObjectInstance &inst) const
+{
+       render(get_pass(pn), &inst);
 }
 
 void Object::render(const list<const ObjectInstance *> &insts) const
index e38afb5c4c1b16fb92946785143bed0fb4824a6d..f0940652992692bfce462258cf0d4a72e58b48ec 100644 (file)
@@ -11,6 +11,7 @@ Distributed under the LGPL
 #include <vector>
 #include <msp/datafile/collection.h>
 #include "objectpass.h"
+#include "renderable.h"
 
 namespace Msp {
 namespace GL {
@@ -29,7 +30,7 @@ are optional.
 
 See also class ObjectInstance.
 */
-class Object
+class Object: public Renderable
 {
 private:
        std::vector<Mesh *> meshes;
@@ -68,15 +69,17 @@ public:
        Object();
        ~Object();
 
-       bool has_pass(const std::string &) const;
+       virtual bool has_pass(const std::string &) const;
        const ObjectPass &get_pass(const std::string &) const;
 
        /**
        Renders the object.  If an ObjectInstance is provided, its hook functions
        are called.
        */
-       void render(const ObjectInstance * =0) const;
-       void render(const std::string &, const ObjectInstance *) const;
+       virtual void render() const;
+       virtual void render(const ObjectInstance &) const;
+       virtual void render(const std::string &) const;
+       virtual void render(const std::string &, const ObjectInstance &) const;
 
        /**
        Renders multiple instances of the object in one go.  This may be a
index 78042bd1a8182de436d6963bf4d7e4dc512381b9..10dae3926c05374d07df95e9cd58d7184eb23853 100644 (file)
@@ -9,6 +9,8 @@ Distributed under the LGPL
 #include "objectinstance.h"
 #include "programdata.h"
 
+using namespace std;
+
 namespace Msp {
 namespace GL {
 
@@ -16,14 +18,19 @@ ObjectInstance::ObjectInstance(const Object &obj):
        object(obj)
 { }
 
+bool ObjectInstance::has_pass(const string &pn) const
+{
+       return object.has_pass(pn);
+}
+
 void ObjectInstance::render() const
 {
-       object.render(this);
+       object.render(*this);
 }
 
-void ObjectInstance::render(const std::string &pn) const
+void ObjectInstance::render(const string &pn) const
 {
-       object.render(pn, this);
+       object.render(pn, *this);
 }
 
 } // namespace GL
index 151e316c9e2e91faaff22fa31337f9bc9fa3d1ea..459c2da3523b23ff84e2cd510e2cde05d0c5a154 100644 (file)
@@ -9,6 +9,7 @@ Distributed under the LGPL
 #define MSP_GL_OBJETCINSTANCE_H_
 
 #include <string>
+#include "renderable.h"
 
 namespace Msp {
 namespace GL {
@@ -23,7 +24,7 @@ Represents a single instance of an Object.  An application can derive another
 class from this and overload the hook functions to specify location and other
 instance-specific parameters for the rendered objects.
 */
-class ObjectInstance
+class ObjectInstance: public Renderable
 {
 protected:
        const Object &object;
@@ -33,8 +34,10 @@ public:
 
        const Object &get_object() const { return object; }
 
-       void render() const;
-       void render(const std::string &) const;
+       virtual bool has_pass(const std::string &) const;
+
+       virtual void render() const;
+       virtual void render(const std::string &) const;
 
        /**
        Hook function, called from Object just before rendering the mesh.
diff --git a/source/renderable.h b/source/renderable.h
new file mode 100644 (file)
index 0000000..b9b6b08
--- /dev/null
@@ -0,0 +1,28 @@
+/* $Id$
+
+This file is part of libmspgl
+Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#ifndef MSP_GL_RENDERABLE_H_
+#define MSP_GL_RENDERABLE_H_
+
+#include <string>
+
+namespace Msp {
+namespace GL {
+
+class Renderable
+{
+public:
+       virtual bool has_pass(const std::string &pn) const =0;
+
+       virtual void render() const =0;
+       virtual void render(const std::string &pn) const =0;
+};
+
+} // namespace Msp
+} // namespace GL
+
+#endif
diff --git a/source/scene.cpp b/source/scene.cpp
new file mode 100644 (file)
index 0000000..2ef2ea7
--- /dev/null
@@ -0,0 +1,39 @@
+/* $Id$
+
+This file is part of libmspgl
+Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#include "scene.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+void Scene::add(const Renderable &r)
+{
+       renderables.insert(&r);
+}
+
+void Scene::remove(const Renderable &r)
+{
+       renderables.erase(&r);
+}
+
+void Scene::render() const
+{
+       for(set<const Renderable *>::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
+               (*i)->render();
+}
+
+void Scene::render(const string &pn) const
+{
+       for(set<const Renderable *>::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
+               if((*i)->has_pass(pn))
+                       (*i)->render(pn);
+}
+
+} // namespace GL
+} // namespace Msp
diff --git a/source/scene.h b/source/scene.h
new file mode 100644 (file)
index 0000000..f4e1281
--- /dev/null
@@ -0,0 +1,34 @@
+/* $Id$
+
+This file is part of libmspgl
+Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#ifndef MSP_GL_SCENE_H_
+#define MSP_GL_SCENE_H_
+
+#include <set>
+#include "renderable.h"
+
+namespace Msp {
+namespace GL {
+
+class Scene: public Renderable
+{
+private:
+       std::set<const Renderable *> renderables;
+
+public:
+       void add(const Renderable &);
+       void remove(const Renderable &);
+
+       virtual bool has_pass(const std::string &) const { return true; }
+       virtual void render() const;
+       virtual void render(const std::string &) const;
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif