diff options
Diffstat (limited to 'scene/animation/animation_node_state_machine.h')
-rw-r--r-- | scene/animation/animation_node_state_machine.h | 238 |
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 |