animation_blend_tree.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. /**************************************************************************/
  2. /* animation_blend_tree.h */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #ifndef ANIMATION_BLEND_TREE_H
  31. #define ANIMATION_BLEND_TREE_H
  32. #include "scene/animation/animation_tree.h"
  33. class AnimationNodeAnimation : public AnimationRootNode {
  34. GDCLASS(AnimationNodeAnimation, AnimationRootNode);
  35. StringName backward = "backward"; // Only used by pingpong animation.
  36. StringName animation;
  37. bool advance_on_start = false;
  38. bool use_custom_timeline = false;
  39. double timeline_length = 1.0;
  40. Animation::LoopMode loop_mode = Animation::LOOP_NONE;
  41. bool stretch_time_scale = true;
  42. double start_offset = 0.0;
  43. uint64_t last_version = 0;
  44. bool skip = false;
  45. public:
  46. enum PlayMode {
  47. PLAY_MODE_FORWARD,
  48. PLAY_MODE_BACKWARD
  49. };
  50. void get_parameter_list(List<PropertyInfo> *r_list) const override;
  51. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  52. virtual NodeTimeInfo get_node_time_info() const override; // Wrapper of get_parameter().
  53. static Vector<String> (*get_editable_animation_list)();
  54. virtual String get_caption() const override;
  55. virtual NodeTimeInfo process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  56. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  57. void set_animation(const StringName &p_name);
  58. StringName get_animation() const;
  59. void set_play_mode(PlayMode p_play_mode);
  60. PlayMode get_play_mode() const;
  61. void set_backward(bool p_backward);
  62. bool is_backward() const;
  63. void set_advance_on_start(bool p_advance_on_start);
  64. bool is_advance_on_start() const;
  65. void set_use_custom_timeline(bool p_use_custom_timeline);
  66. bool is_using_custom_timeline() const;
  67. void set_timeline_length(double p_length);
  68. double get_timeline_length() const;
  69. void set_stretch_time_scale(bool p_stretch_time_scale);
  70. bool is_stretching_time_scale() const;
  71. void set_start_offset(double p_offset);
  72. double get_start_offset() const;
  73. void set_loop_mode(Animation::LoopMode p_loop_mode);
  74. Animation::LoopMode get_loop_mode() const;
  75. AnimationNodeAnimation();
  76. protected:
  77. void _validate_property(PropertyInfo &p_property) const;
  78. static void _bind_methods();
  79. private:
  80. PlayMode play_mode = PLAY_MODE_FORWARD;
  81. };
  82. VARIANT_ENUM_CAST(AnimationNodeAnimation::PlayMode)
  83. class AnimationNodeSync : public AnimationNode {
  84. GDCLASS(AnimationNodeSync, AnimationNode);
  85. protected:
  86. bool sync = false;
  87. static void _bind_methods();
  88. public:
  89. void set_use_sync(bool p_sync);
  90. bool is_using_sync() const;
  91. AnimationNodeSync();
  92. };
  93. class AnimationNodeOneShot : public AnimationNodeSync {
  94. GDCLASS(AnimationNodeOneShot, AnimationNodeSync);
  95. public:
  96. enum OneShotRequest {
  97. ONE_SHOT_REQUEST_NONE,
  98. ONE_SHOT_REQUEST_FIRE,
  99. ONE_SHOT_REQUEST_ABORT,
  100. ONE_SHOT_REQUEST_FADE_OUT,
  101. };
  102. enum MixMode {
  103. MIX_MODE_BLEND,
  104. MIX_MODE_ADD
  105. };
  106. private:
  107. double fade_in = 0.0;
  108. Ref<Curve> fade_in_curve;
  109. double fade_out = 0.0;
  110. Ref<Curve> fade_out_curve;
  111. bool auto_restart = false;
  112. double auto_restart_delay = 1.0;
  113. double auto_restart_random_delay = 0.0;
  114. MixMode mix = MIX_MODE_BLEND;
  115. bool break_loop_at_end = false;
  116. StringName request = PNAME("request");
  117. StringName active = PNAME("active");
  118. StringName internal_active = PNAME("internal_active");
  119. StringName fade_in_remaining = "fade_in_remaining";
  120. StringName fade_out_remaining = "fade_out_remaining";
  121. StringName time_to_restart = "time_to_restart";
  122. protected:
  123. static void _bind_methods();
  124. public:
  125. virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;
  126. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  127. virtual bool is_parameter_read_only(const StringName &p_parameter) const override;
  128. virtual String get_caption() const override;
  129. void set_fade_in_time(double p_time);
  130. double get_fade_in_time() const;
  131. void set_fade_in_curve(const Ref<Curve> &p_curve);
  132. Ref<Curve> get_fade_in_curve() const;
  133. void set_fade_out_time(double p_time);
  134. double get_fade_out_time() const;
  135. void set_fade_out_curve(const Ref<Curve> &p_curve);
  136. Ref<Curve> get_fade_out_curve() const;
  137. void set_auto_restart_enabled(bool p_enabled);
  138. void set_auto_restart_delay(double p_time);
  139. void set_auto_restart_random_delay(double p_time);
  140. bool is_auto_restart_enabled() const;
  141. double get_auto_restart_delay() const;
  142. double get_auto_restart_random_delay() const;
  143. void set_mix_mode(MixMode p_mix);
  144. MixMode get_mix_mode() const;
  145. void set_break_loop_at_end(bool p_enable);
  146. bool is_loop_broken_at_end() const;
  147. virtual bool has_filter() const override;
  148. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  149. AnimationNodeOneShot();
  150. };
  151. VARIANT_ENUM_CAST(AnimationNodeOneShot::OneShotRequest)
  152. VARIANT_ENUM_CAST(AnimationNodeOneShot::MixMode)
  153. class AnimationNodeAdd2 : public AnimationNodeSync {
  154. GDCLASS(AnimationNodeAdd2, AnimationNodeSync);
  155. StringName add_amount = PNAME("add_amount");
  156. public:
  157. void get_parameter_list(List<PropertyInfo> *r_list) const override;
  158. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  159. virtual String get_caption() const override;
  160. virtual bool has_filter() const override;
  161. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  162. AnimationNodeAdd2();
  163. };
  164. class AnimationNodeAdd3 : public AnimationNodeSync {
  165. GDCLASS(AnimationNodeAdd3, AnimationNodeSync);
  166. StringName add_amount = PNAME("add_amount");
  167. public:
  168. void get_parameter_list(List<PropertyInfo> *r_list) const override;
  169. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  170. virtual String get_caption() const override;
  171. virtual bool has_filter() const override;
  172. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  173. AnimationNodeAdd3();
  174. };
  175. class AnimationNodeBlend2 : public AnimationNodeSync {
  176. GDCLASS(AnimationNodeBlend2, AnimationNodeSync);
  177. StringName blend_amount = PNAME("blend_amount");
  178. public:
  179. virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;
  180. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  181. virtual String get_caption() const override;
  182. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  183. virtual bool has_filter() const override;
  184. AnimationNodeBlend2();
  185. };
  186. class AnimationNodeBlend3 : public AnimationNodeSync {
  187. GDCLASS(AnimationNodeBlend3, AnimationNodeSync);
  188. StringName blend_amount = PNAME("blend_amount");
  189. public:
  190. virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;
  191. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  192. virtual String get_caption() const override;
  193. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  194. AnimationNodeBlend3();
  195. };
  196. class AnimationNodeSub2 : public AnimationNodeSync {
  197. GDCLASS(AnimationNodeSub2, AnimationNodeSync);
  198. StringName sub_amount = PNAME("sub_amount");
  199. public:
  200. void get_parameter_list(List<PropertyInfo> *r_list) const override;
  201. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  202. virtual String get_caption() const override;
  203. virtual bool has_filter() const override;
  204. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  205. AnimationNodeSub2();
  206. };
  207. class AnimationNodeTimeScale : public AnimationNode {
  208. GDCLASS(AnimationNodeTimeScale, AnimationNode);
  209. StringName scale = PNAME("scale");
  210. public:
  211. virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;
  212. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  213. virtual String get_caption() const override;
  214. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  215. AnimationNodeTimeScale();
  216. };
  217. class AnimationNodeTimeSeek : public AnimationNode {
  218. GDCLASS(AnimationNodeTimeSeek, AnimationNode);
  219. StringName seek_pos_request = PNAME("seek_request");
  220. bool explicit_elapse = true;
  221. protected:
  222. static void _bind_methods();
  223. public:
  224. virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;
  225. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  226. virtual String get_caption() const override;
  227. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  228. void set_explicit_elapse(bool p_enable);
  229. bool is_explicit_elapse() const;
  230. AnimationNodeTimeSeek();
  231. };
  232. class AnimationNodeTransition : public AnimationNodeSync {
  233. GDCLASS(AnimationNodeTransition, AnimationNodeSync);
  234. struct InputData {
  235. bool auto_advance = false;
  236. bool break_loop_at_end = false;
  237. bool reset = true;
  238. };
  239. LocalVector<InputData> input_data;
  240. StringName prev_xfading = "prev_xfading";
  241. StringName prev_index = "prev_index";
  242. StringName current_index = PNAME("current_index");
  243. StringName current_state = PNAME("current_state");
  244. StringName transition_request = PNAME("transition_request");
  245. StringName prev_frame_current = "pf_current";
  246. StringName prev_frame_current_idx = "pf_current_idx";
  247. double xfade_time = 0.0;
  248. Ref<Curve> xfade_curve;
  249. bool allow_transition_to_self = false;
  250. bool pending_update = false;
  251. protected:
  252. bool _get(const StringName &p_path, Variant &r_ret) const;
  253. bool _set(const StringName &p_path, const Variant &p_value);
  254. static void _bind_methods();
  255. void _get_property_list(List<PropertyInfo> *p_list) const;
  256. public:
  257. virtual void get_parameter_list(List<PropertyInfo> *r_list) const override;
  258. virtual Variant get_parameter_default_value(const StringName &p_parameter) const override;
  259. virtual bool is_parameter_read_only(const StringName &p_parameter) const override;
  260. virtual String get_caption() const override;
  261. void set_input_count(int p_inputs);
  262. virtual bool add_input(const String &p_name) override;
  263. virtual void remove_input(int p_index) override;
  264. virtual bool set_input_name(int p_input, const String &p_name) override;
  265. void set_input_as_auto_advance(int p_input, bool p_enable);
  266. bool is_input_set_as_auto_advance(int p_input) const;
  267. void set_input_break_loop_at_end(int p_input, bool p_enable);
  268. bool is_input_loop_broken_at_end(int p_input) const;
  269. void set_input_reset(int p_input, bool p_enable);
  270. bool is_input_reset(int p_input) const;
  271. void set_xfade_time(double p_fade);
  272. double get_xfade_time() const;
  273. void set_xfade_curve(const Ref<Curve> &p_curve);
  274. Ref<Curve> get_xfade_curve() const;
  275. void set_allow_transition_to_self(bool p_enable);
  276. bool is_allow_transition_to_self() const;
  277. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  278. AnimationNodeTransition();
  279. };
  280. class AnimationNodeOutput : public AnimationNode {
  281. GDCLASS(AnimationNodeOutput, AnimationNode);
  282. public:
  283. virtual String get_caption() const override;
  284. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  285. AnimationNodeOutput();
  286. };
  287. /////
  288. class AnimationNodeBlendTree : public AnimationRootNode {
  289. GDCLASS(AnimationNodeBlendTree, AnimationRootNode);
  290. struct Node {
  291. Ref<AnimationNode> node;
  292. Vector2 position;
  293. Vector<StringName> connections;
  294. };
  295. RBMap<StringName, Node, StringName::AlphCompare> nodes;
  296. Vector2 graph_offset;
  297. void _node_changed(const StringName &p_node);
  298. void _initialize_node_tree();
  299. protected:
  300. static void _bind_methods();
  301. bool _set(const StringName &p_name, const Variant &p_value);
  302. bool _get(const StringName &p_name, Variant &r_ret) const;
  303. void _get_property_list(List<PropertyInfo> *p_list) const;
  304. virtual void _tree_changed() override;
  305. virtual void _animation_node_renamed(const ObjectID &p_oid, const String &p_old_name, const String &p_new_name) override;
  306. virtual void _animation_node_removed(const ObjectID &p_oid, const StringName &p_node) override;
  307. virtual void reset_state() override;
  308. public:
  309. enum ConnectionError {
  310. CONNECTION_OK,
  311. CONNECTION_ERROR_NO_INPUT,
  312. CONNECTION_ERROR_NO_INPUT_INDEX,
  313. CONNECTION_ERROR_NO_OUTPUT,
  314. CONNECTION_ERROR_SAME_NODE,
  315. CONNECTION_ERROR_CONNECTION_EXISTS,
  316. //no need to check for cycles due to tree topology
  317. };
  318. void add_node(const StringName &p_name, Ref<AnimationNode> p_node, const Vector2 &p_position = Vector2());
  319. Ref<AnimationNode> get_node(const StringName &p_name) const;
  320. void remove_node(const StringName &p_name);
  321. void rename_node(const StringName &p_name, const StringName &p_new_name);
  322. bool has_node(const StringName &p_name) const;
  323. StringName get_node_name(const Ref<AnimationNode> &p_node) const;
  324. Vector<StringName> get_node_connection_array(const StringName &p_name) const;
  325. void set_node_position(const StringName &p_node, const Vector2 &p_position);
  326. Vector2 get_node_position(const StringName &p_node) const;
  327. virtual void get_child_nodes(List<ChildNode> *r_child_nodes) override;
  328. void connect_node(const StringName &p_input_node, int p_input_index, const StringName &p_output_node);
  329. void disconnect_node(const StringName &p_node, int p_input_index);
  330. struct NodeConnection {
  331. StringName input_node;
  332. int input_index = 0;
  333. StringName output_node;
  334. };
  335. ConnectionError can_connect_node(const StringName &p_input_node, int p_input_index, const StringName &p_output_node) const;
  336. void get_node_connections(List<NodeConnection> *r_connections) const;
  337. virtual String get_caption() const override;
  338. virtual NodeTimeInfo _process(const AnimationMixer::PlaybackInfo p_playback_info, bool p_test_only = false) override;
  339. void get_node_list(List<StringName> *r_list);
  340. void set_graph_offset(const Vector2 &p_graph_offset);
  341. Vector2 get_graph_offset() const;
  342. virtual Ref<AnimationNode> get_child_by_name(const StringName &p_name) const override;
  343. #ifdef TOOLS_ENABLED
  344. virtual void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override;
  345. #endif
  346. AnimationNodeBlendTree();
  347. ~AnimationNodeBlendTree();
  348. };
  349. VARIANT_ENUM_CAST(AnimationNodeBlendTree::ConnectionError)
  350. #endif // ANIMATION_BLEND_TREE_H