]> git.tdb.fi Git - libs/gl.git/blob - source/object.h
Allow copying of Uniforms and ProgramData
[libs/gl.git] / source / object.h
1 /* $Id$
2
3 This file is part of libmspgl
4 Copyright © 2007  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 "misc.h"
13 #include "objectpass.h"
14 #include "renderable.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<const Mesh *> meshes;
35         bool own_technique;
36         const Technique *technique;
37
38 public:
39         class Loader: public DataFile::CollectionObjectLoader<Object>
40         {
41         public:
42                 Loader(Object &, Collection &);
43
44         private:
45                 void lod_mesh(unsigned, const std::string &);
46                 void mesh(const std::string &);
47                 void technique();
48         };
49
50         Object();
51         ~Object();
52
53         const Technique *get_technique() const { return technique; }
54
55         /**
56         Renders the object.  A tag can be provided to render a non-default pass.
57         */
58         virtual void render(const Tag &tag=Tag()) const;
59
60         /**
61         Renders the object with an instance.  The instance's hook functions are
62         called before and after drawing the mesh.  A tag may also be given to render
63         a non-default pass.
64         */
65         virtual void render(const ObjectInstance &, const Tag &tag=Tag()) const;
66
67         /**
68         Renders multiple instances of the object in one go.  This may improve
69         performance, as the object-specific render setup only has to be done once.
70         Each instance's hook functions will be called before and after drawing the
71         mesh.
72         */
73         template<typename Iter>
74         void render(Iter begin, Iter end, const Tag &tag=Tag()) const
75         {
76                 const RenderPass *pass=get_pass(tag);
77                 if(!pass)
78                         return;
79
80                 Bind bind(*pass);
81                 for(Iter i=begin; i!=end; ++i)
82                         render_instance(**i, tag);
83         }
84 private:
85         const RenderPass *get_pass(const Tag &) const;
86         void render_instance(const ObjectInstance &, const Tag &) const;
87 };
88
89 } // namespace GL
90 } // namespace Msp
91
92 #endif