PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
prefab_behavior_overrides_component.h
1#pragma once
2
3#include "pixelbullet/scene/behavior_state_machine_asset.h"
4#include "pixelbullet/serialization/node.h"
5
6#include <algorithm>
7#include <vector>
8
9namespace pixelbullet
10{
12{
13 EntityId prefab_entity = EntityId::Invalid();
14 std::vector<BehaviorStringParameterValue> string_parameter_overrides;
15
16 [[nodiscard]] bool operator==(const PrefabBehaviorOverrideEntry&) const noexcept = default;
17};
18
19inline void NormalizePrefabBehaviorOverrideEntries(std::vector<PrefabBehaviorOverrideEntry>& overrides)
20{
21 std::vector<PrefabBehaviorOverrideEntry> normalized;
22 normalized.reserve(overrides.size());
23 for (PrefabBehaviorOverrideEntry& override_entry : overrides)
24 {
25 NormalizeBehaviorStringParameterOverrides(override_entry.string_parameter_overrides);
26 if (!override_entry.prefab_entity || override_entry.string_parameter_overrides.empty())
27 {
28 continue;
29 }
30
31 std::erase_if(normalized, [&](const PrefabBehaviorOverrideEntry& existing)
32 { return existing.prefab_entity == override_entry.prefab_entity; });
33 normalized.push_back(std::move(override_entry));
34 }
35
36 overrides = std::move(normalized);
37}
38
39inline Node& operator<<(Node& node, const PrefabBehaviorOverrideEntry& entry)
40{
41 node["entity"] << entry.prefab_entity;
42 if (!entry.string_parameter_overrides.empty())
43 {
44 node["stringParameterOverrides"] << entry.string_parameter_overrides;
45 }
46 return node;
47}
48
49inline const Node& operator>>(const Node& node, PrefabBehaviorOverrideEntry& entry)
50{
51 if (node.HasProperty("entity"))
52 {
53 node["entity"] >> entry.prefab_entity;
54 }
55 else
56 {
57 entry.prefab_entity = EntityId::Invalid();
58 }
59
60 if (node.HasProperty("stringParameterOverrides"))
61 {
62 node["stringParameterOverrides"] >> entry.string_parameter_overrides;
63 }
64 else
65 {
66 entry.string_parameter_overrides.clear();
67 }
68
69 NormalizeBehaviorStringParameterOverrides(entry.string_parameter_overrides);
70 return node;
71}
72
74{
75 std::vector<PrefabBehaviorOverrideEntry> behavior_overrides;
76
77 [[nodiscard]] const PrefabBehaviorOverrideEntry* FindBehaviorOverride(const EntityId prefab_entity) const noexcept
78 {
79 const auto it = std::find_if(behavior_overrides.begin(), behavior_overrides.end(),
80 [&](const PrefabBehaviorOverrideEntry& entry) { return entry.prefab_entity == prefab_entity; });
81 return it == behavior_overrides.end() ? nullptr : &(*it);
82 }
83
84 [[nodiscard]] bool operator==(const PrefabBehaviorOverridesComponent&) const noexcept = default;
85};
86
87inline Node& operator<<(Node& node, const PrefabBehaviorOverridesComponent& component)
88{
89 if (!component.behavior_overrides.empty())
90 {
91 node["behaviorOverrides"] << component.behavior_overrides;
92 }
93 return node;
94}
95
96inline const Node& operator>>(const Node& node, PrefabBehaviorOverridesComponent& component)
97{
98 if (node.HasProperty("behaviorOverrides"))
99 {
100 node["behaviorOverrides"] >> component.behavior_overrides;
101 }
102 else
103 {
104 component.behavior_overrides.clear();
105 }
106
107 NormalizePrefabBehaviorOverrideEntries(component.behavior_overrides);
108 return node;
109}
110} // 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_behavior_overrides_component.h:12
Definition prefab_behavior_overrides_component.h:74