3#include "pixelbullet/scene/behavior_state_machine_types.h"
14inline void NormalizeBehaviorBindingSlots(std::vector<std::string>& binding_slots)
16 std::vector<std::string> normalized;
17 normalized.reserve(binding_slots.size());
18 for (std::string& slot_name : binding_slots)
20 if (slot_name.empty())
25 if (std::find(normalized.begin(), normalized.end(), slot_name) == normalized.end())
27 normalized.push_back(std::move(slot_name));
31 binding_slots = std::move(normalized);
34inline void NormalizeBehaviorStringParameters(std::vector<BehaviorStringParameterDeclaration>& parameters)
36 std::vector<BehaviorStringParameterDeclaration> normalized;
37 normalized.reserve(parameters.size());
40 if (parameter.name.empty())
45 const auto existing = std::find_if(normalized.begin(), normalized.end(),
47 { return candidate.name == parameter.name; });
48 if (existing == normalized.end())
50 normalized.push_back(std::move(parameter));
54 *existing = std::move(parameter);
58 parameters = std::move(normalized);
61inline void NormalizeBehaviorStringParameterOverrides(std::vector<BehaviorStringParameterValue>& overrides)
63 std::vector<BehaviorStringParameterValue> normalized;
64 normalized.reserve(overrides.size());
67 if (override_value.name.empty())
72 const auto existing = std::find_if(normalized.begin(), normalized.end(),
74 { return candidate.name == override_value.name; });
75 if (existing == normalized.end())
77 normalized.push_back(std::move(override_value));
81 *existing = std::move(override_value);
85 overrides = std::move(normalized);
88inline void NormalizeBehaviorBindings(std::vector<BehaviorBinding>& bindings)
90 std::vector<BehaviorBinding> normalized;
91 normalized.reserve(bindings.size());
94 if (binding.slot_name.empty())
99 const auto existing = std::find_if(normalized.begin(), normalized.end(),
100 [&](
const BehaviorBinding& candidate) { return candidate.slot_name == binding.slot_name; });
101 if (existing == normalized.end())
103 normalized.push_back(std::move(binding));
107 *existing = std::move(binding);
111 bindings = std::move(normalized);
116 std::vector<BehaviorEditorGraphNodeLayout> normalized;
117 normalized.reserve(layout.nodes.size());
120 if (node.state_name.empty())
126 { return candidate.state_name == node.state_name; });
127 if (existing == normalized.end())
129 normalized.push_back(std::move(node));
133 *existing = std::move(node);
137 layout.nodes = std::move(normalized);
142 NormalizeBehaviorStringParameters(asset.string_parameters);
143 NormalizeBehaviorBindingSlots(asset.binding_slots);
144 if (asset.editor_graph)
146 NormalizeBehaviorEditorGraphLayout(*asset.editor_graph);
147 if (asset.editor_graph->Empty())
149 asset.editor_graph.reset();
152 if (asset.initial_state.empty() && !asset.states.empty())
154 asset.initial_state = asset.states.front().name;
161 const auto it = std::find_if(asset.string_parameters.begin(), asset.string_parameters.end(),
163 return it == asset.string_parameters.end() ? nullptr : &(*it);
167 const std::string_view parameter_name)
169 const auto it = std::find_if(asset.string_parameters.begin(), asset.string_parameters.end(),
171 return it == asset.string_parameters.end() ? nullptr : &(*it);
177 const auto it = std::find_if(asset.variables.begin(), asset.variables.end(),
179 return it == asset.variables.end() ? nullptr : &(*it);
183 const std::string_view variable_name)
185 const auto it = std::find_if(asset.variables.begin(), asset.variables.end(),
187 return it == asset.variables.end() ? nullptr : &(*it);
191 const std::string_view state_name)
193 for (std::size_t index = 0; index < asset.states.size(); ++index)
195 if (asset.states[index].name == state_name)
206 const auto index = FindBehaviorStateIndex(asset, state_name);
207 return index ? &asset.states[*index] :
nullptr;
212 const auto index = FindBehaviorStateIndex(asset, state_name);
213 return index ? &asset.states[*index] :
nullptr;
217 const std::string_view state_name)
219 if (!asset.editor_graph)
224 const auto it = std::find_if(asset.editor_graph->nodes.begin(), asset.editor_graph->nodes.end(),
226 return it == asset.editor_graph->nodes.end() ? nullptr : &(*it);
230 const std::string_view state_name)
232 if (!asset.editor_graph)
237 const auto it = std::find_if(asset.editor_graph->nodes.begin(), asset.editor_graph->nodes.end(),
239 return it == asset.editor_graph->nodes.end() ? nullptr : &(*it);
244 if (!asset.editor_graph)
255 .state_name = std::move(state_name),
256 .position = glm::vec2(0.0f),
258 return asset.editor_graph->nodes.back();
269 const std::string previous_name = state->name;
270 state->name = std::move(new_name);
272 if (asset.initial_state == previous_name)
274 asset.initial_state = state->name;
281 if (transition.target_state == previous_name)
283 transition.target_state = state->name;
290 layout->state_name = state->name;
298 const auto state_it =
299 std::find_if(asset.states.begin(), asset.states.end(), [&](
const BehaviorState& state) { return state.name == state_name; });
300 if (state_it == asset.states.end())
305 const bool deleted_initial_state = asset.initial_state == state_it->name;
306 const std::string deleted_name = state_it->name;
307 asset.states.erase(state_it);
311 std::erase_if(state.transitions, [&](
const BehaviorTransition& transition) { return transition.target_state == deleted_name; });
314 if (asset.editor_graph)
316 std::erase_if(asset.editor_graph->nodes,
318 if (asset.editor_graph->nodes.empty())
320 asset.editor_graph.reset();
324 if (deleted_initial_state)
326 asset.initial_state = asset.states.empty() ? std::string{} : asset.states.front().name;
Definition behavior_state_machine_types.h:266
Definition behavior_state_machine_types.h:282
Definition behavior_state_machine_types.h:274
Definition behavior_state_machine_types.h:294
Definition behavior_state_machine_types.h:257
Definition behavior_state_machine_types.h:102
Definition behavior_state_machine_types.h:110
Definition behavior_state_machine_types.h:248
Definition behavior_state_machine_types.h:91