]> git.tdb.fi Git - libs/gl.git/blob - source/object.h
Use RefPtrs in Object
[libs/gl.git] / source / object.h
1 /* $Id$
2
3 This file is part of libmspgl
4 Copyright © 2007-2008, 2010  Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #ifndef MSP_GL_OBJECT_H_
9 #define MSP_GL_OBJECT_H_
10
11 #include <vector>
12 #include "bindable.h"
13 #include "renderable.h"
14 #include "renderpass.h"
15
16 namespace Msp {
17 namespace GL {
18
19 class Material;
20 class Mesh;
21 class ObjectInstance;
22 class Technique;
23 class Texture;
24
25 /**
26 Stores a Mesh together with a Technique to determine its appearance.
27
28 It is possible to use a single Object for rendering multiple identical or
29 similar objects.  See class ObjectInstance.
30 */
31 class Object: public Renderable
32 {
33 private:
34         std::vector<RefPtr<const Mesh> > meshes;
35         RefPtr<const Technique> technique;
36
37 public:
38         class Loader: public DataFile::CollectionObjectLoader<Object>
39         {
40         public:
41                 Loader(Object &);
42                 Loader(Object &, Collection &);
43         private:
44                 void init();
45
46         private:
47                 void mesh();
48                 void mesh(unsigned);
49                 void mesh(const std::string &);
50                 void mesh(unsigned, const std::string &);
51                 void technique();
52                 void technique(const std::string &);
53         };
54
55         Object();
56         ~Object();
57
58         void set_mesh(const Mesh *m) { set_mesh(0, m); }
59         void set_mesh(unsigned, const Mesh *);
60         void set_technique(const Technique *);
61         const Technique *get_technique() const { return technique.get(); }
62
63         /**
64         Renders the object.  A tag can be provided to render a non-default pass.
65         */
66         virtual void render(const Tag &tag = Tag()) const;
67
68         /**
69         Renders the object with an instance.  The instance's hook functions are
70         called before and after drawing the mesh.  A tag may also be given to render
71         a non-default pass.
72         */
73         virtual void render(const ObjectInstance &, const Tag &tag = Tag()) const;
74
75         /**
76         Renders multiple instances of the object in one go.  This may improve
77         performance, as the object-specific render setup only has to be done once.
78         Each instance's hook functions will be called before and after drawing the
79         mesh.
80         */
81         template<typename Iter>
82         void render(Iter begin, Iter end, const Tag &tag = Tag()) const
83         {
84                 const RenderPass *pass = get_pass(tag);
85                 if(!pass)
86                         return;
87
88                 Bind bind(pass);
89                 for(Iter i=begin; i!=end; ++i)
90                         render_instance(**i, tag);
91         }
92 private:
93         const RenderPass *get_pass(const Tag &) const;
94         void render_instance(const ObjectInstance &, const Tag &) const;
95 };
96
97 } // namespace GL
98 } // namespace Msp
99
100 #endif