SceneMemberVisibilitySystem.ixx File
Builds per-frame scene-member visibility data per viewport. More...
Included Headers
#include <concepts>
#include <cassert>
#include <optional>
#include <tuple>
#include <vector>
#include "helios-engine-config.h"
#include <helios.engine.core.types.ComponentTypeTags>
#include <helios.math>
#include <helios.engine.util.log>
#include <helios.ecs.components.Active>
#include <helios.engine.runtime.world.tags.SystemRole>
#include <helios.engine.runtime.messaging.command.concepts.IsCommandBufferLike>
#include <helios.engine.scene.components>
#include <helios.engine.rendering.viewport.concepts.IsViewportHandle>
#include <helios.engine.scene.concepts.IsFrustumCullerLike>
#include <helios.engine.scene.types>
#include <helios.engine.rendering.common.components>
#include <helios.engine.rendering.common.commands>
#include <helios.engine.rendering.common.types>
#include <helios.engine.spatial.components>
#include <helios.engine.rendering.viewport.ViewportEntity>
#include <helios.engine.scene.SceneMemberVisibilityRegistry>
#include <helios.engine.rendering.renderTarget.components.RenderTargetBindingComponent>
#include <helios.engine.runtime.world.UpdateContext>
#include <helios.engine.runtime.messaging.command.NullCommandBuffer>
Namespaces Index
| namespace | helios |
| namespace | engine |
| namespace | scene |
| namespace | systems |
Classes Index
| class | SceneMemberVisibilitySystem<TOwnerHandle, TMemberHandle, TCullingStrategy, TRenderModes> |
|
Computes visibility for scene members and stores the frame snapshot. More... | |
Macro Definitions Index
| #define | HELIOS_LOG_SCOPE "helios::engine::scene::systems::SceneRenderSystem" |
Description
Builds per-frame scene-member visibility data per viewport.
Macro Definitions
HELIOS_LOG_SCOPE
|
Definition at line 66 of file SceneMemberVisibilitySystem.ixx.
66#define HELIOS_LOG_SCOPE "helios::engine::scene::systems::SceneRenderSystem"
File Listing
The file content with the documentation metadata removed is:
13#include "helios-engine-config.h"
47using namespace helios::engine::core::types;
48using namespace helios::engine::scene;
49using namespace helios::engine::scene::types;
51using namespace helios::engine::scene::components;
53using namespace helios::engine::rendering::common::components;
55using namespace helios::engine::rendering::viewport;
56using namespace helios::engine::rendering::renderTarget::components;
57using namespace helios::engine::scene::types;
59using namespace helios::engine::spatial::components;
60using namespace helios::engine::rendering::common::commands;
61using namespace helios::engine::rendering::common::types;
62using namespace helios::engine::rendering::common::components;
63using namespace helios::engine::runtime::messaging::command;
64using namespace helios::engine::runtime::world;
66#define HELIOS_LOG_SCOPE "helios::engine::scene::systems::SceneRenderSystem"
67export namespace helios::engine::scene::systems {
83 typename TOwnerHandle,
84 typename TMemberHandle,
85 typename TCullingStrategy,
86 typename ... TRenderModes
88 requires IsViewportHandle<TOwnerHandle> &&
91 class SceneMemberVisibilitySystem {
96 TCullingStrategy cullingStrategy_;
98 static inline auto& logger_ = helios::engine::util::log::LogManager::loggerForScope(HELIOS_LOG_SCOPE);
103 SceneMemberVisibilityRegistry<TMemberHandle>& visibilityRegistry_;
120 UpdateContext& updateContext,
122 const SceneHandle sceneHandle,
124 const ViewportEntity &viewportEntity
128 memberEntity,
129 smc,
130 rpc,
131 transformWorld,
132 boundsWorld,
133 memberActive
134 ] : updateContext.view<
135 TMemberHandle,
141 >().whereEnabled()) {
143 cullingContext.bounds = boundsWorld->value();
144 cullingContext.handle = memberEntity.handle();
147 memberEntity.handle(),
148 renderTargetBindingComponent.targetHandle(),
149 viewportEntity.handle(),
151 transformWorld->value()
154 visibilityRegistry_.addSceneRenderContext({
155 renderTargetBindingComponent.targetHandle(), viewportEntity.handle(), sceneHandle
159 if (smc->targetHandle() == sceneHandle && cullingStrategy_.shouldRender(cullingContext)) {
160 visibilityRegistry_.template addVisibleMember<TSubmissionMode>(viewportEntity.handle(), std::move(memberContext));
162 visibilityRegistry_.template addCulledMember<TSubmissionMode>(viewportEntity.handle(), std::move(memberContext));
182 explicit SceneMemberVisibilitySystem(TCullingStrategy cullingStrategy, SceneMemberVisibilityRegistry<TMemberHandle>& visibilityRegistry)
183 : cullingStrategy_(std::move(cullingStrategy)), visibilityRegistry_(visibilityRegistry) {
196 void update(UpdateContext& updateContext) noexcept {
198 visibilityRegistry_.clear();
200 for (auto [viewportEntity, renderTargetBindingComponent, sbc, cbc, viewportActive] : updateContext.view<
201 TOwnerHandle,
206 >().whereEnabled()) {
208 const auto sceneHandle = sbc->targetHandle();
209 const auto cameraHandle = cbc->targetHandle();
211 const auto camera = updateContext.find<TMemberHandle>(cameraHandle);
212 if (!camera) {
213 assert(false && "Camera not found");
217 auto* pmc = camera->template get<ProjectionMatrixComponent<TMemberHandle>>();
218 if (!pmc) {
223 auto* lac = camera->template get<ViewMatrixComponent<TMemberHandle>>();
224 if (!lac) {
230 auto* pcc = camera->template get<PerspectiveCameraComponent<TMemberHandle>>();
235 auto cullingContext = CullingContext<TMemberHandle>{frustumPlanes, pmc->value(), lac->value()};
238 updateContext, cullingContext, sceneHandle, *renderTargetBindingComponent, viewportEntity);
240 updateContext, cullingContext, sceneHandle, *renderTargetBindingComponent, viewportEntity);
Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.