X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Fobjectinstance.h;fp=source%2Frender%2Fobjectinstance.h;h=0ebef2fedf30012e8db4d8bf3b228693b3d1ecfc;hb=7aaec9a70b8d7733429bec043f8e33e02956f266;hp=0000000000000000000000000000000000000000;hpb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;p=libs%2Fgl.git diff --git a/source/render/objectinstance.h b/source/render/objectinstance.h new file mode 100644 index 00000000..0ebef2fe --- /dev/null +++ b/source/render/objectinstance.h @@ -0,0 +1,59 @@ +#ifndef MSP_GL_OBJETCINSTANCE_H_ +#define MSP_GL_OBJETCINSTANCE_H_ + +#include +#include "object.h" +#include "placeable.h" + +namespace Msp { +namespace GL { + +/** +Represents a single instance of an Object. Thanks to being derived from +Placeable in can be positioned without additional effort. Other instance +parameters can be set by overriding the hook functions. + +ObjectInstances can benefit from being put in an InstanceScene, which will +render all instances of the same object consecutively. +*/ +class ObjectInstance: public PlacedRenderable +{ +public: + class Loader: public DataFile::ObjectLoader + { + public: + Loader(ObjectInstance &); + + private: + void transform(); + }; + +protected: + const Object &object; + +public: + ObjectInstance(const Object &); + + const Object &get_object() const { return object; } + virtual IntPtr get_instance_key() const { return reinterpret_cast(&object); } + + virtual const Geometry::BoundingSphere *get_bounding_sphere() const { return object.get_bounding_sphere(); } + + virtual void render(Renderer &, const Tag & = Tag()) const; + + /** Hook function, called from Object just before rendering the mesh. + Renderer state will have been pushed before this is called. */ + virtual void setup_render(Renderer &, const Tag &) const; + + /** Hook function, called from Object right after rendering the mesh. Since + Object takes care of pushing Renderer state, this rarely needs to do + anything. */ + virtual void finish_render(Renderer &, const Tag &) const { } + + virtual unsigned get_level_of_detail(const Renderer &) const; +}; + +} // namespace GL +} // namespaec Msp + +#endif