PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
prefab_transform_overrides_component.h
1#pragma once
2
3#include "pixelbullet/scene/entity_id.h"
4#include "pixelbullet/scene/components/transform.h"
5#include "pixelbullet/serialization/node.h"
6
7#include <algorithm>
8#include <vector>
9
10namespace pixelbullet
11{
12namespace prefab_transform_overrides_component_internal
13{
14[[nodiscard]] inline bool TransformValuesEqual(const Transform& lhs, const Transform& rhs) noexcept
15{
16 return lhs.position == rhs.position && lhs.rotation == rhs.rotation && lhs.scale == rhs.scale;
17}
18} // namespace prefab_transform_overrides_component_internal
19
21{
22 EntityId prefab_entity = EntityId::Invalid();
23 Transform transform{};
24
25 [[nodiscard]] bool operator==(const PrefabTransformOverrideEntry& other) const noexcept
26 {
27 return prefab_entity == other.prefab_entity &&
28 prefab_transform_overrides_component_internal::TransformValuesEqual(transform, other.transform);
29 }
30};
31
32inline void NormalizePrefabTransformOverrideEntries(std::vector<PrefabTransformOverrideEntry>& overrides)
33{
34 std::vector<PrefabTransformOverrideEntry> normalized;
35 normalized.reserve(overrides.size());
36 for (PrefabTransformOverrideEntry& override_entry : overrides)
37 {
38 if (!override_entry.prefab_entity)
39 {
40 continue;
41 }
42
43 std::erase_if(normalized, [&](const PrefabTransformOverrideEntry& existing)
44 { return existing.prefab_entity == override_entry.prefab_entity; });
45 normalized.push_back(std::move(override_entry));
46 }
47
48 overrides = std::move(normalized);
49}
50
51inline Node& operator<<(Node& node, const PrefabTransformOverrideEntry& entry)
52{
53 node["entity"] << entry.prefab_entity;
54 node["transform"] << entry.transform;
55 return node;
56}
57
58inline const Node& operator>>(const Node& node, PrefabTransformOverrideEntry& entry)
59{
60 if (node.HasProperty("entity"))
61 {
62 node["entity"] >> entry.prefab_entity;
63 }
64 else
65 {
66 entry.prefab_entity = EntityId::Invalid();
67 }
68
69 if (node.HasProperty("transform"))
70 {
71 node["transform"] >> entry.transform;
72 }
73 else
74 {
75 entry.transform = Transform{};
76 }
77
78 return node;
79}
80
82{
83 std::vector<PrefabTransformOverrideEntry> transform_overrides;
84
85 [[nodiscard]] const PrefabTransformOverrideEntry* FindTransformOverride(const EntityId prefab_entity) const noexcept
86 {
87 const auto it =
88 std::find_if(transform_overrides.begin(), transform_overrides.end(),
89 [&](const PrefabTransformOverrideEntry& entry) { return entry.prefab_entity == prefab_entity; });
90 return it == transform_overrides.end() ? nullptr : &(*it);
91 }
92
93 [[nodiscard]] bool operator==(const PrefabTransformOverridesComponent& other) const noexcept
94 {
95 return transform_overrides == other.transform_overrides;
96 }
97};
98
99inline Node& operator<<(Node& node, const PrefabTransformOverridesComponent& component)
100{
101 if (!component.transform_overrides.empty())
102 {
103 node["transformOverrides"] << component.transform_overrides;
104 }
105 return node;
106}
107
108inline const Node& operator>>(const Node& node, PrefabTransformOverridesComponent& component)
109{
110 if (node.HasProperty("transformOverrides"))
111 {
112 node["transformOverrides"] >> component.transform_overrides;
113 }
114 else
115 {
116 component.transform_overrides.clear();
117 }
118
119 NormalizePrefabTransformOverrideEntries(component.transform_overrides);
120 return node;
121}
122} // namespace pixelbullet
Definition entity_id.h:11
Represents a hierarchical node capable of storing various data types and supporting YAML serializatio...
Definition node.h:45
Definition prefab_transform_overrides_component.h:21
Definition prefab_transform_overrides_component.h:82
Definition transform.h:14