Skip to main content

SceneRenderSystem Class Template

System that dispatches render commands from visibility results. More...

Declaration

template <typename TOwnerHandle, typename TMemberHandle, typename TCommandBuffer = NullCommandBuffer> class helios::engine::scene::systems::SceneRenderSystem<TOwnerHandle, TMemberHandle, TCommandBuffer> { ... }

Public Member Typedefs Index

template < ... >
usingEngineRoleTag = helios::engine::runtime::world::tags::TypedSystemRole

Runtime role tag used for engine system registration. More...

template < ... >
usingCommandBuffer_type = TCommandBuffer

Command buffer type used by this extraction system. More...

Public Constructors Index

template < ... >
SceneRenderSystem (SceneMemberVisibilityRegistry< TMemberHandle > &visibilityRegistry)

Constructs the system with the visibility snapshot registry. More...

Public Member Functions Index

template < ... >
voidupdate (UpdateContext &updateContext, TCommandBuffer &cmdBuffer) noexcept

Dispatches render commands from the current visibility snapshot. More...

Private Member Functions Index

template < ... >
voiddispatchNonInstancedRenderCommands (UpdateContext &updateContext, std::span< const std::vector< SceneMemberVisibilityContext< TMemberHandle, NonInstanced > > > visibilityContexts, TCommandBuffer &cmdBuffer)

Dispatches non-instanced member render commands. More...

template < ... >
voiddispatchInstancedRenderCommands (UpdateContext &updateContext, std::span< const std::vector< SceneMemberVisibilityContext< TMemberHandle, Instanced > > > visibilityContexts, TCommandBuffer &cmdBuffer)

Dispatches instanced member render commands in batches. More...

Private Member Attributes Index

template < ... >
SceneMemberVisibilityRegistry< TMemberHandle > &visibilityRegistry_

Central per-frame visibility snapshot consumed by this system. More...

Private Static Attributes Index

template < ... >
static auto &logger_ = helios::engine::util::log::LogManager::loggerForScope(HELIOS_LOG_SCOPE)

Description

System that dispatches render commands from visibility results.

This system consumes the frame-local SceneMemberVisibilityRegistry produced earlier by SceneMemberVisibilitySystem. It emits scene-level render commands and member-level commands for both instanced and non-instanced submission paths.

Template Parameters
TOwnerHandle

Viewport entity handle type.

TMemberHandle

Scene member handle type.

TCommandBuffer

Command buffer used for extracted render commands.

Definition at line 93 of file SceneRenderSystem.ixx.

Public Member Typedefs

CommandBuffer_type

template <typename TOwnerHandle, typename TMemberHandle, typename TCommandBuffer = NullCommandBuffer>
using helios::engine::scene::systems::SceneRenderSystem< TOwnerHandle, TMemberHandle, TCommandBuffer >::CommandBuffer_type = TCommandBuffer

Command buffer type used by this extraction system.

Definition at line 232 of file SceneRenderSystem.ixx.

EngineRoleTag

template <typename TOwnerHandle, typename TMemberHandle, typename TCommandBuffer = NullCommandBuffer>
using helios::engine::scene::systems::SceneRenderSystem< TOwnerHandle, TMemberHandle, TCommandBuffer >::EngineRoleTag = helios::engine::runtime::world::tags::TypedSystemRole

Runtime role tag used for engine system registration.

Definition at line 227 of file SceneRenderSystem.ixx.

Public Constructors

SceneRenderSystem()

template <typename TOwnerHandle, typename TMemberHandle, typename TCommandBuffer = NullCommandBuffer>
helios::engine::scene::systems::SceneRenderSystem< TOwnerHandle, TMemberHandle, TCommandBuffer >::SceneRenderSystem (SceneMemberVisibilityRegistry< TMemberHandle > & visibilityRegistry)
inline explicit

Constructs the system with the visibility snapshot registry.

Parameters
visibilityRegistry

Registry containing per-frame visible/culled members.

Definition at line 239 of file SceneRenderSystem.ixx.

Public Member Functions

update()

template <typename TOwnerHandle, typename TMemberHandle, typename TCommandBuffer = NullCommandBuffer>
void helios::engine::scene::systems::SceneRenderSystem< TOwnerHandle, TMemberHandle, TCommandBuffer >::update (UpdateContext & updateContext, TCommandBuffer & cmdBuffer)
inline noexcept

Dispatches render commands from the current visibility snapshot.

Emits one RenderSceneCommand per scene/render-target/viewport context, then emits member commands for instanced and non-instanced visible members stored in SceneMemberVisibilityRegistry.

Parameters
updateContext

Current frame update context.

cmdBuffer

Command buffer receiving extracted render commands.

Definition at line 253 of file SceneRenderSystem.ixx.

254
255 auto sceneRenderContexts = visibilityRegistry_.sceneRenderContexts();
256
257 for (auto& sceneRenderContext : sceneRenderContexts) {
258 cmdBuffer.template add<RenderSceneCommand<TMemberHandle>>(sceneRenderContext);
259 }
260
261 const auto instancedMembers = visibilityRegistry_.template visibleMembers<Instanced>();
262 dispatchInstancedRenderCommands(updateContext, instancedMembers, cmdBuffer);
263
264 const auto nonInstancedMembers = visibilityRegistry_.template visibleMembers<NonInstanced>();
265 dispatchNonInstancedRenderCommands(updateContext, nonInstancedMembers, cmdBuffer);
266
267
268 }

References helios::engine::scene::registerComponents and helios::engine::scene::SceneMemberVisibilityRegistry< TMemberHandle >::sceneRenderContexts.

Private Member Functions

dispatchInstancedRenderCommands()

template <typename TOwnerHandle, typename TMemberHandle, typename TCommandBuffer = NullCommandBuffer>
void helios::engine::scene::systems::SceneRenderSystem< TOwnerHandle, TMemberHandle, TCommandBuffer >::dispatchInstancedRenderCommands (UpdateContext & updateContext, std::span< const std::vector< SceneMemberVisibilityContext< TMemberHandle, Instanced > > > visibilityContexts, TCommandBuffer & cmdBuffer)
inline

Dispatches instanced member render commands in batches.

Builds InstanceRenderBatchContext groups with matching render state and emits RenderInstanceBatchCommand whenever a batch boundary is hit.

Parameters
updateContext

Current frame update context.

visibilityContexts

Visible instanced members grouped by viewport.

cmdBuffer

Command buffer receiving render commands.

Definition at line 159 of file SceneRenderSystem.ixx.

159 void dispatchInstancedRenderCommands(
163
164 std::optional<InstanceRenderBatchContext<TMemberHandle>> renderBatchContext;
165
166 auto flushCurrentBatch = [&]() {
167 if (!renderBatchContext || renderBatchContext->memberHandles.empty()) {
168 renderBatchContext.reset();
169 return;
170 }
171
173 std::move(*renderBatchContext)
174 );
175
176 renderBatchContext.reset();
177 };
178
179 for (const auto& viewportContexts : visibilityContexts) {
180
181 for (const auto& memberContext : viewportContexts) {
182 const auto sceneHandle = memberContext.sceneHandle;
183 const auto renderTargetHandle = memberContext.renderTargetHandle;
184 const auto viewportHandle = memberContext.viewportHandle;
185
186 const auto entity = updateContext.find<TMemberHandle>(memberContext.memberHandle);
187 assert(entity && "Unexpected missing entity");
188
190 assert(renderPrototype && "Unexpected missing RenderPrototypeComponent");
191
192 if (!renderBatchContext ||
193 memberContext.renderTargetHandle != renderBatchContext->renderTargetHandle ||
194 memberContext.viewportHandle != renderBatchContext->viewportHandle ||
195 sceneHandle != renderBatchContext->sceneHandle ||
196 renderPrototype->meshHandle() != renderBatchContext->meshHandle ||
197 renderPrototype->materialHandle() != renderBatchContext->materialHandle ||
198 renderPrototype->shaderHandle() != renderBatchContext->shaderHandle) {
199
201
202 renderBatchContext.emplace(
203 memberContext.renderTargetHandle,
204 viewportHandle,
205 sceneHandle,
206 renderPrototype->meshHandle(),
207 renderPrototype->materialHandle(),
208 renderPrototype->shaderHandle()
209 );
210 }
211
212 renderBatchContext->memberHandles.push_back(memberContext.memberHandle);
213 renderBatchContext->instanceData.push_back({memberContext.worldMatrix});
214 }
215 }
216
218 }

dispatchNonInstancedRenderCommands()

template <typename TOwnerHandle, typename TMemberHandle, typename TCommandBuffer = NullCommandBuffer>
void helios::engine::scene::systems::SceneRenderSystem< TOwnerHandle, TMemberHandle, TCommandBuffer >::dispatchNonInstancedRenderCommands (UpdateContext & updateContext, std::span< const std::vector< SceneMemberVisibilityContext< TMemberHandle, NonInstanced > > > visibilityContexts, TCommandBuffer & cmdBuffer)
inline

Dispatches non-instanced member render commands.

Iterates visible non-instanced member contexts and emits one RenderSceneMemberCommand per member.

Parameters
updateContext

Current frame update context.

visibilityContexts

Visible non-instanced members grouped by viewport.

cmdBuffer

Command buffer receiving render commands.

Definition at line 115 of file SceneRenderSystem.ixx.

115 void dispatchNonInstancedRenderCommands(
119
120
121 for (const auto& viewportContexts : visibilityContexts) {
122
123 for (const auto& memberContext : viewportContexts) {
124 const auto sceneHandle = memberContext.sceneHandle;
125 const auto renderTargetHandle = memberContext.renderTargetHandle;
126 const auto viewportHandle = memberContext.viewportHandle;
127
128 const auto entity = updateContext.find<TMemberHandle>(memberContext.memberHandle);
129 assert(entity && "Unexpected missing entity");
130
132 assert(renderPrototype && "Unexpected missing RenderPrototypeComponent");
133
136 renderTargetHandle,
137 viewportHandle,
138 sceneHandle,
139 renderPrototype->meshHandle(),
140 renderPrototype->materialHandle(),
141 renderPrototype->shaderHandle(),
142 memberContext.worldMatrix
143 });
144 }
145 }
146 }

Private Member Attributes

visibilityRegistry_

template <typename TOwnerHandle, typename TMemberHandle, typename TCommandBuffer = NullCommandBuffer>
SceneMemberVisibilityRegistry<TMemberHandle>& helios::engine::scene::systems::SceneRenderSystem< TOwnerHandle, TMemberHandle, TCommandBuffer >::visibilityRegistry_

Central per-frame visibility snapshot consumed by this system.

Filled by SceneMemberVisibilitySystem and read-only in this stage.

Definition at line 102 of file SceneRenderSystem.ixx.

Private Static Attributes

logger_

template <typename TOwnerHandle, typename TMemberHandle, typename TCommandBuffer = NullCommandBuffer>
auto& helios::engine::scene::systems::SceneRenderSystem< TOwnerHandle, TMemberHandle, TCommandBuffer >::logger_ = helios::engine::util::log::LogManager::loggerForScope(HELIOS_LOG_SCOPE)
static

Definition at line 95 of file SceneRenderSystem.ixx.


The documentation for this class was generated from the following file:


Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.