enum SortOrder
{
- FRONT_TO_BACK,
- BACK_TO_FRONT
+ FRONT_TO_BACK = 0,
+ BACK_TO_FRONT = 1
};
enum DepthReference
{
- CLOSEST,
- CENTER,
- FURTHEST
+ CLOSEST = 0,
+ CENTER = 1,
+ FURTHEST = 2
};
/**
-Sorts renderables by their distance from the camera before rendering. Requires
-renderables to have a matrix.
+A scene which sorts renderables by their distance from the camera before
+rendering.
+
+Renderables must have valid model matrices to be sorted. Those without a
+matrix are sorted as closest to the camera.
*/
class ZSortedScene: public Scene
{
struct SortedRenderable
{
Renderable *renderable;
- bool in_frustum;
- float depth;
+ bool in_frustum = false;
+ float depth = 0.0f;
- SortedRenderable(Renderable *);
+ SortedRenderable(Renderable *r): renderable(r) { }
bool operator<(const SortedRenderable &o) const { return depth<o.depth; }
};
- typedef std::set<Renderable *> RenderableSet;
- typedef std::vector<SortedRenderable> SortedArray;
-
- RenderableSet renderables;
- SortOrder order;
- DepthReference reference;
- mutable SortedArray sorted_cache;
+ std::vector<Renderable *> content;
+ SortOrder order = BACK_TO_FRONT;
+ DepthReference reference = FURTHEST;
+ mutable std::map<const Camera *, std::vector<SortedRenderable> > sorted_cache;
public:
- ZSortedScene();
-
virtual void add(Renderable &);
virtual void remove(Renderable &);
/// 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();