Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Layer support in renderer #1645

Merged
merged 28 commits into from
May 23, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
ae6c34f
renderer: Store terrain tiles in render entity.
heinezen Apr 28, 2024
56994af
renderer: Don't use curve for terrain mesh.
heinezen May 1, 2024
8604027
renderer: Create mesh for individual terrain textures.
heinezen May 1, 2024
2233c71
renderer: Remove old terrain paths from render entity.
heinezen May 1, 2024
fc44940
assets: Add second test terrain asset.
heinezen May 1, 2024
2f20f31
gamestate: Use tile's asset path when updating renderer.
heinezen May 1, 2024
7a02427
gamestate: Add more choices to terrain examples.
heinezen May 1, 2024
8734667
gamestate: Add terrain test layouts to terrain factory.
heinezen May 1, 2024
a46451e
renderer: Fix vertex generation from tiles.
heinezen May 1, 2024
9329095
renderer: Order tayers by position.
heinezen May 3, 2024
f517790
renderer: Remove camera from world object.
heinezen May 3, 2024
fcfc596
renderer: Store uniforms for multiple layers in world object.
heinezen May 3, 2024
b576532
renderer: Draw multiple layers per animation.
heinezen May 3, 2024
d11e926
renderer: Split renderer.h into more source files.
heinezen May 3, 2024
253f94b
renderer: Remove unused variable.
heinezen May 3, 2024
85c4787
renderer: Priority sorting in render pass.
heinezen May 3, 2024
e33d481
renderer: Remove code duplication in render pass operations.
heinezen May 7, 2024
2b3262d
renderer: Autosort renderables into layers on insert.
heinezen May 8, 2024
10140c8
renderer: Make inserion by priority the default.
heinezen May 8, 2024
bf9b2f2
renderer: Move sorting of renderables to render pass.
heinezen May 8, 2024
b328def
renderer: Add more functions for optimization to GLRenderPass.
heinezen May 8, 2024
017c3be
renderer: Turn off optimization for OpenGL.
heinezen May 8, 2024
5746a5b
renderer: Use move semantics for adding renderables to pass.
heinezen May 8, 2024
fb93335
renderer: Add more comments to explain render pass logic.
heinezen May 8, 2024
82356fd
renderer: Revere ordering of layers in pass.
heinezen May 8, 2024
5f74b72
renderer: Allow configuring depth of added layers.
heinezen May 8, 2024
ac1be0f
doc: Document layer usage in level 1 renderer.
heinezen May 8, 2024
52663d6
renderer: Use vector of vectors for storing renderables.
heinezen May 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
renderer: Move sorting of renderables to render pass.
  • Loading branch information
heinezen committed May 9, 2024
commit bf9b2f2f2834df0a6a318f8d89e300ae2dba771e
13 changes: 6 additions & 7 deletions libopenage/renderer/opengl/render_pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,19 @@ namespace openage::renderer::opengl {
GlRenderPass::GlRenderPass(std::vector<Renderable> renderables,
const std::shared_ptr<RenderTarget> &target) :
RenderPass(renderables, target),
is_optimised(false) {
log::log(MSG(dbg) << "Created OpenGL render pass");
is_optimized(false) {
}

void GlRenderPass::set_renderables(std::vector<Renderable> renderables) {
RenderPass::set_renderables(renderables);
this->is_optimised = false;
this->is_optimized = false;
}

bool GlRenderPass::get_is_optimised() const {
return this->is_optimised;
bool GlRenderPass::get_is_optimized() const {
return this->is_optimized;
}

void GlRenderPass::set_is_optimised(bool flag) {
this->is_optimised = flag;
void GlRenderPass::set_is_optimized(bool flag) {
this->is_optimized = flag;
}
} // namespace openage::renderer::opengl
6 changes: 3 additions & 3 deletions libopenage/renderer/opengl/render_pass.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ class GlRenderPass final : public RenderPass {
const std::shared_ptr<RenderTarget> &);

void set_renderables(std::vector<Renderable>);
void set_is_optimised(bool);
bool get_is_optimised() const;
void set_is_optimized(bool);
bool get_is_optimized() const;

private:
/// Whether the renderables order is optimised
bool is_optimised;
bool is_optimized;
};

} // namespace openage::renderer::opengl
12 changes: 5 additions & 7 deletions libopenage/renderer/opengl/renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,9 @@ void GlRenderer::resize_display_target(size_t width, size_t height) {
this->display->resize(width, height);
}

void GlRenderer::optimise(const std::shared_ptr<GlRenderPass> &pass) {
if (!pass->get_is_optimised()) {
auto renderables = pass->get_renderables();
std::stable_sort(renderables.begin(), renderables.end(), [](const Renderable &a, const Renderable &b) {
void GlRenderer::optimize(const std::shared_ptr<GlRenderPass> &pass) {
if (!pass->get_is_optimized()) {
pass->sort([](const Renderable &a, const Renderable &b) {
GLuint shader_a = std::dynamic_pointer_cast<GlShaderProgram>(
std::dynamic_pointer_cast<GlUniformInput>(a.uniform)->get_program())
->get_handle();
Expand All @@ -158,8 +157,7 @@ void GlRenderer::optimise(const std::shared_ptr<GlRenderPass> &pass) {
return shader_a < shader_b;
});

pass->set_renderables(renderables);
pass->set_is_optimised(true);
pass->set_is_optimized(true);
}
}

Expand All @@ -178,7 +176,7 @@ void GlRenderer::render(const std::shared_ptr<RenderPass> &pass) {
// glEnable(GL_CULL_FACE);

auto gl_pass = std::dynamic_pointer_cast<GlRenderPass>(pass);
// GlRenderer::optimise(gl_pass);
GlRenderer::optimize(gl_pass);

for (auto const &obj : gl_pass->get_renderables()) {
if (obj.alpha_blending) {
Expand Down
2 changes: 1 addition & 1 deletion libopenage/renderer/opengl/renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class GlRenderer final : public Renderer {

private:
/// Optimize the render pass by reordering stuff
static void optimise(const std::shared_ptr<GlRenderPass> &);
static void optimize(const std::shared_ptr<GlRenderPass> &pass);

/// The GL context.
std::shared_ptr<GlContext> gl_context;
Expand Down
14 changes: 14 additions & 0 deletions libopenage/renderer/render_pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

#include "render_pass.h"

#include "log/log.h"


namespace openage::renderer {

Expand All @@ -15,6 +17,8 @@ RenderPass::RenderPass(std::vector<Renderable> renderables,

// Add the renderables to the pass
this->add_renderables(renderables);

log::log(MSG(dbg) << "Created render pass");
}

const std::shared_ptr<RenderTarget> &RenderPass::get_target() const {
Expand Down Expand Up @@ -92,4 +96,14 @@ void RenderPass::clear_renderables() {
}
}

void RenderPass::sort(const compare_func &compare) {
size_t offset = 0;
for (auto &layer : this->layers) {
std::stable_sort(this->renderables.begin() + offset,
this->renderables.begin() + offset + layer.length,
compare);
offset += layer.length;
}
}

} // namespace openage::renderer
11 changes: 11 additions & 0 deletions libopenage/renderer/render_pass.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,17 @@ class RenderPass {
*/
void clear_renderables();

using compare_func = std::function<bool(const Renderable &, const Renderable &)>;

/**
* Sort the renderables using the given comparison function.
*
* Layers are sorted individually, so the order of layers is not changed.
*
* @param compare Comparison function.
*/
void sort(const compare_func &compare);

protected:
/**
* Create a new RenderPass. This is called from Renderer::add_render_pass,
Expand Down