]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/object.h
Check the flat qualifier from the correct member
[libs/gl.git] / source / render / object.h
index b7b549536f4b92bd97c0ee9506e8ab3c48d42111..dc92326730c4f25a8abf8ec7d479a0d7966ca7f4 100644 (file)
@@ -3,29 +3,30 @@
 
 #include <vector>
 #include "renderable.h"
-#include "renderpass.h"
+#include "rendermethod.h"
 #include "resourceobserver.h"
 
 namespace Msp {
 namespace GL {
 
-class Material;
 class Mesh;
 class ObjectInstance;
 class Technique;
-class Texture;
 
 /**
-Combines a Mesh with a Technique to give it an appearance.  The Technique will
-define which render passes the Object supports.
+Combines a Mesh with a Technique for a complete model.
 
-In many cases, it's desirable to include multiple copies of an Object in a
-Scene, with different model matrices.  ObjectInstances can be used to alter the
-rendering of an object on a per-instance basis.
+An object does not have a model matrix and will be rendered at origin if used
+by itself.  The ObjectInstance class provides a way to position objects in a
+scene and customize them in other ways.
 
-Objects can have multiple levels of detail.  The most detailed level has index
-0, with increasing indices having less detail.  When rendering an instance, the
-instance's get_level_of_detail method is called to determine which LoD to use.
+Objects can have multiple levels of detail, with different resources.  The most
+detailed level has index 0, with increasing indices having less detail.  When
+rendering an instance, the instance's get_level_of_detail method is called to
+determine which LoD to use.
+
+An Object can be rendered with any tag its Technique supports.  Unknown tags
+are silently ignored.
 */
 class Object: public Renderable, private ResourceObserver
 {
@@ -39,7 +40,7 @@ private:
                LevelOfDetail &lod;
 
        public:
-               LodLoader(Object &, unsigned, Collection *);
+               LodLoader(Object &, unsigned, Collection &);
 
        private:
                void mesh(const std::string &);
@@ -52,10 +53,8 @@ public:
        class Loader: public LodLoader
        {
        public:
-               Loader(Object &);
                Loader(Object &, Collection &);
        private:
-               void init();
                virtual void finish();
 
                void bounding_sphere_hint(float, float, float, float);
@@ -71,24 +70,28 @@ private:
 
        std::vector<LevelOfDetail> lods;
        Geometry::BoundingSphere<float, 3> bounding_sphere;
-       bool lod0_watched;
+       bool lod0_watched = false;
 
-       static Matrix identity_matrix;
+       static const Matrix identity_matrix;
 
 public:
        Object();
        Object(const Mesh *, const Technique *);
+       Object(const Object &);
+       Object(Object &&);
        ~Object();
 
 private:
        LevelOfDetail &get_lod(unsigned, const char *);
+       void watch_lod0();
 
 public:
        /** Sets the mesh for the highest level of detail (index 0). */
        void set_mesh(const Mesh *m) { set_mesh(0, m); }
 
-       /** Sets the mesh for a given level of detail.  Previous LoDs must have been
-       defined. */
+       /** Sets the mesh for a specific level of detail.  LoDs must be defined in
+       order, without gaps.  If this call creates a new LoD, technique is copied
+       from the previous one. */
        void set_mesh(unsigned, const Mesh *);
 
 private:
@@ -99,8 +102,9 @@ public:
        /** Sets the technique for the highest level of detail (index 0). */
        void set_technique(const Technique *t) { set_technique(0, t); }
 
-       /** Sets the technique for a given level of detail.  Previous LoDs must have
-       been defined. */
+       /** Sets the technique for a specific level of detail.  LoDs must be defined
+       in order, without gaps.  If this call creates a new LoD, mesh is copied from
+       the previous one. */
        void set_technique(unsigned, const Technique *);
 
        const Technique *get_technique(unsigned = 0) const;
@@ -120,7 +124,7 @@ protected:
        virtual void finish_render(Renderer &, Tag) const { }
 
 private:
-       const RenderPass *get_pass(Tag, unsigned) const;
+       const RenderMethod *get_method(Tag, unsigned) const;
 
        virtual void resource_loaded(Resource &);
        virtual void resource_removed(Resource &);