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/components/transform.h"
4#include "pixelbullet/scene/entity_id.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,
44 [&](const PrefabTransformOverrideEntry& existing) { 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.has_property("entity"))
61 {
62 node["entity"] >> entry.prefab_entity;
63 }
64 else
65 {
66 entry.prefab_entity = EntityId::Invalid();
67 }
68
69 if (node.has_property("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 = std::find_if(transform_overrides.begin(), transform_overrides.end(),
88 [&](const PrefabTransformOverrideEntry& entry) { return entry.prefab_entity == prefab_entity; });
89 return it == transform_overrides.end() ? nullptr : &(*it);
90 }
91
92 [[nodiscard]] bool operator==(const PrefabTransformOverridesComponent& other) const noexcept
93 {
94 return transform_overrides == other.transform_overrides;
95 }
96};
97
98inline Node& operator<<(Node& node, const PrefabTransformOverridesComponent& component)
99{
100 if (!component.transform_overrides.empty())
101 {
102 node["transformOverrides"] << component.transform_overrides;
103 }
104 return node;
105}
106
107inline const Node& operator>>(const Node& node, PrefabTransformOverridesComponent& component)
108{
109 if (node.has_property("transformOverrides"))
110 {
111 node["transformOverrides"] >> component.transform_overrides;
112 }
113 else
114 {
115 component.transform_overrides.clear();
116 }
117
118 NormalizePrefabTransformOverrideEntries(component.transform_overrides);
119 return node;
120}
121} // namespace pixelbullet
Definition entity_id.h:11
Represents a hierarchical node capable of storing various data types and supporting YAML serializatio...
Definition node.h:49
Definition prefab_transform_overrides_component.h:21
Definition prefab_transform_overrides_component.h:82
Definition transform.h:14