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/transform_resolution.h"
6
7#include <glm/glm.hpp>
8
9#include <cstddef>
10#include <functional>
11#include <memory>
12#include <optional>
13#include <string>
14#include <unordered_map>
15#include <vector>
16
17namespace pixelbullet
18{
19class Filesystem;
20class Scene;
21
23
25{
26 EntityId wrapper_prefab_entity = EntityId::Invalid();
27 VirtualPath prefab_path;
28 std::shared_ptr<const PrefabAsset> prefab;
29 SceneResolvedTransforms resolved_transforms;
30 SceneMorphWeightOverrides resolved_morph_weights;
31 glm::mat4 wrapper_world_matrix = glm::mat4(1.0f);
32 std::vector<ResolvedNestedPrefabInstance> nested_instances;
33
34 [[nodiscard]] bool IsValid() const noexcept
35 {
36 return wrapper_prefab_entity && prefab && prefab->IsValid();
37 }
38};
39
41{
42 EntityId instance_entity = EntityId::Invalid();
43 VirtualPath prefab_path;
44 std::shared_ptr<const PrefabAsset> prefab;
45 SceneResolvedTransforms resolved_transforms;
46 SceneMorphWeightOverrides resolved_morph_weights;
47 glm::mat4 wrapper_world_matrix = glm::mat4(1.0f);
48 std::vector<ResolvedNestedPrefabInstance> nested_instances;
49
50 [[nodiscard]] bool IsValid() const noexcept
51 {
52 return instance_entity && prefab && prefab->IsValid();
53 }
54};
55
57{
58 EntityId::ValueType root_instance = EntityId::Invalid().Raw();
59 std::vector<EntityId::ValueType> wrapper_path;
60
61 [[nodiscard]] bool operator==(const SceneNestedPrefabOverrideKey&) const = default;
62};
63
65{
66 [[nodiscard]] std::size_t operator()(const SceneNestedPrefabOverrideKey& key) const noexcept
67 {
68 std::size_t seed = std::hash<EntityId::ValueType>{}(key.root_instance);
69 for (const EntityId::ValueType path_entity : key.wrapper_path)
70 {
71 seed ^= std::hash<EntityId::ValueType>{}(path_entity) + 0x9e3779b9u + (seed << 6u) + (seed >> 2u);
72 }
73 return seed;
74 }
75};
76
77[[nodiscard]] inline SceneNestedPrefabOverrideKey MakeSceneNestedPrefabOverrideKey(EntityId root_instance,
78 const std::vector<EntityId>& wrapper_path)
79{
81 key.root_instance = root_instance.Raw();
82 key.wrapper_path.reserve(wrapper_path.size());
83 for (const EntityId wrapper : wrapper_path)
84 {
85 key.wrapper_path.push_back(wrapper.Raw());
86 }
87 return key;
88}
89
91{
92 std::unordered_map<EntityId::ValueType, SceneTransformOverrides> values;
93 std::unordered_map<SceneNestedPrefabOverrideKey, SceneTransformOverrides, SceneNestedPrefabOverrideKeyHash> nested_values;
94
95 [[nodiscard]] bool Empty() const noexcept
96 {
97 return values.empty() && nested_values.empty();
98 }
99
100 [[nodiscard]] const SceneTransformOverrides* Find(EntityId instance_entity) const noexcept
101 {
102 const auto it = values.find(instance_entity.Raw());
103 return it == values.end() ? nullptr : &it->second;
104 }
105
106 [[nodiscard]] const SceneTransformOverrides* FindNested(EntityId root_instance, const std::vector<EntityId>& wrapper_path) const
107 {
108 const SceneNestedPrefabOverrideKey key = MakeSceneNestedPrefabOverrideKey(root_instance, wrapper_path);
109 const auto it = nested_values.find(key);
110 return it == nested_values.end() ? nullptr : &it->second;
111 }
112
113 [[nodiscard]] SceneTransformOverrides& EnsureNested(EntityId root_instance, const std::vector<EntityId>& wrapper_path)
114 {
115 return nested_values.try_emplace(MakeSceneNestedPrefabOverrideKey(root_instance, wrapper_path), SceneTransformOverrides{})
116 .first->second;
117 }
118};
119
121{
122 std::unordered_map<EntityId::ValueType, SceneMorphWeightOverrides> values;
123 std::unordered_map<SceneNestedPrefabOverrideKey, SceneMorphWeightOverrides, SceneNestedPrefabOverrideKeyHash> nested_values;
124
125 [[nodiscard]] bool Empty() const noexcept
126 {
127 return values.empty() && nested_values.empty();
128 }
129
130 [[nodiscard]] const SceneMorphWeightOverrides* Find(EntityId instance_entity) const noexcept
131 {
132 const auto it = values.find(instance_entity.Raw());
133 return it == values.end() ? nullptr : &it->second;
134 }
135
136 [[nodiscard]] const SceneMorphWeightOverrides* FindNested(EntityId root_instance, const std::vector<EntityId>& wrapper_path) const
137 {
138 const SceneNestedPrefabOverrideKey key = MakeSceneNestedPrefabOverrideKey(root_instance, wrapper_path);
139 const auto it = nested_values.find(key);
140 return it == nested_values.end() ? nullptr : &it->second;
141 }
142
143 [[nodiscard]] SceneMorphWeightOverrides& EnsureNested(EntityId root_instance, const std::vector<EntityId>& wrapper_path)
144 {
145 return nested_values.try_emplace(MakeSceneNestedPrefabOverrideKey(root_instance, wrapper_path), SceneMorphWeightOverrides{})
146 .first->second;
147 }
148};
149
151{
152 float load_prefab_assets_milliseconds = 0.0f;
153 float evaluate_prefab_animation_milliseconds = 0.0f;
154 float resolve_prefab_transforms_milliseconds = 0.0f;
155 float build_resolved_instances_milliseconds = 0.0f;
156};
157
159{
160 std::string skeleton_clip_name;
161 float time_seconds = 0.0f;
162};
163
165{
166public:
167 [[nodiscard]] static std::vector<ResolvedPrefabInstance>
168 ResolveInstances(const Scene& scene, const Filesystem& filesystem, const SceneTransformOverrides* scene_transform_overrides = nullptr,
169 const ScenePrefabTransformOverrides* prefab_transform_overrides = nullptr,
170 const ScenePrefabMorphWeightOverrides* prefab_morph_weight_overrides = nullptr,
171 std::optional<float> prefab_time_seconds = std::nullopt, ScenePrefabResolutionTimings* timings = nullptr,
172 const ScenePrefabAnimationPreview* prefab_animation_preview = nullptr);
173};
174} // namespace pixelbullet
Definition entity_id.h:11
Definition filesystem.h:19
Definition prefab_resolution.h:165
Definition scene.h:30
Definition virtual_path.h:10
Definition prefab_resolution.h:25
Definition prefab_resolution.h:41
Definition animation_evaluation.h:105
Definition prefab_resolution.h:65
Definition prefab_resolution.h:57
Definition prefab_resolution.h:159
Definition prefab_resolution.h:121
Definition prefab_resolution.h:151
Definition prefab_resolution.h:91
Definition transform_resolution.h:17
Definition animation_evaluation.h:19