summaryrefslogtreecommitdiffstats
path: root/scene/animation/animation_node_state_machine.h
diff options
context:
space:
mode:
Diffstat (limited to 'scene/animation/animation_node_state_machine.h')
-rw-r--r--scene/animation/animation_node_state_machine.h238
1 files changed, 152 insertions, 86 deletions
diff --git a/scene/animation/animation_node_state_machine.h b/scene/animation/animation_node_state_machine.h
index 5867b6c65a..757c6ddc68 100644
--- a/scene/animation/animation_node_state_machine.h
+++ b/scene/animation/animation_node_state_machine.h
@@ -100,88 +100,23 @@ public:
VARIANT_ENUM_CAST(AnimationNodeStateMachineTransition::SwitchMode)
VARIANT_ENUM_CAST(AnimationNodeStateMachineTransition::AdvanceMode)
-class AnimationNodeStateMachine;
-
-class AnimationNodeStateMachinePlayback : public Resource {
- GDCLASS(AnimationNodeStateMachinePlayback, Resource);
-
- friend class AnimationNodeStateMachine;
-
- struct AStarCost {
- float distance = 0.0;
- StringName prev;
- };
-
- struct Transition {
- StringName from;
- StringName to;
- StringName next;
- };
-
- double len_fade_from = 0.0;
- double pos_fade_from = 0.0;
-
- double len_current = 0.0;
- double pos_current = 0.0;
- bool end_loop = false;
-
- StringName current;
- Transition current_transition;
- Ref<Curve> current_curve;
- bool force_auto_advance = false;
-
- StringName fading_from;
- float fading_time = 0.0;
- float fading_pos = 0.0;
-
- Vector<StringName> path;
- bool playing = false;
-
- StringName start_request;
- StringName travel_request;
- bool reset_request = false;
- bool reset_request_on_teleport = false;
- bool next_request = false;
- bool stop_request = false;
-
- bool _travel(AnimationNodeStateMachine *p_state_machine, const StringName &p_travel);
- void _start(const StringName &p_state);
- double _process(AnimationNodeStateMachine *p_state_machine, double p_time, bool p_seek, bool p_is_external_seeking);
-
- double process(AnimationNodeStateMachine *p_state_machine, double p_time, bool p_seek, bool p_is_external_seeking);
-
- bool _check_advance_condition(const Ref<AnimationNodeStateMachine> p_state_machine, const Ref<AnimationNodeStateMachineTransition> p_transition) const;
-
-protected:
- static void _bind_methods();
-
-public:
- void travel(const StringName &p_state, bool p_reset_on_teleport = true);
- void start(const StringName &p_state, bool p_reset = true);
- void next();
- void stop();
- bool is_playing() const;
- StringName get_current_node() const;
- StringName get_fading_from_node() const;
- Vector<StringName> get_travel_path() const;
- float get_current_play_pos() const;
- float get_current_length() const;
-
- float get_fade_from_play_pos() const;
- float get_fade_from_length() const;
-
- float get_fading_time() const;
- float get_fading_pos() const;
-
- AnimationNodeStateMachinePlayback();
-};
+class AnimationNodeStateMachinePlayback;
class AnimationNodeStateMachine : public AnimationRootNode {
GDCLASS(AnimationNodeStateMachine, AnimationRootNode);
+public:
+ enum StateMachineType {
+ STATE_MACHINE_TYPE_ROOT,
+ STATE_MACHINE_TYPE_NESTED,
+ STATE_MACHINE_TYPE_GROUPED,
+ };
+
private:
friend class AnimationNodeStateMachinePlayback;
+ StateMachineType state_machine_type = STATE_MACHINE_TYPE_ROOT;
+
struct State {
Ref<AnimationRootNode> node;
Vector2 position;
@@ -189,28 +124,24 @@ private:
HashMap<StringName, State> states;
bool allow_transition_to_self = false;
+ bool reset_ends = false;
struct Transition {
StringName from;
StringName to;
- StringName local_from;
- StringName local_to;
Ref<AnimationNodeStateMachineTransition> transition;
};
Vector<Transition> transitions;
StringName playback = "playback";
- StringName state_machine_name;
- AnimationNodeStateMachine *prev_state_machine = nullptr;
bool updating_transitions = false;
Vector2 graph_offset;
void _remove_transition(const Ref<AnimationNodeStateMachineTransition> p_transition);
void _rename_transitions(const StringName &p_name, const StringName &p_new_name);
- bool _can_connect(const StringName &p_name, Vector<AnimationNodeStateMachine *> p_parents = Vector<AnimationNodeStateMachine *>());
- StringName _get_shortest_path(const StringName &p_path) const;
+ bool _can_connect(const StringName &p_name);
protected:
static void _bind_methods();
@@ -218,6 +149,8 @@ protected:
bool _set(const StringName &p_name, const Variant &p_value);
bool _get(const StringName &p_name, Variant &r_ret) const;
void _get_property_list(List<PropertyInfo> *p_list) const;
+ void _validate_property(PropertyInfo &p_property) const;
+
bool _check_advance_condition(const Ref<AnimationNodeStateMachine> p_state_machine, const Ref<AnimationNodeStateMachineTransition> p_transition) const;
virtual void _tree_changed() override;
@@ -232,6 +165,7 @@ public:
virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;
virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
+ virtual bool is_parameter_read_only(const StringName &p_parameter) const override;
void add_node(const StringName &p_name, Ref<AnimationNode> p_node, const Vector2 &p_position = Vector2());
void replace_node(const StringName &p_name, Ref<AnimationNode> p_node);
@@ -248,32 +182,164 @@ public:
virtual void get_child_nodes(List<ChildNode> *r_child_nodes) override;
bool has_transition(const StringName &p_from, const StringName &p_to) const;
- bool has_local_transition(const StringName &p_from, const StringName &p_to) const;
+ bool has_transition_from(const StringName &p_from) const;
+ bool has_transition_to(const StringName &p_to) const;
int find_transition(const StringName &p_from, const StringName &p_to) const;
+ Vector<int> find_transition_from(const StringName &p_from) const;
+ Vector<int> find_transition_to(const StringName &p_to) const;
void add_transition(const StringName &p_from, const StringName &p_to, const Ref<AnimationNodeStateMachineTransition> &p_transition);
Ref<AnimationNodeStateMachineTransition> get_transition(int p_transition) const;
StringName get_transition_from(int p_transition) const;
StringName get_transition_to(int p_transition) const;
int get_transition_count() const;
+ bool is_transition_across_group(int p_transition) const;
void remove_transition_by_index(const int p_transition);
void remove_transition(const StringName &p_from, const StringName &p_to);
+ void set_state_machine_type(StateMachineType p_state_machine_type);
+ StateMachineType get_state_machine_type() const;
+
void set_allow_transition_to_self(bool p_enable);
bool is_allow_transition_to_self() const;
- bool can_edit_node(const StringName &p_name) const;
+ void set_reset_ends(bool p_enable);
+ bool are_ends_reset() const;
- AnimationNodeStateMachine *get_prev_state_machine() const;
+ bool can_edit_node(const StringName &p_name) const;
void set_graph_offset(const Vector2 &p_offset);
Vector2 get_graph_offset() const;
- virtual double process(double p_time, bool p_seek, bool p_is_external_seeking) override;
+ virtual double _process(double p_time, bool p_seek, bool p_is_external_seeking, bool p_test_only = false) override;
virtual String get_caption() const override;
- virtual Ref<AnimationNode> get_child_by_name(const StringName &p_name) override;
+ virtual Ref<AnimationNode> get_child_by_name(const StringName &p_name) const override;
AnimationNodeStateMachine();
};
+VARIANT_ENUM_CAST(AnimationNodeStateMachine::StateMachineType);
+
+class AnimationNodeStateMachinePlayback : public Resource {
+ GDCLASS(AnimationNodeStateMachinePlayback, Resource);
+
+ friend class AnimationNodeStateMachine;
+
+ struct AStarCost {
+ float distance = 0.0;
+ StringName prev;
+ };
+
+ struct TransitionInfo {
+ StringName from;
+ StringName to;
+ StringName next;
+ };
+
+ struct NextInfo {
+ StringName node;
+ double xfade;
+ Ref<Curve> curve;
+ AnimationNodeStateMachineTransition::SwitchMode switch_mode;
+ bool is_reset;
+ };
+
+ struct ChildStateMachineInfo {
+ Ref<AnimationNodeStateMachinePlayback> playback;
+ Vector<StringName> path;
+ bool is_reset = false;
+ };
+
+ Ref<AnimationNodeStateMachineTransition> default_transition;
+ String base_path;
+
+ double len_fade_from = 0.0;
+ double pos_fade_from = 0.0;
+
+ double len_current = 0.0;
+ double pos_current = 0.0;
+
+ StringName current;
+ Ref<Curve> current_curve;
+
+ Ref<AnimationNodeStateMachineTransition> group_start_transition;
+ Ref<AnimationNodeStateMachineTransition> group_end_transition;
+
+ StringName fading_from;
+ float fading_time = 0.0;
+ float fading_pos = 0.0;
+
+ Vector<StringName> path;
+ bool playing = false;
+
+ StringName start_request;
+ StringName travel_request;
+ bool reset_request = false;
+ bool reset_request_on_teleport = false;
+ bool _reset_request_for_fading_from = false;
+ bool next_request = false;
+ bool stop_request = false;
+ bool teleport_request = false;
+
+ bool is_grouped = false;
+
+ void _travel_main(const StringName &p_state, bool p_reset_on_teleport = true);
+ void _start_main(const StringName &p_state, bool p_reset = true);
+ void _next_main();
+ void _stop_main();
+
+ bool _make_travel_path(AnimationTree *p_tree, AnimationNodeStateMachine *p_state_machine, bool p_is_allow_transition_to_self, Vector<StringName> &r_path, bool p_test_only);
+ String _validate_path(AnimationNodeStateMachine *p_state_machine, const String &p_path);
+ bool _travel(AnimationTree *p_tree, AnimationNodeStateMachine *p_state_machine, bool p_is_allow_transition_to_self, bool p_test_only);
+ void _start(AnimationNodeStateMachine *p_state_machine);
+
+ void _clear_path_children(AnimationTree *p_tree, AnimationNodeStateMachine *p_state_machine, bool p_test_only);
+ bool _travel_children(AnimationTree *p_tree, AnimationNodeStateMachine *p_state_machine, const String &p_path, bool p_is_allow_transition_to_self, bool p_is_parent_same_state, bool p_test_only);
+ void _start_children(AnimationTree *p_tree, AnimationNodeStateMachine *p_state_machine, const String &p_path, bool p_test_only);
+
+ double process(const String &p_base_path, AnimationNodeStateMachine *p_state_machine, double p_time, bool p_seek, bool p_is_external_seeking, bool p_test_only);
+ double _process(const String &p_base_path, AnimationNodeStateMachine *p_state_machine, double p_time, bool p_seek, bool p_is_external_seeking, bool p_test_only);
+
+ bool _check_advance_condition(const Ref<AnimationNodeStateMachine> p_state_machine, const Ref<AnimationNodeStateMachineTransition> p_transition) const;
+ bool _transition_to_next_recursive(AnimationTree *p_tree, AnimationNodeStateMachine *p_state_machine, bool p_test_only);
+ NextInfo _find_next(AnimationTree *p_tree, AnimationNodeStateMachine *p_state_machine) const;
+ Ref<AnimationNodeStateMachineTransition> _check_group_transition(AnimationTree *p_tree, AnimationNodeStateMachine *p_state_machine, const AnimationNodeStateMachine::Transition &p_transition, Ref<AnimationNodeStateMachine> &r_state_machine, bool &r_bypass) const;
+ bool _can_transition_to_next(AnimationTree *p_tree, AnimationNodeStateMachine *p_state_machine, NextInfo p_next, bool p_test_only);
+
+ void _set_current(AnimationNodeStateMachine *p_state_machine, const StringName &p_state);
+ void _set_grouped(bool p_is_grouped);
+ void _set_base_path(const String &p_base_path);
+ Ref<AnimationNodeStateMachinePlayback> _get_parent_playback(AnimationTree *p_tree) const;
+ Ref<AnimationNodeStateMachine> _get_parent_state_machine(AnimationTree *p_tree) const;
+ Ref<AnimationNodeStateMachineTransition> _get_group_start_transition() const;
+ Ref<AnimationNodeStateMachineTransition> _get_group_end_transition() const;
+
+protected:
+ static void _bind_methods();
+
+public:
+ void travel(const StringName &p_state, bool p_reset_on_teleport = true);
+ void start(const StringName &p_state, bool p_reset = true);
+ void next();
+ void stop();
+ bool is_playing() const;
+ bool is_end() const;
+ StringName get_current_node() const;
+ StringName get_fading_from_node() const;
+ Vector<StringName> get_travel_path() const;
+ float get_current_play_pos() const;
+ float get_current_length() const;
+
+ float get_fade_from_play_pos() const;
+ float get_fade_from_length() const;
+
+ float get_fading_time() const;
+ float get_fading_pos() const;
+
+ void clear_path();
+ void push_path(const StringName &p_state);
+
+ AnimationNodeStateMachinePlayback();
+};
+
#endif // ANIMATION_NODE_STATE_MACHINE_H