Skip to content

Commit 52663d6

Browse files
committed
renderer: Use vector of vectors for storing renderables.
1 parent ac1be0f commit 52663d6

File tree

3 files changed

+28
-74
lines changed

3 files changed

+28
-74
lines changed

libopenage/renderer/opengl/renderer.cpp

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -180,20 +180,19 @@ void GlRenderer::render(const std::shared_ptr<RenderPass> &pass) {
180180
// GlRenderer::optimize(gl_pass);
181181

182182
// render all objects in the pass
183-
auto &layers = gl_pass->get_layers();
184-
auto &renderables = gl_pass->get_renderables();
183+
const auto &layers = gl_pass->get_layers();
184+
const auto &renderables = gl_pass->get_renderables();
185185

186186
// Draw by layers
187-
size_t offset = 0;
188-
size_t next_offset = 0;
189-
for (auto const &layer : layers) {
187+
for (size_t i = 0; i < layers.size(); i++) {
188+
const auto &layer = layers[i];
189+
const auto &objects = renderables[i];
190+
190191
if (layer.clear_depth) {
191192
glClear(GL_DEPTH_BUFFER_BIT);
192193
}
193194

194-
next_offset = offset + layer.length;
195-
for (size_t i = offset; i < next_offset; i++) {
196-
const auto &obj = renderables[i];
195+
for (auto const &obj : objects) {
197196
if (obj.alpha_blending) {
198197
glEnable(GL_BLEND);
199198
}
@@ -221,38 +220,7 @@ void GlRenderer::render(const std::shared_ptr<RenderPass> &pass) {
221220
geom->draw();
222221
}
223222
}
224-
225-
offset = next_offset;
226223
}
227-
228-
// for (auto const &obj : gl_pass->get_renderables()) {
229-
// if (obj.alpha_blending) {
230-
// glEnable(GL_BLEND);
231-
// }
232-
// else {
233-
// glDisable(GL_BLEND);
234-
// }
235-
236-
// if (obj.depth_test) {
237-
// glEnable(GL_DEPTH_TEST);
238-
// }
239-
// else {
240-
// glDisable(GL_DEPTH_TEST);
241-
// }
242-
243-
// auto in = std::dynamic_pointer_cast<GlUniformInput>(obj.uniform);
244-
// auto program = std::static_pointer_cast<GlShaderProgram>(in->get_program());
245-
246-
// // this also calls program->use()
247-
// program->update_uniforms(in);
248-
249-
// // draw the geometry
250-
// if (obj.geometry != nullptr) {
251-
// auto geom = std::dynamic_pointer_cast<GlGeometry>(obj.geometry);
252-
// // TODO read obj.blend + family
253-
// geom->draw();
254-
// }
255-
// }
256224
}
257225

258226
} // namespace openage::renderer::opengl

libopenage/renderer/render_pass.cpp

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4545
void 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

9082
void RenderPass::add_renderables(Renderable &&renderable, int64_t priority) {
@@ -104,26 +96,22 @@ void RenderPass::add_layer(int64_t priority, bool clear_depth) {
10496
}
10597

10698
void 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

110103
void 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

120110
void 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

libopenage/renderer/render_pass.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,8 @@ class RenderTarget;
2323
* // not need layers at all.
2424
*/
2525
struct Layer {
26-
/// Priority of the renderables in this slice.
26+
/// Priority of the renderables.
2727
int64_t priority;
28-
/// Number of renderables in this slice.
29-
size_t length;
3028
/// Whether to clear the depth buffer before rendering this layer.
3129
bool clear_depth = true;
3230
};
@@ -44,7 +42,7 @@ class RenderPass {
4442
*
4543
* @return Renderables of the render pass.
4644
*/
47-
const std::vector<Renderable> &get_renderables() const;
45+
const std::vector<std::vector<Renderable>> &get_renderables() const;
4846

4947
/**
5048
* Get the layers of the render pass.
@@ -131,7 +129,7 @@ class RenderPass {
131129
*
132130
* Kept sorted by layer priorities (lowest to highest priority).
133131
*/
134-
std::vector<Renderable> renderables;
132+
std::vector<std::vector<Renderable>> renderables;
135133

136134
private:
137135
/**

0 commit comments

Comments
 (0)