SceneRenderSystem.ixx File
Extracts visible scene members into render commands per viewport. More...
Included Headers
#include <concepts>
#include <cassert>
#include <tuple>
#include "helios-engine-config.h"
#include <helios.engine.util.log>
#include <helios.engine.rendering.viewport.concepts.IsViewportHandle>
#include <helios.engine.core.types.ComponentTypeTags>
#include <helios.engine.scene.concepts.IsFrustumCullerLike>
#include <helios.engine.scene.SceneMemberVisibilityRegistry>
#include <helios.engine.runtime.messaging.command.concepts.IsCommandBufferLike>
#include <helios.engine.runtime.world.tags.SystemRole>
#include <helios.engine.scene.types>
#include <helios.engine.scene.components>
#include <helios.engine.rendering.common.commands>
#include <helios.engine.rendering.renderTarget.components.RenderTargetBindingComponent>
#include <helios.engine.rendering.common.components>
#include <helios.engine.spatial.components>
#include <helios.math>
#include <helios.ecs.components.Active>
#include <helios.engine.runtime.messaging.command.NullCommandBuffer>
#include <helios.engine.runtime.world.UpdateContext>
Namespaces Index
| namespace | helios |
| namespace | engine |
| namespace | scene |
| namespace | systems |
Classes Index
| class | SceneRenderSystem<TOwnerHandle, TMemberHandle, TCullingStrategy, TCommandBuffer> |
|
System that extracts per-member render contexts for active viewports. More... | |
Macro Definitions Index
| #define | HELIOS_LOG_SCOPE "helios::engine::scene::systems::SceneRenderSystem" |
Description
Extracts visible scene members into render commands per viewport.
Macro Definitions
HELIOS_LOG_SCOPE
|
Definition at line 57 of file SceneRenderSystem.ixx.
57#define HELIOS_LOG_SCOPE "helios::engine::scene::systems::SceneRenderSystem"
File Listing
The file content with the documentation metadata removed is:
10#include "helios-engine-config.h"
41using namespace helios::engine::core::types;
42using namespace helios::engine::scene;
43using namespace helios::engine::scene::types;
45using namespace helios::engine::scene::components;
47using namespace helios::engine::rendering::common::components;
49using namespace helios::engine::rendering::renderTarget::components;
50using namespace helios::engine::scene::types;
52using namespace helios::engine::spatial::components;
53using namespace helios::engine::rendering::common::commands;
54using namespace helios::engine::rendering::common::components;
55using namespace helios::engine::runtime::messaging::command;
57#define HELIOS_LOG_SCOPE "helios::engine::scene::systems::SceneRenderSystem"
58export namespace helios::engine::scene::systems {
74 typename TOwnerHandle,
75 typename TMemberHandle,
76 typename TCullingStrategy,
77 typename TCommandBuffer = NullCommandBuffer
79 requires IsViewportHandle<TOwnerHandle> &&
83 class SceneRenderSystem {
85 TCullingStrategy cullingStrategy_;
87 static inline auto& logger_ = helios::engine::util::log::LogManager::loggerForScope(HELIOS_LOG_SCOPE);
89 SceneMemberVisibilityRegistry<TMemberHandle>& visibilityRegistry_;
96 using CommandBuffer_type = TCommandBuffer;
105 explicit SceneRenderSystem(TCullingStrategy cullingStrategy, SceneMemberVisibilityRegistry<TMemberHandle>& visibilityRegistry)
106 : cullingStrategy_(std::move(cullingStrategy)), visibilityRegistry_(visibilityRegistry) {}
114 void update(helios::engine::runtime::world::UpdateContext& updateContext, TCommandBuffer& cmdBuffer) noexcept {
117 for (auto [viewportEntity, fbc, sbc, cbc, viewportActive] : updateContext.view<
118 TOwnerHandle,
123 >().whereEnabled()) {
125 const auto sceneHandle = sbc->targetHandle();
126 const auto cameraHandle = cbc->targetHandle();
128 const auto camera = updateContext.find<TMemberHandle>(cameraHandle);
129 if (!camera) {
130 assert(false && "Camera not found");
134 auto* pmc = camera->template get<ProjectionMatrixComponent<TMemberHandle>>();
135 if (!pmc) {
140 auto* lac = camera->template get<ViewMatrixComponent<TMemberHandle>>();
141 if (!lac) {
147 auto* pcc = camera->template get<PerspectiveCameraComponent<TMemberHandle>>();
152 auto cullingContext = CullingContext<TMemberHandle>{frustumPlanes, pmc->value(), lac->value()};
154 cmdBuffer.template add<RenderSceneCommand<TMemberHandle>>(
156 fbc->targetHandle(),
157 viewportEntity.handle(),
164 std::size_t available = 0;
165 std::size_t used = 0;
169 memberEntity,
170 smc,
171 rpc,
172 transformWorld,
173 boundsWorld,
174 memberActive
175 ] : updateContext.view<
176 TMemberHandle,
182 >().whereEnabled()) {
184 cullingContext.bounds = boundsWorld->value();
185 cullingContext.handle = memberEntity.handle();
188 available++;
190 if (smc->targetHandle() == sceneHandle && cullingStrategy_.shouldRender(cullingContext)) {
192 used++;
194 std::ignore = visibilityRegistry_.addVisibleMember(viewportEntity.handle(), memberEntity.handle());
195 cmdBuffer.template add<RenderSceneMemberCommand<TMemberHandle>>(
197 memberEntity.handle(),
198 fbc->targetHandle(),
199 viewportEntity.handle(),
201 rpc->meshHandle(),
202 rpc->materialHandle(),
203 rpc->shaderHandle(),
204 transformWorld->value()
209 std::ignore = visibilityRegistry_.addCulledMember(viewportEntity.handle(), memberEntity.handle());
214 logger_.debug("Available {0}, culled in {1}, used {2} scene members for viewport {3}.", available, available - used, used, viewportEntity.handle().entityId);
Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.