X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fzsortedscene.h;h=cb21061bae301db5f7851c54130112d29e04c011;hp=f9f6f7eed40bd9cfa527540c5417c6fbce3ae75e;hb=8bc776f177c7cf9d0c6fd9590273f086d38c23ca;hpb=c87860db3b23a98eda1adfe59acddffdb6eb8420 diff --git a/source/zsortedscene.h b/source/zsortedscene.h index f9f6f7ee..cb21061b 100644 --- a/source/zsortedscene.h +++ b/source/zsortedscene.h @@ -1,7 +1,9 @@ #ifndef MSP_GL_ZSORTEDSCENE_H_ #define MSP_GL_ZSORTEDSCENE_H_ -#include "simplescene.h" +#include +#include +#include "scene.h" namespace Msp { namespace GL { @@ -23,32 +25,48 @@ enum DepthReference Sorts renderables by their distance from the camera before rendering. Requires renderables to have a matrix. */ -class ZSortedScene: public SimpleScene +class ZSortedScene: public Scene { private: - struct DepthRenderable + struct SortedRenderable { + Renderable *renderable; + bool in_frustum; float depth; - const Renderable *renderable; - DepthRenderable(float, const Renderable *); + SortedRenderable(Renderable *); - bool operator<(const DepthRenderable &o) const { return depth RenderableSet; + typedef std::vector SortedArray; + + RenderableSet renderables; SortOrder order; DepthReference reference; + mutable SortedArray sorted_cache; public: ZSortedScene(); + virtual void add(Renderable &); + virtual void remove(Renderable &); + /// Sets the sort order. Default is back to front. void set_order(SortOrder); /// Sets the reference point for sorting. Default is furthest from camera. void set_reference(DepthReference); - virtual void render(Renderer &, const Tag &) const; +private: + void populate_cache() const; + +public: + virtual void setup_frame(Renderer &); + virtual void finish_frame(); + + virtual void render(Renderer &, const Tag & = Tag()) const; }; } // namespace GL