X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Fzsortedscene.h;fp=source%2Frender%2Fzsortedscene.h;h=cb21061bae301db5f7851c54130112d29e04c011;hb=7aaec9a70b8d7733429bec043f8e33e02956f266;hp=0000000000000000000000000000000000000000;hpb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;p=libs%2Fgl.git diff --git a/source/render/zsortedscene.h b/source/render/zsortedscene.h new file mode 100644 index 00000000..cb21061b --- /dev/null +++ b/source/render/zsortedscene.h @@ -0,0 +1,75 @@ +#ifndef MSP_GL_ZSORTEDSCENE_H_ +#define MSP_GL_ZSORTEDSCENE_H_ + +#include +#include +#include "scene.h" + +namespace Msp { +namespace GL { + +enum SortOrder +{ + FRONT_TO_BACK, + BACK_TO_FRONT +}; + +enum DepthReference +{ + CLOSEST, + CENTER, + FURTHEST +}; + +/** +Sorts renderables by their distance from the camera before rendering. Requires +renderables to have a matrix. +*/ +class ZSortedScene: public Scene +{ +private: + struct SortedRenderable + { + Renderable *renderable; + bool in_frustum; + float depth; + + SortedRenderable(Renderable *); + + bool operator<(const SortedRenderable &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); + +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 +} // namespace Msp + +#endif