Skip to main content

SceneMemberVisibilityRegistry.ixx File

Registry for visible and culled scene members grouped by viewport and submission mode. More...

Included Headers

Namespaces Index

namespacehelios
namespaceengine
namespacescene

Classes Index

classSceneMemberVisibilityRegistry<TMemberHandle>

Stores per-viewport visibility/culling results for scene members. More...

structRenderTargetViewportSceneKey

Description

Registry for visible and culled scene members grouped by viewport and submission mode.

File Listing

The file content with the documentation metadata removed is:

1
5module;
6
8#include <span>
9#include <cstdint>
10#include <vector>
11
12export module helios.engine.scene.SceneMemberVisibilityRegistry;
13
14import helios.engine.core.container.HandleManyToManyMap;
15
16import helios.engine.scene.types;
17
18import helios.engine.rendering.common.types;
19import helios.engine.rendering.viewport.types;
20import helios.engine.rendering.renderTarget.types;
21
24using namespace helios::engine::scene::types;
28
29namespace {
30 template<class>
31 inline constexpr bool always_false_v = false;
32}
33
34export namespace helios::engine::scene {
35
36
45 template<typename TMemberHandle>
47
48
49 struct RenderTargetViewportSceneKey {
50 std::uint32_t a;
51 std::uint32_t b;
52 std::uint32_t c;
53
54 friend bool operator==(const RenderTargetViewportSceneKey&, const RenderTargetViewportSceneKey&) = default;
55 };
56
57 std::vector<RenderTargetViewportSceneKey> renderTargetViewportSceneKeys_;
58
59 std::vector<std::vector<SceneMemberVisibilityContext<TMemberHandle, Instanced>>> visibilityContextsInstanced_;
60 std::vector<std::vector<SceneMemberVisibilityContext<TMemberHandle, Instanced>>> culledContextsInstanced_;
61
62 std::vector<std::vector<SceneMemberVisibilityContext<TMemberHandle, NonInstanced>>> visibilityContextsNonInstanced_;
63 std::vector<std::vector<SceneMemberVisibilityContext<TMemberHandle, NonInstanced>>> culledContextsNonInstanced_;
64
65 std::vector<SceneRenderContext<TMemberHandle>> sceneRenderContexts_;
66
67
68 public:
69
74 visibilityContextsInstanced_.reserve(DEFAULT_VIEWPORT_POOL_CAPACITY);
75 for (auto& vec : visibilityContextsInstanced_) {
77 }
78 culledContextsInstanced_.reserve(DEFAULT_VIEWPORT_POOL_CAPACITY);
79 for (auto& vec : culledContextsInstanced_) {
81 }
82 visibilityContextsNonInstanced_.reserve(DEFAULT_VIEWPORT_POOL_CAPACITY);
83 for (auto& vec : visibilityContextsNonInstanced_) {
85 }
86 culledContextsNonInstanced_.reserve(DEFAULT_VIEWPORT_POOL_CAPACITY);
87 for (auto& vec : culledContextsNonInstanced_) {
89 }
90
91 sceneRenderContexts_.reserve(DEFAULT_VIEWPORT_POOL_CAPACITY);
92 }
93
94
100
101 for (const auto& existingContext : sceneRenderContexts_) {
102 if (existingContext == context) {
103 return;
104 }
105 }
106
107 sceneRenderContexts_.push_back(std::move(context));
108 }
109
113 [[nodiscard]] std::span<const SceneRenderContext<TMemberHandle>> sceneRenderContexts() const noexcept {
114 return sceneRenderContexts_;
115 }
116
117
118
125 template<typename TSubmissionMode>
127 const auto idx = viewportHandle.entityId;
128 if constexpr (std::is_same_v<TSubmissionMode, NonInstanced>) {
129 if (culledContextsNonInstanced_.size() <= idx) {
130 culledContextsNonInstanced_.resize(idx + 1);
131 }
132 culledContextsNonInstanced_[idx].emplace_back(std::move(context));
133 } else if constexpr (std::is_same_v<TSubmissionMode, Instanced>) {
134 if (culledContextsInstanced_.size() <= idx) {
135 culledContextsInstanced_.resize(idx + 1);
136 }
137 culledContextsInstanced_[idx].emplace_back(std::move(context));
138 } else {
139 static_assert(false, "Unsupported submission mode");
140 }
141 }
142
143
150 template<typename TSubmissionMode>
152
153 const auto idx = viewportHandle.entityId;
154
155 if constexpr (std::is_same_v<TSubmissionMode, Instanced>) {
156 if (visibilityContextsInstanced_.size() <= idx) {
157 visibilityContextsInstanced_.resize(idx + 1);
158 }
159
160 visibilityContextsInstanced_[idx].emplace_back(std::move(context));
161 } else if constexpr (std::is_same_v<TSubmissionMode, NonInstanced>) {
162 if (visibilityContextsNonInstanced_.size() <= idx) {
163 visibilityContextsNonInstanced_.resize(idx + 1);
164 }
165
166 visibilityContextsNonInstanced_[idx].emplace_back(std::move(context));
167 } else {
168 static_assert(always_false_v<TSubmissionMode>, "Unsupported submission mode");
169 }
170
171 }
172
178 template<typename TSubmissionMode>
179 [[nodiscard]] std::span<SceneMemberVisibilityContext<TMemberHandle, TSubmissionMode>> culledMembers(const ViewportHandle viewportHandle = {}) {
180 const auto idx = viewportHandle.entityId;
181 if constexpr (std::is_same_v<TSubmissionMode, NonInstanced>) {
182 if (idx >= culledContextsNonInstanced_.size()) {
183 return {};
184 }
185 return culledContextsNonInstanced_[idx];
186 } else if constexpr (std::is_same_v<TSubmissionMode, Instanced>) {
187 if (idx >= culledContextsInstanced_.size()) {
188 return {};
189 }
190 return culledContextsInstanced_[idx];
191 } else {
192 static_assert(always_false_v<TSubmissionMode>, "Unsupported submission mode");
193 }
194 return {};
195 }
196
201 template<typename TSubmissionMode>
202 [[nodiscard]] std::span<std::vector<SceneMemberVisibilityContext<TMemberHandle, TSubmissionMode>>> culledMembers() const {
203 if constexpr (std::is_same_v<TSubmissionMode, NonInstanced>) {
204 return culledContextsNonInstanced_;
205 } else if constexpr (std::is_same_v<TSubmissionMode, Instanced>) {
206 return culledContextsInstanced_;
207 } else {
208 static_assert(always_false_v<TSubmissionMode>, "Unsupported submission mode");
209 }
210 return {};
211 }
212
218 template<typename TSubmissionMode>
219 [[nodiscard]] std::span<SceneMemberVisibilityContext<TMemberHandle, TSubmissionMode>> visibleMembers(const ViewportHandle viewportHandle) {
220 const auto idx = viewportHandle.entityId;
221
222 if constexpr (std::is_same_v<TSubmissionMode, NonInstanced>) {
223 if (idx >= visibilityContextsNonInstanced_.size()) {
224 return {};
225 }
226 return visibilityContextsNonInstanced_[idx];
227 } else if constexpr (std::is_same_v<TSubmissionMode, Instanced>) {
228 if (idx >= visibilityContextsInstanced_.size()) {
229 return {};
230 }
231 return visibilityContextsInstanced_[idx];
232 } else {
233 static_assert(always_false_v<TSubmissionMode>, "Unsupported submission mode");
234 }
235 return {};
236 }
237
242 template<typename TSubmissionMode>
243 [[nodiscard]] std::span<std::vector<SceneMemberVisibilityContext<TMemberHandle, TSubmissionMode>>> visibleMembers() {
244 if constexpr (std::is_same_v<TSubmissionMode, NonInstanced>) {
245 return visibilityContextsNonInstanced_;
246 } else if constexpr (std::is_same_v<TSubmissionMode, Instanced>) {
247 return visibilityContextsInstanced_;
248 } else {
249 static_assert(always_false_v<TSubmissionMode>, "Unsupported submission mode");
250 }
251 return {};
252 }
253
257 void clear () {
258 sceneRenderContexts_.clear();
259 for (auto& vec : visibilityContextsInstanced_) {
260 vec.clear();
261 }
262 for (auto& vec : visibilityContextsNonInstanced_) {
263 vec.clear();
264 }
265 for (auto& vec : culledContextsInstanced_) {
266 vec.clear();
267 }
268 for (auto& vec : culledContextsNonInstanced_) {
269 vec.clear();
270 }
271 }
272 };
273
274
275}

Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.