]> git.tdb.fi Git - libs/gl.git/blob - source/object.h
Add the specializations for non-square matrix uniforms
[libs/gl.git] / source / object.h
1 #ifndef MSP_GL_OBJECT_H_
2 #define MSP_GL_OBJECT_H_
3
4 #include <vector>
5 #include "bindable.h"
6 #include "renderable.h"
7 #include "renderpass.h"
8 #include "resourceobserver.h"
9
10 namespace Msp {
11 namespace GL {
12
13 class Material;
14 class Mesh;
15 class ObjectInstance;
16 class Technique;
17 class Texture;
18
19 /**
20 Combines a Mesh with a Technique to give it an appearance.  The Technique will
21 define which render passes the Object supports.
22
23 In many cases, it's desirable to include multiple copies of an Object in a
24 Scene, with different model matrices.  ObjectInstances can be used to alter the
25 rendering of an object on a per-instance basis.
26
27 Objects can have multiple levels of detail.  The most detailed level has index
28 0, with increasing indices having less detail.  When rendering an instance, the
29 instance's get_level_of_detail method is called to determine which LoD to use.
30 */
31 class Object: public Renderable, private ResourceObserver
32 {
33 private:
34         struct LevelOfDetail;
35
36         class LodLoader: public DataFile::CollectionObjectLoader<Object>
37         {
38         private:
39                 unsigned index;
40                 LevelOfDetail &lod;
41
42         public:
43                 LodLoader(Object &, unsigned, Collection *);
44
45         private:
46                 void mesh(const std::string &);
47                 void mesh_inline();
48                 void technique(const std::string &);
49                 void technique_inline();
50         };
51
52 public:
53         class Loader: public LodLoader
54         {
55         public:
56                 Loader(Object &);
57                 Loader(Object &, Collection &);
58         private:
59                 void init();
60                 virtual void finish();
61
62                 void bounding_sphere_hint(float, float, float, float);
63                 void level_of_detail(unsigned);
64         };
65
66 private:
67         struct LevelOfDetail
68         {
69                 RefPtr<const Mesh> mesh;
70                 RefPtr<const Technique> technique;
71         };
72
73         std::vector<LevelOfDetail> lods;
74         Geometry::BoundingSphere<float, 3> bounding_sphere;
75         bool lod0_watched;
76
77         static Matrix identity_matrix;
78
79 public:
80         Object();
81         Object(const Mesh *, const Technique *);
82         ~Object();
83
84 private:
85         LevelOfDetail &get_lod(unsigned, const char *);
86
87 public:
88         /** Sets the mesh for the highest level of detail (index 0). */
89         void set_mesh(const Mesh *m) { set_mesh(0, m); }
90
91         /** Sets the mesh for a given level of detail.  Previous LoDs must have been
92         defined. */
93         void set_mesh(unsigned, const Mesh *);
94
95 private:
96         void update_bounding_sphere();
97 public:
98         const Mesh *get_mesh(unsigned = 0) const;
99
100         /** Sets the technique for the highest level of detail (index 0). */
101         void set_technique(const Technique *t) { set_technique(0, t); }
102
103         /** Sets the technique for a given level of detail.  Previous LoDs must have
104         been defined. */
105         void set_technique(unsigned, const Technique *);
106
107         const Technique *get_technique(unsigned = 0) const;
108         unsigned get_n_lods() const { return lods.size(); }
109
110         virtual const Matrix *get_matrix() const { return &identity_matrix; }
111         virtual const Geometry::BoundingSphere<float, 3> *get_bounding_sphere() const { return &bounding_sphere; }
112
113         virtual void render(Renderer &, const Tag & = Tag()) const;
114
115         /** Renders an instance of the object.  The instance's hook functions are
116         called before and after drawing the mesh. */
117         virtual void render(Renderer &, const ObjectInstance &, const Tag & = Tag()) const;
118
119 protected:
120         virtual void setup_render(Renderer &, const Tag &) const { }
121         virtual void finish_render(Renderer &, const Tag &) const { }
122
123 private:
124         const RenderPass *get_pass(const Tag &, unsigned) const;
125
126         virtual void resource_loaded(Resource &);
127         virtual void resource_removed(Resource &);
128 };
129
130 } // namespace GL
131 } // namespace Msp
132
133 #endif