PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
prefab_resolution.h
1#pragma once
2
3#include "pixelbullet/filesystem/virtual_path.h"
4#include "pixelbullet/scene/prefab_asset.h"
5#include "pixelbullet/scene/prefab_asset_io.h"
6#include "pixelbullet/scene/transform_resolution.h"
7
8#include <glm/glm.hpp>
9
10#include <cstddef>
11#include <cstdint>
12#include <functional>
13#include <memory>
14#include <optional>
15#include <string>
16#include <unordered_map>
17#include <vector>
18
19namespace pixelbullet
20{
21class Filesystem;
22class Scene;
23
25
27{
28 EntityId wrapper_prefab_entity = EntityId::Invalid();
29 VirtualPath prefab_path;
30 std::shared_ptr<const PrefabAsset> prefab;
31 SceneResolvedTransforms resolved_transforms;
32 SceneMorphWeightOverrides resolved_morph_weights;
33 glm::mat4 wrapper_world_matrix = glm::mat4(1.0f);
34 std::vector<ResolvedNestedPrefabInstance> nested_instances;
35
36 [[nodiscard]] bool IsValid() const noexcept
37 {
38 return wrapper_prefab_entity && prefab && prefab->IsValid();
39 }
40};
41
43{
44 EntityId instance_entity = EntityId::Invalid();
45 VirtualPath prefab_path;
46 std::shared_ptr<const PrefabAsset> prefab;
47 SceneResolvedTransforms resolved_transforms;
48 SceneMorphWeightOverrides resolved_morph_weights;
49 glm::mat4 wrapper_world_matrix = glm::mat4(1.0f);
50 std::vector<ResolvedNestedPrefabInstance> nested_instances;
51
52 [[nodiscard]] bool IsValid() const noexcept
53 {
54 return instance_entity && prefab && prefab->IsValid();
55 }
56};
57
59{
60 EntityId::ValueType root_instance = EntityId::Invalid().Raw();
61 std::vector<EntityId::ValueType> wrapper_path;
62
63 [[nodiscard]] bool operator==(const SceneNestedPrefabOverrideKey&) const = default;
64};
65
67{
68 [[nodiscard]] std::size_t operator()(const SceneNestedPrefabOverrideKey& key) const noexcept
69 {
70 std::size_t seed = std::hash<EntityId::ValueType>{}(key.root_instance);
71 for (const EntityId::ValueType path_entity : key.wrapper_path)
72 {
73 seed ^= std::hash<EntityId::ValueType>{}(path_entity) + 0x9e3779b9u + (seed << 6u) + (seed >> 2u);
74 }
75 return seed;
76 }
77};
78
79[[nodiscard]] inline SceneNestedPrefabOverrideKey MakeSceneNestedPrefabOverrideKey(EntityId root_instance,
80 const std::vector<EntityId>& wrapper_path)
81{
83 key.root_instance = root_instance.Raw();
84 key.wrapper_path.reserve(wrapper_path.size());
85 for (const EntityId wrapper : wrapper_path)
86 {
87 key.wrapper_path.push_back(wrapper.Raw());
88 }
89 return key;
90}
91
93{
94 std::unordered_map<EntityId::ValueType, SceneTransformOverrides> values;
95 std::unordered_map<SceneNestedPrefabOverrideKey, SceneTransformOverrides, SceneNestedPrefabOverrideKeyHash> nested_values;
96
97 [[nodiscard]] bool Empty() const noexcept
98 {
99 return values.empty() && nested_values.empty();
100 }
101
102 [[nodiscard]] const SceneTransformOverrides* Find(EntityId instance_entity) const noexcept
103 {
104 const auto it = values.find(instance_entity.Raw());
105 return it == values.end() ? nullptr : &it->second;
106 }
107
108 [[nodiscard]] const SceneTransformOverrides* FindNested(EntityId root_instance, const std::vector<EntityId>& wrapper_path) const
109 {
110 const SceneNestedPrefabOverrideKey key = MakeSceneNestedPrefabOverrideKey(root_instance, wrapper_path);
111 const auto it = nested_values.find(key);
112 return it == nested_values.end() ? nullptr : &it->second;
113 }
114
115 [[nodiscard]] SceneTransformOverrides& EnsureNested(EntityId root_instance, const std::vector<EntityId>& wrapper_path)
116 {
117 return nested_values.try_emplace(MakeSceneNestedPrefabOverrideKey(root_instance, wrapper_path), SceneTransformOverrides{})
118 .first->second;
119 }
120};
121
123{
124 std::unordered_map<EntityId::ValueType, SceneMorphWeightOverrides> values;
125 std::unordered_map<SceneNestedPrefabOverrideKey, SceneMorphWeightOverrides, SceneNestedPrefabOverrideKeyHash> nested_values;
126
127 [[nodiscard]] bool Empty() const noexcept
128 {
129 return values.empty() && nested_values.empty();
130 }
131
132 [[nodiscard]] const SceneMorphWeightOverrides* Find(EntityId instance_entity) const noexcept
133 {
134 const auto it = values.find(instance_entity.Raw());
135 return it == values.end() ? nullptr : &it->second;
136 }
137
138 [[nodiscard]] const SceneMorphWeightOverrides* FindNested(EntityId root_instance, const std::vector<EntityId>& wrapper_path) const
139 {
140 const SceneNestedPrefabOverrideKey key = MakeSceneNestedPrefabOverrideKey(root_instance, wrapper_path);
141 const auto it = nested_values.find(key);
142 return it == nested_values.end() ? nullptr : &it->second;
143 }
144
145 [[nodiscard]] SceneMorphWeightOverrides& EnsureNested(EntityId root_instance, const std::vector<EntityId>& wrapper_path)
146 {
147 return nested_values.try_emplace(MakeSceneNestedPrefabOverrideKey(root_instance, wrapper_path), SceneMorphWeightOverrides{})
148 .first->second;
149 }
150};
151
153{
154 std::uint32_t root_instance_count = 0u;
155 std::uint32_t nested_instance_count = 0u;
156 std::uint32_t max_nested_depth = 0u;
157 std::uint32_t source_prefab_entity_count = 0u;
158 std::uint32_t transform_override_entry_count = 0u;
159 std::uint32_t morph_override_entry_count = 0u;
160 std::uint32_t nested_recursion_call_count = 0u;
161 float morph_override_apply_milliseconds = 0.0f;
162 float wrapper_world_matrix_milliseconds = 0.0f;
163 float root_instance_assembly_milliseconds = 0.0f;
164 float nested_instance_assembly_milliseconds = 0.0f;
165 float nested_traversal_milliseconds = 0.0f;
166 float nested_recursion_inclusive_milliseconds = 0.0f;
167 float instance_store_milliseconds = 0.0f;
168};
169
171{
172 float load_prefab_assets_milliseconds = 0.0f;
173 float evaluate_prefab_animation_milliseconds = 0.0f;
174 float resolve_prefab_transforms_milliseconds = 0.0f;
175 float build_resolved_instances_milliseconds = 0.0f;
176 PrefabAssetLoadStats prefab_asset_load_stats;
177 ScenePrefabResolvedInstanceStats resolved_instance_stats;
178};
179
181{
182 std::string skeleton_clip_name;
183 float time_seconds = 0.0f;
184};
185
187{
188public:
189 [[nodiscard]] static std::vector<ResolvedPrefabInstance>
190 ResolveInstances(const Scene& scene, const Filesystem& filesystem, const SceneTransformOverrides* scene_transform_overrides = nullptr,
191 const ScenePrefabTransformOverrides* prefab_transform_overrides = nullptr,
192 const ScenePrefabMorphWeightOverrides* prefab_morph_weight_overrides = nullptr,
193 std::optional<float> prefab_time_seconds = std::nullopt, ScenePrefabResolutionTimings* timings = nullptr,
194 const ScenePrefabAnimationPreview* prefab_animation_preview = nullptr);
195};
196} // namespace pixelbullet
Definition entity_id.h:12
Definition filesystem.h:20
Definition prefab_resolution.h:187
Definition scene.h:31
Definition virtual_path.h:10
Definition prefab_asset_io.h:59
Definition prefab_resolution.h:27
Definition prefab_resolution.h:43
Definition animation_evaluation.h:105
Definition prefab_resolution.h:67
Definition prefab_resolution.h:59
Definition prefab_resolution.h:181
Definition prefab_resolution.h:123
Definition prefab_resolution.h:171
Definition prefab_resolution.h:153
Definition prefab_resolution.h:93
Definition transform_resolution.h:17
Definition animation_evaluation.h:19