@@ -21,7 +21,7 @@ RenderPass::RenderPass(std::vector<Renderable> &&renderables,
2121 log::log (MSG (dbg) << " Created render pass" );
2222}
2323
24- const std::vector<Renderable> &RenderPass::get_renderables () const {
24+ const std::vector<std::vector< Renderable> > &RenderPass::get_renderables () const {
2525 return this ->renderables ;
2626}
2727
@@ -43,24 +43,20 @@ void RenderPass::set_renderables(std::vector<Renderable> &&renderables) {
4343}
4444
4545void RenderPass::add_renderables (std::vector<Renderable> &&renderables, int64_t priority) {
46- // Insertion index for the renderables
47- size_t renderables_index = 0 ;
46+ if (priority == LAYER_PRIORITY_MAX) {
47+ // Add the renderables to the last (default) layer
48+ this ->renderables .back ().insert (this ->renderables .back ().end (),
49+ std::make_move_iterator (renderables.begin ()),
50+ std::make_move_iterator (renderables.end ()));
51+ return ;
52+ }
4853
4954 // Index of the layer where the renderables will be inserted
5055 size_t layer_index = 0 ;
5156
5257 // Priority of the last observed layer
5358 int64_t current_priority = LAYER_PRIORITY_MAX;
5459
55- if (priority == LAYER_PRIORITY_MAX) {
56- // Add the renderables to the last (default) layer
57- this ->renderables .insert (this ->renderables .end (),
58- std::make_move_iterator (renderables.begin ()),
59- std::make_move_iterator (renderables.end ()));
60- this ->layers .back ().length += renderables.size ();
61- return ;
62- }
63-
6460 // Find the index in renderables to insert the renderables
6561 for (size_t i = 0 ; i < this ->layers .size (); i++) {
6662 auto &layer = this ->layers .at (i);
@@ -69,22 +65,18 @@ void RenderPass::add_renderables(std::vector<Renderable> &&renderables, int64_t
6965 // Insert the renderables directly before this layer
7066 break ;
7167 }
72- renderables_index += layer.length ;
7368 current_priority = layer.priority ;
7469 layer_index = i;
7570 }
7671
77- this ->renderables .insert (this ->renderables .begin () + renderables_index,
78- std::make_move_iterator (renderables.begin ()),
79- std::make_move_iterator (renderables.end ()));
80-
8172 if (current_priority != priority) {
8273 // Lazily add a new layer with the desired priority
8374 this ->add_layer (layer_index, priority);
8475 }
8576
86- // Update the length of the layer with the number of added renderables
87- this ->layers .at (layer_index).length += renderables.size ();
77+ this ->renderables [layer_index].insert (this ->renderables [layer_index].end (),
78+ std::make_move_iterator (renderables.begin ()),
79+ std::make_move_iterator (renderables.end ()));
8880}
8981
9082void RenderPass::add_renderables (Renderable &&renderable, int64_t priority) {
@@ -104,26 +96,22 @@ void RenderPass::add_layer(int64_t priority, bool clear_depth) {
10496}
10597
10698void RenderPass::add_layer (size_t index, int64_t priority, bool clear_depth) {
107- this ->layers .insert (this ->layers .begin () + index, Layer{priority, 0 , clear_depth});
99+ this ->layers .insert (this ->layers .begin () + index, Layer{priority, clear_depth});
100+ this ->renderables .insert (this ->renderables .begin () + index, std::vector<Renderable>{});
108101}
109102
110103void RenderPass::clear_renderables () {
111- // Erase all renderables
112- this ->renderables .clear ();
113-
114104 // Keep layer definitions, but reset the length of each layer to 0
115- for (auto &layer : this ->layers ) {
116- layer. length = 0 ;
105+ for (size_t i = 0 ; i < this ->layers . size (); i++ ) {
106+ this -> renderables [i]. clear () ;
117107 }
118108}
119109
120110void RenderPass::sort (const compare_func &compare) {
121- size_t offset = 0 ;
122- for (auto &layer : this ->layers ) {
123- std::stable_sort (this ->renderables .begin () + offset,
124- this ->renderables .begin () + offset + layer.length ,
111+ for (size_t i = 0 ; i < this ->layers .size (); i++) {
112+ std::stable_sort (this ->renderables [i].begin (),
113+ this ->renderables [i].end (),
125114 compare);
126- offset += layer.length ;
127115 }
128116}
129117
0 commit comments