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.