24 #include "../../generic/containers/contiguous_map.h"
26 #include "../../types.h"
27 #include "../../threads/shared_mutex.h"
28 #include "../../macros.h"
42 float distance_to_camera;
53 if(sort_key.pass < rhs.sort_key.pass) {
57 if(sort_key.is_blended < rhs.sort_key.is_blended) {
61 if(!sort_key.is_blended) {
62 if(sort_key.distance_to_camera < rhs.sort_key.distance_to_camera) {
68 if(rhs.sort_key.distance_to_camera < sort_key.distance_to_camera) {
80 sort_key.pass == rhs.sort_key.pass &&
81 sort_key.is_blended == rhs.sort_key.is_blended &&
82 sort_key.distance_to_camera == rhs.sort_key.distance_to_camera
87 return !(*
this == rhs);
91 RenderGroupKey generate_render_group_key(
const uint8_t pass,
const bool is_blended,
const float distance_to_camera);
103 const uint8_t pass_number,
104 const bool is_blended,
105 const float distance_to_camera
109 typedef uint32_t Pass;
110 typedef uint32_t Iteration;
118 virtual void start_traversal(
const RenderQueue& queue, uint64_t frame_id,
Stage* stage) = 0;
123 virtual void apply_lights(
const LightPtr* lights,
const uint8_t count) = 0;
144 std::unordered_map<MaterialID, std::set<Renderable*>> renderables_by_material_;
150 std::unordered_map<MaterialID, sig::connection> material_update_conections_;
152 void on_material_changed(
MaterialID material);
164 void insert_renderable(
Renderable&& renderable);
169 std::size_t queue_count()
const {
return priority_queues_.size(); }
170 std::size_t group_count(Pass pass_number)
const;
172 std::size_t renderable_count()
const {
return renderables_.size(); }
174 return &renderables_[i];
183 Stage* stage_ =
nullptr;
187 std::vector<Renderable> renderables_;
188 std::array<
SortedRenderables, RENDER_PRIORITY_MAX - RENDER_PRIORITY_MIN> priority_queues_;
190 void clean_empty_batches();