]> git.tdb.fi Git - libs/gl.git/blobdiff - source/renderable.h
Remove dynamic allocation from VertexFormat
[libs/gl.git] / source / renderable.h
index 3432a87ee77ed4db3c72600061127bef767c768d..9a534e9038579f37256c2722f6681235dc062eea 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_GL_RENDERABLE_H_
 
 #include <string>
+#include <msp/geometry/boundingsphere.h>
 #include "tag.h"
 
 namespace Msp {
@@ -16,6 +17,12 @@ a Renderer, and may optionally provide support for standalone rendering.
 
 The render methods take a Tag to identify a render pass.  It is most commonly
 used together with Techniques and Pipelines to implement multipass rendering.
+
+The setup_frame and finish_frame methods provide a mechanism for performing
+once-per-frame operations.  This is most useful for effects, which may need to
+do auxiliary rendering.  With complex rendering hierarchies, these methods may
+be called multiple times for one frame, but it's guaranteed that no rendering
+will occur before a setup_frame call or after a finish_frame call.
 */
 class Renderable
 {
@@ -32,12 +39,23 @@ public:
        matrix exists. */
        virtual const Matrix *get_matrix() const { return 0; }
 
-       /** Renders the renderable without a renderer.  This can be convenient in
+       /** Returns a bounding sphere that completely encloses the Renderable.  The
+       bounding sphere is expressed in the renderable's coordinates.  Null is
+       returned if the bounding sphere cannot be determined. */
+       virtual const Geometry::BoundingSphere<float, 3> *get_bounding_sphere() const { return 0; }
+
+       /** Called when starting to render a new frame. */
+       virtual void setup_frame() const { }
+
+       /** Called when a complete frame has been rendered. */
+       virtual void finish_frame() const { }
+
+       /** Renders the Renderable without a renderer.  This can be convenient in
        some simple cases, but most renderables don't need to implement this
        method. */
        virtual void render(const Tag & = Tag()) const;
 
-       /** Renders the renderable.  Implementors should take care to return the
+       /** Renders the Renderable.  Implementors should take care to return the
        renderer to the state it was in, for example by using Renderer::Push. */
        virtual void render(Renderer &, const Tag & = Tag()) const = 0;
 };