X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frender%2Fobject.h;h=dc92326730c4f25a8abf8ec7d479a0d7966ca7f4;hp=ac62c702b4e1e2f9c6033c40e95e2db812b84735;hb=HEAD;hpb=f19366d32cc29287a2730cfba90893e407754081 diff --git a/source/render/object.h b/source/render/object.h index ac62c702..dc923267 100644 --- a/source/render/object.h +++ b/source/render/object.h @@ -3,7 +3,7 @@ #include #include "renderable.h" -#include "renderpass.h" +#include "rendermethod.h" #include "resourceobserver.h" namespace Msp { @@ -14,16 +14,19 @@ class ObjectInstance; class Technique; /** -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 { @@ -37,7 +40,7 @@ private: LevelOfDetail &lod; public: - LodLoader(Object &, unsigned, Collection *); + LodLoader(Object &, unsigned, Collection &); private: void mesh(const std::string &); @@ -50,10 +53,8 @@ public: class Loader: public LodLoader { public: - Loader(Object &o): Loader(o, 0) { } - Loader(Object &o, Collection &c): Loader(o, &c) { } + Loader(Object &, Collection &); private: - Loader(Object &, Collection *); virtual void finish(); void bounding_sphere_hint(float, float, float, float); @@ -69,24 +70,28 @@ private: std::vector lods; Geometry::BoundingSphere bounding_sphere; - bool lod0_watched; + bool lod0_watched = false; 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: @@ -97,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; @@ -118,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 &);