1#ifndef OE_RENDER_MANAGER_H
2#define OE_RENDER_MANAGER_H
13#include "shader_base.h"
15#include "mesh_renderer.h"
16#include "mesh_skinned_renderer.h"
29 using RenderNodeId = uint32_t;
34 std::variant<MeshRenderer, MeshSkinnedRenderer> mesh_renderer;
38 using Container = std::vector<T>;
44 template <
typename SettingsType = RenderManagerSettings>
47 using RenderNodeId = SettingsType::RenderNodeId;
48 using RenderNode = SettingsType::RenderNode;
49 using NodeContainerType = SettingsType::template Container<RenderNode>;
64 RenderNode* getNodeById(
const RenderNodeId id_node, std::span<const NodeContainerType> nodes)
66 auto it = find_if(nodes.begin(), nodes.end(), [&id_node](
const NodeContainerType& node)
68 return node.id == id_node;
71 if (it != nodes.end())
79 void deleteNodeById(
const RenderNodeId id_node)
83 for (
auto& node_list_ptr : node_lists)
85 auto& node_list = *node_list_ptr;
87 node_list.erase(std::remove_if(node_list.begin(), node_list.end(),
88 [id_node](
auto& node) {
89 return node.id == id_node;
96 RenderNodeId addOpaqueNode(T&& component)
98 RenderNodeId id_node = _next_node_id++;
100 opaque_nodes.emplace_back(id_node, std::move(component));
105 template <
typename T>
106 RenderNodeId addBlendNode(T&& component,
bool is_glass =
false)
108 RenderNodeId id_node = _next_node_id++;
116 blend_nodes.emplace_back(id_node, std::move(component));
125 template <
typename RenderNodeType,
typename F>
133 std::vector<render::DrawCommand> render_commands;
134 bool can_render = renderer.fillRenderCommands(camera, is_blending_pass, render_commands);
144 for (
auto &it : render_commands)
146 auto* material = it.material;
149 shader->
bind(geometry_pass, render_pass);
151 renderer.fillShader(shader, camera);
159 render_mesh.
render(it.enabled_primitives);
174 template <
typename F>
183 template <
typename F>
186 for (
auto& render_node : nodes)
188 std::visit([&](
auto& mesh_renderer)
190 renderNode(mesh_renderer, camera, render_pass, fill_shader);
191 }, render_node.mesh_renderer);
202 for (
auto& render_node : nodes)
204 std::visit([&](
auto& mesh_renderer)
206 renderNode(mesh_renderer, camera, render_pass, [](
void*) {});
207 }, render_node.mesh_renderer);
212 std::atomic<uint64_t> _next_node_id = 1;
void render(const std::vector< bool > &activeprimitives, uint32_t mode=default_mesh_rendering_mode)
Ask the GPU to render specific primitives of the mesh.
Definition mesh.h:226
Shader class.
Definition shader_base.h:32
void fillTextures(std::span< const scene::TextureProperty > textures)
Fill textures uniforms + bind textures.
void bind(const GeometryPass vertex_pass, const RenderingPass fragment_pass)
Use the shader in graphic API.
void fillFromCamera(const scene::Camera &camera) noexcept
Fill uniforms from camera (mainly position + transform matrices).
void fillFromMaterial(const scene::Material *material)
Fill uniforms from material.
The "eye of the scene".
Definition camera.h:31
Render related abstractions (Shader, Framebuffer, Cubemaps, Textures).
Definition opengl.h:12
RenderingPass
Pipeline rendering passes.
Definition passes.h:24
@ FORWARD
Definition passes.h:29
GenericRenderManager< RenderManagerSettings > RenderManager
Render manager using a variant of MeshRenderer and MeshSkinnedRenderer.
Definition manager.h:218
GeometryPass
Vertex rendering passes.
Definition passes.h:12
Generic render manager.
Definition manager.h:46
NodeContainerType refractive_nodes
Definition manager.h:62
void renderNode(RenderNodeType &renderer, const oe::scene::Camera &camera, const oe::render::RenderingPass render_pass, F &&fill_shader)
Render node list using specified rendering.
Definition manager.h:126
NodeContainerType blend_nodes
Definition manager.h:55
void renderOpaqueNodes(const oe::scene::Camera &camera, const oe::render::RenderingPass render_pass)
Render opaque nodes list using specified rendering.
Definition manager.h:166
NodeContainerType opaque_nodes
Definition manager.h:52
void render(std::span< RenderNode > nodes, const oe::scene::Camera &camera, const oe::render::RenderingPass render_pass, F &&fill_shader)
Definition manager.h:184
void render(std::span< RenderNode > nodes, const oe::scene::Camera &camera, const oe::render::RenderingPass render_pass)
Render custom nodes list using specified rendering.
Definition manager.h:200
void renderBlendNodes(const oe::scene::Camera &camera, const oe::render::RenderingPass render_pass, F &&fill_shader)
Render blend nodes list using specified rendering.
Definition manager.h:175
Default Render manager settings.
Definition manager.h:28