3838#include " editor/editor_string_names.h"
3939#include " editor/editor_undo_redo_manager.h"
4040#include " editor/gui/editor_file_dialog.h"
41+ #include " editor/inspector_dock.h"
4142#include " editor/themes/editor_scale.h"
4243#include " scene/animation/animation_blend_tree.h"
4344#include " scene/animation/animation_player.h"
5354#include " scene/gui/spin_box.h"
5455#include " scene/main/window.h"
5556
57+ // void BlendPointEditor::_bind_methods() {
58+ // ClassDB::bind_method(D_METHOD("set_fade_in", "value"), &BlendPointEditor::set_fade_in);
59+ // ClassDB::bind_method(D_METHOD("get_fade_in"), &BlendPointEditor::get_fade_in);
60+ // ClassDB::bind_method(D_METHOD("set_fade_out", "value"), &BlendPointEditor::set_fade_out);
61+ // ClassDB::bind_method(D_METHOD("get_fade_out"), &BlendPointEditor::get_fade_out);
62+ // //ClassDB::bind_method(D_METHOD("_dont_undo_redo"), &BlendPointEditor::_dont_undo_redo);
63+ // //ClassDB::bind_method(D_METHOD("_hide_script_from_inspector"), &BlendPointEditor::_hide_script_from_inspector);
64+ // //ClassDB::bind_method(D_METHOD("_hide_metadata_from_inspector"), &BlendPointEditor::_hide_metadata_from_inspector);
65+ // ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fade_in", PROPERTY_HINT_NONE, "0,60,0.01,or_greater,suffix:s"), "set_fade_in", "get_fade_in");
66+ // ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fade_out", PROPERTY_HINT_NONE, "0,60,0.01,or_greater,suffix:s"), "set_fade_out", "get_fade_out");
67+ // ClassDB::bind_method(D_METHOD("get_anim_node"), &BlendPointEditor::get_anim_node);
68+ //
69+ // ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "animation_node", PROPERTY_HINT_RESOURCE_TYPE, "AnimationNode"), "", "get_anim_node");
70+ // }
71+
5672bool AnimationNodeBlendSpace2DEditor::can_edit (const Ref<AnimationNode> &p_node) {
5773 Ref<AnimationNodeBlendSpace2D> bs2d = p_node;
5874 return bs2d.is_valid ();
@@ -88,6 +104,8 @@ void AnimationNodeBlendSpace2DEditor::edit(const Ref<AnimationNode> &p_node) {
88104 tool_triangle->set_disabled (read_only);
89105 auto_triangles->set_disabled (read_only);
90106 sync->set_disabled (read_only);
107+ default_velocity_limit->set_editable (!read_only);
108+ use_velocity_limit->set_disabled (read_only);
91109 interpolation->set_disabled (read_only);
92110}
93111
@@ -176,15 +194,16 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
176194 if (points[i].distance_to (mb->get_position ()) < 10 * EDSCALE) {
177195 selected_point = i;
178196 Ref<AnimationNode> node = blend_space->get_blend_point_node (i);
179- EditorNode::get_singleton ()->push_item (node.ptr (), " " , true );
197+ current_blend_point_editor->setup (blend_space, selected_point, node);
198+ // EditorNode::get_singleton()->push_item(current_blend_point_editor.ptr(), "", true);
199+ InspectorDock::get_inspector_singleton ()->edit (current_blend_point_editor.ptr ());
180200 dragging_selected_attempt = true ;
181201 drag_from = mb->get_position ();
182202 _update_tool_erase ();
183203 _update_edited_point_pos ();
184204 return ;
185205 }
186206 }
187-
188207 // then try to see if a triangle can be selected
189208 if (!blend_space->get_auto_triangles ()) { // if autotriangles use, disable this
190209 for (int i = 0 ; i < blend_space->get_triangle_count (); i++) {
@@ -650,6 +669,8 @@ void AnimationNodeBlendSpace2DEditor::_update_space() {
650669
651670 sync->set_pressed (blend_space->is_using_sync ());
652671 interpolation->select (blend_space->get_blend_mode ());
672+ use_velocity_limit->set_pressed (blend_space->get_use_velocity_limit ());
673+ default_velocity_limit->set_value (blend_space->get_velocity_limit ());
653674
654675 max_x_value->set_value (blend_space->get_max_space ().x );
655676 max_y_value->set_value (blend_space->get_max_space ().y );
@@ -686,6 +707,13 @@ void AnimationNodeBlendSpace2DEditor::_config_changed(double) {
686707 undo_redo->add_undo_method (blend_space.ptr (), " set_use_sync" , blend_space->is_using_sync ());
687708 undo_redo->add_do_method (blend_space.ptr (), " set_blend_mode" , interpolation->get_selected ());
688709 undo_redo->add_undo_method (blend_space.ptr (), " set_blend_mode" , blend_space->get_blend_mode ());
710+ undo_redo->add_do_method (blend_space.ptr (), " set_use_velocity_limit" , use_velocity_limit->is_pressed ());
711+ undo_redo->add_undo_method (blend_space.ptr (), " set_use_velocity_limit" , blend_space->get_use_velocity_limit ());
712+ undo_redo->add_do_method (blend_space.ptr (), " set_velocity_limit" , default_velocity_limit->get_value ());
713+ undo_redo->add_undo_method (blend_space.ptr (), " set_velocity_limit" , blend_space->get_velocity_limit ());
714+ blending_hb->set_visible (sync->is_pressed ());
715+ // edit_fade_hb->set_visible(sync->is_pressed() && !Math::is_zero_approx(default_blend_time->get_value()));
716+
689717 undo_redo->add_do_method (this , " _update_space" );
690718 undo_redo->add_undo_method (this , " _update_space" );
691719 undo_redo->commit_action ();
@@ -861,6 +889,61 @@ void AnimationNodeBlendSpace2DEditor::_auto_triangles_toggled() {
861889 undo_redo->commit_action ();
862890}
863891
892+ void BlendPointEditor::_edit_point_velocity_limit () {
893+ if (updating) {
894+ return ;
895+ }
896+ updating = true ;
897+ EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton ();
898+ undo_redo->create_action (TTR (" Change Node Fade" ));
899+ undo_redo->add_do_method (blend_space.ptr (), " set_blend_point_vl" , selected_point, velocity_limit);
900+ undo_redo->add_undo_method (blend_space.ptr (), " set_blend_point_vl" , selected_point, blend_space->get_blend_point_vl (selected_point));
901+ undo_redo->commit_action ();
902+ updating = false ;
903+ }
904+ void BlendPointEditor::setup (Ref<AnimationNodeBlendSpace2D> p_blend_space, int p_idx, Ref<AnimationNode> p_anim_node) {
905+ blend_space = p_blend_space;
906+ selected_point = p_idx;
907+ anim_node = p_anim_node;
908+ }
909+
910+ void BlendPointEditor::set_velocity_limit (float p_value) {
911+ if (blend_space.is_valid ()) {
912+ velocity_limit = p_value;
913+ _edit_point_velocity_limit ();
914+ }
915+ }
916+ double BlendPointEditor::get_velocity_limit () const {
917+ return (blend_space.is_valid ()) ? blend_space->get_blend_point_vl (selected_point) : 0 ;
918+ }
919+
920+ Ref<AnimationNode> BlendPointEditor::get_anim_node () const {
921+ return anim_node;
922+ }
923+ void BlendPointEditor::set_velocity_limit_curve (float const p_curve) {
924+ if (blend_space.is_valid ()) {
925+ blend_space->set_velocity_limit_curve (p_curve);
926+ }
927+ }
928+ float BlendPointEditor::get_velocity_limit_curve () const {
929+ return (blend_space.is_valid ()) ? blend_space->get_velocity_limit_curve () : 1.0 ;
930+ }
931+
932+ void BlendPointEditor::_bind_methods () {
933+ ClassDB::bind_method (D_METHOD (" set_velocity_limit" , " value" ), &BlendPointEditor::set_velocity_limit);
934+ ClassDB::bind_method (D_METHOD (" get_velocity_limit" ), &BlendPointEditor::get_velocity_limit);
935+ ClassDB::bind_method (D_METHOD (" _dont_undo_redo" ), &BlendPointEditor::_dont_undo_redo);
936+ ClassDB::bind_method (D_METHOD (" _hide_script_from_inspector" ), &BlendPointEditor::_hide_script_from_inspector);
937+ ClassDB::bind_method (D_METHOD (" _hide_metadata_from_inspector" ), &BlendPointEditor::_hide_metadata_from_inspector);
938+
939+ ClassDB::bind_method (D_METHOD (" get_velocity_limit_curve" ), &BlendPointEditor::get_velocity_limit_curve);
940+ ClassDB::bind_method (D_METHOD (" set_velocity_limit_curve" ), &BlendPointEditor::set_velocity_limit_curve);
941+ ADD_PROPERTY (PropertyInfo (Variant::FLOAT, " velocity_limit" , PROPERTY_HINT_NONE, " 0,60,0.01,or_greater,suffix:/s" ), " set_velocity_limit" , " get_velocity_limit" );
942+ ClassDB::bind_method (D_METHOD (" get_anim_node" ), &BlendPointEditor::get_anim_node);
943+ ADD_PROPERTY (PropertyInfo (Variant::OBJECT, " animation_node" , PROPERTY_HINT_RESOURCE_TYPE, " AnimationNode" ), " " , " get_anim_node" );
944+ ADD_PROPERTY (PropertyInfo (Variant::FLOAT, " velocity_limit_ease" , PROPERTY_HINT_EXP_EASING), " set_velocity_limit_curve" , " get_velocity_limit_curve" );
945+ }
946+
864947void AnimationNodeBlendSpace2DEditor::_bind_methods () {
865948 ClassDB::bind_method (" _update_space" , &AnimationNodeBlendSpace2DEditor::_update_space);
866949 ClassDB::bind_method (" _update_tool_erase" , &AnimationNodeBlendSpace2DEditor::_update_tool_erase);
@@ -978,6 +1061,26 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
9781061 top_hb->add_child (interpolation);
9791062 interpolation->connect (SceneStringName (item_selected), callable_mp (this , &AnimationNodeBlendSpace2DEditor::_config_changed));
9801063
1064+ blending_hb = memnew (HBoxContainer);
1065+ top_hb->add_child (blending_hb);
1066+ blending_hb->add_child (memnew (VSeparator));
1067+
1068+ blending_hb->add_child (memnew (Label (TTR (" Use Velocity Limit:" ))));
1069+ use_velocity_limit = memnew (CheckBox);
1070+ blending_hb->add_child (use_velocity_limit);
1071+ use_velocity_limit->connect (SceneStringName (toggled), callable_mp (this , &AnimationNodeBlendSpace2DEditor::_config_changed));
1072+
1073+ blending_hb->add_child (memnew (Label (TTR (" Default Velocity limit:" ))));
1074+ default_velocity_limit = memnew (SpinBox);
1075+ blending_hb->add_child (default_velocity_limit);
1076+ default_velocity_limit->set_min (0.0 );
1077+ default_velocity_limit->set_step (0.01 );
1078+ default_velocity_limit->set_max (60.0 );
1079+ default_velocity_limit->set_suffix (" /s" );
1080+ default_velocity_limit->connect (SceneStringName (value_changed), callable_mp (this , &AnimationNodeBlendSpace2DEditor::_config_changed));
1081+
1082+ current_blend_point_editor.instantiate ();
1083+
9811084 edit_hb = memnew (HBoxContainer);
9821085 top_hb->add_child (edit_hb);
9831086 edit_hb->add_child (memnew (VSeparator));
@@ -996,6 +1099,7 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
9961099 edit_y->set_max (1000 );
9971100 edit_y->set_accessibility_name (TTRC (" Blend X Value" ));
9981101 edit_y->connect (SceneStringName (value_changed), callable_mp (this , &AnimationNodeBlendSpace2DEditor::_edit_point_pos));
1102+
9991103 open_editor = memnew (Button);
10001104 edit_hb->add_child (open_editor);
10011105 open_editor->set_text (TTR (" Open Editor" ));
@@ -1114,3 +1218,6 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
11141218 dragging_selected = false ;
11151219 dragging_selected_attempt = false ;
11161220}
1221+ AnimationNodeBlendSpace2DEditor::~AnimationNodeBlendSpace2DEditor () {
1222+ SceneTree::get_singleton ()->queue_delete (current_blend_point_editor.ptr ());
1223+ }
0 commit comments