Path: blob/master/scene/animation/animation_blend_tree.h
21733 views
/**************************************************************************/1/* animation_blend_tree.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "scene/animation/animation_tree.h"33#include "scene/resources/curve.h"3435class AnimationNodeAnimation : public AnimationRootNode {36GDCLASS(AnimationNodeAnimation, AnimationRootNode);3738StringName backward = "backward"; // Only used by pingpong animation.3940StringName animation;4142bool advance_on_start = false;4344bool use_custom_timeline = false;45double timeline_length = 1.0;46Animation::LoopMode loop_mode = Animation::LOOP_NONE;47bool stretch_time_scale = true;48double start_offset = 0.0;4950public:51enum PlayMode {52PLAY_MODE_FORWARD,53PLAY_MODE_BACKWARD54};5556void get_parameter_list(List<PropertyInfo> *r_list) const override;57virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;5859virtual NodeTimeInfo get_node_time_info() const override; // Wrapper of get_parameter().6061static Vector<String> (*get_editable_animation_list)();6263virtual String get_caption() const override;64virtual NodeTimeInfo process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;65virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;6667void set_animation(const StringName &p_name);68StringName get_animation() const;6970void set_play_mode(PlayMode p_play_mode);71PlayMode get_play_mode() const;7273void set_backward(bool p_backward);74bool is_backward() const;7576void set_advance_on_start(bool p_advance_on_start);77bool is_advance_on_start() const;7879void set_use_custom_timeline(bool p_use_custom_timeline);80bool is_using_custom_timeline() const;8182void set_timeline_length(double p_length);83double get_timeline_length() const;8485void set_stretch_time_scale(bool p_stretch_time_scale);86bool is_stretching_time_scale() const;8788void set_start_offset(double p_offset);89double get_start_offset() const;9091void set_loop_mode(Animation::LoopMode p_loop_mode);92Animation::LoopMode get_loop_mode() const;9394AnimationNodeAnimation();9596protected:97void _validate_property(PropertyInfo &p_property) const;98static void _bind_methods();99100private:101PlayMode play_mode = PLAY_MODE_FORWARD;102};103104VARIANT_ENUM_CAST(AnimationNodeAnimation::PlayMode)105106class AnimationNodeSync : public AnimationNode {107GDCLASS(AnimationNodeSync, AnimationNode);108109protected:110bool sync = false;111112static void _bind_methods();113114public:115void set_use_sync(bool p_sync);116bool is_using_sync() const;117118AnimationNodeSync();119};120121class AnimationNodeOneShot : public AnimationNodeSync {122GDCLASS(AnimationNodeOneShot, AnimationNodeSync);123124public:125enum OneShotRequest {126ONE_SHOT_REQUEST_NONE,127ONE_SHOT_REQUEST_FIRE,128ONE_SHOT_REQUEST_ABORT,129ONE_SHOT_REQUEST_FADE_OUT,130};131132enum MixMode {133MIX_MODE_BLEND,134MIX_MODE_ADD135};136137private:138double fade_in = 0.0;139Ref<Curve> fade_in_curve;140double fade_out = 0.0;141Ref<Curve> fade_out_curve;142143bool auto_restart = false;144double auto_restart_delay = 1.0;145double auto_restart_random_delay = 0.0;146MixMode mix = MIX_MODE_BLEND;147bool break_loop_at_end = false;148bool abort_on_reset = false;149150StringName request = PNAME("request");151StringName active = PNAME("active");152StringName internal_active = PNAME("internal_active");153StringName fade_in_remaining = "fade_in_remaining";154StringName fade_out_remaining = "fade_out_remaining";155StringName time_to_restart = "time_to_restart";156157protected:158static void _bind_methods();159160public:161virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;162virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;163virtual bool is_parameter_read_only(const StringName &p_parameter) const override;164165virtual String get_caption() const override;166167void set_fade_in_time(double p_time);168double get_fade_in_time() const;169170void set_fade_in_curve(const Ref<Curve> &p_curve);171Ref<Curve> get_fade_in_curve() const;172173void set_fade_out_time(double p_time);174double get_fade_out_time() const;175176void set_fade_out_curve(const Ref<Curve> &p_curve);177Ref<Curve> get_fade_out_curve() const;178179void set_auto_restart_enabled(bool p_enabled);180void set_auto_restart_delay(double p_time);181void set_auto_restart_random_delay(double p_time);182183bool is_auto_restart_enabled() const;184double get_auto_restart_delay() const;185double get_auto_restart_random_delay() const;186187void set_mix_mode(MixMode p_mix);188MixMode get_mix_mode() const;189190void set_break_loop_at_end(bool p_enable);191bool is_loop_broken_at_end() const;192193void set_abort_on_reset(bool p_enable);194bool is_aborted_on_reset() const;195196virtual bool has_filter() const override;197virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;198199AnimationNodeOneShot();200};201202VARIANT_ENUM_CAST(AnimationNodeOneShot::OneShotRequest)203VARIANT_ENUM_CAST(AnimationNodeOneShot::MixMode)204205class AnimationNodeAdd2 : public AnimationNodeSync {206GDCLASS(AnimationNodeAdd2, AnimationNodeSync);207208StringName add_amount = PNAME("add_amount");209210public:211void get_parameter_list(List<PropertyInfo> *r_list) const override;212virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;213214virtual String get_caption() const override;215216virtual bool has_filter() const override;217virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;218219AnimationNodeAdd2();220};221222class AnimationNodeAdd3 : public AnimationNodeSync {223GDCLASS(AnimationNodeAdd3, AnimationNodeSync);224225StringName add_amount = PNAME("add_amount");226227public:228void get_parameter_list(List<PropertyInfo> *r_list) const override;229virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;230231virtual String get_caption() const override;232233virtual bool has_filter() const override;234virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;235236AnimationNodeAdd3();237};238239class AnimationNodeBlend2 : public AnimationNodeSync {240GDCLASS(AnimationNodeBlend2, AnimationNodeSync);241242StringName blend_amount = PNAME("blend_amount");243244public:245virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;246virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;247248virtual String get_caption() const override;249virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;250251virtual bool has_filter() const override;252AnimationNodeBlend2();253};254255class AnimationNodeBlend3 : public AnimationNodeSync {256GDCLASS(AnimationNodeBlend3, AnimationNodeSync);257258StringName blend_amount = PNAME("blend_amount");259260public:261virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;262virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;263264virtual String get_caption() const override;265266virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;267AnimationNodeBlend3();268};269270class AnimationNodeSub2 : public AnimationNodeSync {271GDCLASS(AnimationNodeSub2, AnimationNodeSync);272273StringName sub_amount = PNAME("sub_amount");274275public:276void get_parameter_list(List<PropertyInfo> *r_list) const override;277virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;278279virtual String get_caption() const override;280281virtual bool has_filter() const override;282virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;283284AnimationNodeSub2();285};286287class AnimationNodeTimeScale : public AnimationNode {288GDCLASS(AnimationNodeTimeScale, AnimationNode);289290StringName scale = PNAME("scale");291292public:293virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;294virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;295296virtual String get_caption() const override;297298virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;299300AnimationNodeTimeScale();301};302303class AnimationNodeTimeSeek : public AnimationNode {304GDCLASS(AnimationNodeTimeSeek, AnimationNode);305306StringName seek_pos_request = PNAME("seek_request");307bool explicit_elapse = true;308309protected:310static void _bind_methods();311312public:313virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;314virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;315316virtual String get_caption() const override;317318virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;319320void set_explicit_elapse(bool p_enable);321bool is_explicit_elapse() const;322323AnimationNodeTimeSeek();324};325326class AnimationNodeTransition : public AnimationNodeSync {327GDCLASS(AnimationNodeTransition, AnimationNodeSync);328329struct InputData {330bool auto_advance = false;331bool break_loop_at_end = false;332bool reset = true;333};334LocalVector<InputData> input_data;335336StringName prev_xfading = "prev_xfading";337StringName prev_index = "prev_index";338StringName current_index = PNAME("current_index");339StringName current_state = PNAME("current_state");340StringName transition_request = PNAME("transition_request");341342double xfade_time = 0.0;343Ref<Curve> xfade_curve;344bool allow_transition_to_self = false;345346bool pending_update = false;347348protected:349bool _get(const StringName &p_path, Variant &r_ret) const;350bool _set(const StringName &p_path, const Variant &p_value);351static void _bind_methods();352void _get_property_list(List<PropertyInfo> *p_list) const;353354public:355virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;356virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;357virtual bool is_parameter_read_only(const StringName &p_parameter) const override;358359virtual String get_caption() const override;360361void set_input_count(int p_inputs);362363virtual bool add_input(const String &p_name) override;364virtual void remove_input(int p_index) override;365virtual bool set_input_name(int p_input, const String &p_name) override;366367void set_input_as_auto_advance(int p_input, bool p_enable);368bool is_input_set_as_auto_advance(int p_input) const;369370void set_input_break_loop_at_end(int p_input, bool p_enable);371bool is_input_loop_broken_at_end(int p_input) const;372373void set_input_reset(int p_input, bool p_enable);374bool is_input_reset(int p_input) const;375376void set_xfade_time(double p_fade);377double get_xfade_time() const;378379void set_xfade_curve(const Ref<Curve> &p_curve);380Ref<Curve> get_xfade_curve() const;381382void set_allow_transition_to_self(bool p_enable);383bool is_allow_transition_to_self() const;384385virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;386387AnimationNodeTransition();388};389390class AnimationNodeOutput : public AnimationNode {391GDCLASS(AnimationNodeOutput, AnimationNode);392393public:394virtual String get_caption() const override;395virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;396AnimationNodeOutput();397};398399/////400401class AnimationNodeBlendTree : public AnimationRootNode {402GDCLASS(AnimationNodeBlendTree, AnimationRootNode);403404struct Node {405Ref<AnimationNode> node;406Vector2 position;407Vector<StringName> connections;408};409410AHashMap<StringName, Node> nodes;411412Vector2 graph_offset;413414void _node_changed(const StringName &p_node);415416void _initialize_node_tree();417418protected:419static void _bind_methods();420bool _set(const StringName &p_name, const Variant &p_value);421bool _get(const StringName &p_name, Variant &r_ret) const;422void _get_property_list(List<PropertyInfo> *p_list) const;423424virtual void _tree_changed() override;425virtual void _animation_node_renamed(const ObjectID &p_oid, const String &p_old_name, const String &p_new_name) override;426virtual void _animation_node_removed(const ObjectID &p_oid, const StringName &p_node) override;427428virtual void reset_state() override;429430public:431enum ConnectionError {432CONNECTION_OK,433CONNECTION_ERROR_NO_INPUT,434CONNECTION_ERROR_NO_INPUT_INDEX,435CONNECTION_ERROR_NO_OUTPUT,436CONNECTION_ERROR_SAME_NODE,437CONNECTION_ERROR_CONNECTION_EXISTS,438//no need to check for cycles due to tree topology439};440441void add_node(const StringName &p_name, Ref<AnimationNode> p_node, const Vector2 &p_position = Vector2());442Ref<AnimationNode> get_node(const StringName &p_name) const;443void remove_node(const StringName &p_name);444void rename_node(const StringName &p_name, const StringName &p_new_name);445bool has_node(const StringName &p_name) const;446StringName get_node_name(const Ref<AnimationNode> &p_node) const;447Vector<StringName> get_node_connection_array(const StringName &p_name) const;448449void set_node_position(const StringName &p_node, const Vector2 &p_position);450Vector2 get_node_position(const StringName &p_node) const;451452virtual void get_child_nodes(List<ChildNode> *r_child_nodes) override;453454void connect_node(const StringName &p_input_node, int p_input_index, const StringName &p_output_node);455void disconnect_node(const StringName &p_node, int p_input_index);456457struct NodeConnection {458StringName input_node;459int input_index = 0;460StringName output_node;461};462463ConnectionError can_connect_node(const StringName &p_input_node, int p_input_index, const StringName &p_output_node) const;464void get_node_connections(List<NodeConnection> *r_connections) const;465466virtual String get_caption() const override;467virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;468469LocalVector<StringName> get_node_list() const;470TypedArray<StringName> get_node_list_as_typed_array() const;471472void set_graph_offset(const Vector2 &p_graph_offset);473Vector2 get_graph_offset() const;474475virtual Ref<AnimationNode> get_child_by_name(const StringName &p_name) const override;476477#ifdef TOOLS_ENABLED478virtual void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override;479#endif480481AnimationNodeBlendTree();482~AnimationNodeBlendTree();483};484485VARIANT_ENUM_CAST(AnimationNodeBlendTree::ConnectionError)486487488