diff --git a/procedural_animation.cpp b/procedural_animation.cpp index 65565fc..7bdc9ab 100644 --- a/procedural_animation.cpp +++ b/procedural_animation.cpp @@ -1,5 +1,43 @@ #include "procedural_animation.h" +Ref ProceduralAnimation::get_animation() const { + return _animation; +} +void ProceduralAnimation::set_animation(const Ref &value) { + _animation = value; +} + +String ProceduralAnimation::get_animation_keyframe_name(int keyframe_index) const { + if (!_keyframe_names.has(keyframe_index)) { + return String::num(keyframe_index); + } + + return String::num(keyframe_index) + " " + _keyframe_names[keyframe_index]; +} +void ProceduralAnimation::set_animation_keyframe_name(int keyframe_index, const String &value) { + _keyframe_names[keyframe_index] = value; +} +void ProceduralAnimation::remove_animation_keyframe_name(int keyframe_index) { + if (!_keyframe_names.has(keyframe_index)) { + return; + } + + _keyframe_names.erase(keyframe_index); +} +PoolVector ProceduralAnimation::get_animation_keyframe_names() const { + PoolVector names; + + names.resize(_keyframe_names.size()); + + int i = 0; + for (Map::Element *E = _keyframe_names.front(); E; E = E->next()) { + names.set(i, String::num(E->key()) + " " + _keyframe_names[E->key()]); + ++i; + } + + return names; +} + //Categories PoolVector ProceduralAnimation::get_category_indices() const { PoolVector idxr; @@ -562,6 +600,14 @@ void ProceduralAnimation::_get_property_list(List *p_list) const { } void ProceduralAnimation::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_animation"), &ProceduralAnimation::get_animation); + ClassDB::bind_method(D_METHOD("set_animation", "value"), &ProceduralAnimation::set_animation); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "animation", PROPERTY_HINT_RESOURCE_TYPE, "Animation"), "set_animation", "get_animation"); + + ClassDB::bind_method(D_METHOD("get_animation_keyframe_name", "keyframe_index"), &ProceduralAnimation::get_animation_keyframe_name); + ClassDB::bind_method(D_METHOD("set_animation_keyframe_name", "keyframe_index", "value"), &ProceduralAnimation::set_animation_keyframe_name); + ClassDB::bind_method(D_METHOD("remove_animation_keyframe_name", "keyframe_index"), &ProceduralAnimation::remove_animation_keyframe_name); + ClassDB::bind_method(D_METHOD("get_animation_keyframe_names"), &ProceduralAnimation::get_animation_keyframe_names); //Categories ClassDB::bind_method(D_METHOD("get_category_indices"), &ProceduralAnimation::get_category_indices); diff --git a/procedural_animation.h b/procedural_animation.h index f882eac..58a7971 100644 --- a/procedural_animation.h +++ b/procedural_animation.h @@ -5,6 +5,7 @@ #include "core/map.h" #include "core/vector.h" +#include "core/pool_vector.h" #include "core/math/vector2.h" #include "scene/resources/animation.h" #include "scene/resources/curve.h" @@ -15,6 +16,14 @@ class ProceduralAnimation : public Resource { GDCLASS(ProceduralAnimation, Resource); public: + Ref get_animation() const; + void set_animation(const Ref &value); + + String get_animation_keyframe_name(int keyframe_index) const; + void set_animation_keyframe_name(int keyframe_index, const String &value); + void remove_animation_keyframe_name(int keyframe_index); + PoolVector get_animation_keyframe_names() const; + //Categories PoolVector get_category_indices() const; int add_category(const String &name); @@ -77,6 +86,7 @@ protected: AnimationKeyFrame() { animation_keyframe_index = 0; next_keyframe = -1; + in_curve.instance(); } ~AnimationKeyFrame() { diff --git a/procedural_animation_editor_plugin.cpp b/procedural_animation_editor_plugin.cpp index 8d093d7..4a95b2c 100644 --- a/procedural_animation_editor_plugin.cpp +++ b/procedural_animation_editor_plugin.cpp @@ -22,6 +22,8 @@ void ProceduralAnimationEditor::load_selected_animation() { _start_node->set_offset(_animation->get_animation_node_position(_selected_category, _selected_animation)); + const PoolVector &animation_names = _animation->get_animation_keyframe_names(); + PoolVector kfind = _animation->get_keyframe_indices(_selected_category, _selected_animation); for (int i = 0; i < kfind.size(); ++i) { @@ -29,6 +31,9 @@ void ProceduralAnimationEditor::load_selected_animation() { ProceduralAnimationEditorGraphNode *gn = memnew(ProceduralAnimationEditorGraphNode); _graph_edit->add_child(gn); + + //gn->set_animation_keyframe_names(animation_names); + gn->set_id(id); gn->set_offset(_animation->get_keyframe_node_position(_selected_category, _selected_animation, id)); gn->set_keyframe_name(_animation->get_keyframe_name(_selected_category, _selected_animation, id)); @@ -275,7 +280,6 @@ void ProceduralAnimationEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("on_animation_option_button_pressed", "index"), &ProceduralAnimationEditor::on_animation_option_button_pressed); ClassDB::bind_method(D_METHOD("on_keyframe_node_changed", "node"), &ProceduralAnimationEditor::on_keyframe_node_changed); - } ProceduralAnimationEditor::ProceduralAnimationEditor() { @@ -399,21 +403,25 @@ String ProceduralAnimationEditorGraphNode::get_keyframe_name() const { } void ProceduralAnimationEditorGraphNode::set_keyframe_name(const String &value) { _name->set_text(value); - //emit_signal("graphnode_changed", this); + emit_signal("graphnode_changed", this); } void ProceduralAnimationEditorGraphNode::on_keyframe_name_modified(const String &value) { emit_signal("graphnode_changed", this); } -void ProceduralAnimationEditorGraphNode::set_animation_keyframe_str(const String &value) { - set_animation_keyframe_index(value.to_int()); -} - int ProceduralAnimationEditorGraphNode::get_animation_keyframe_index() const { return _animation_keyframe_index; } void ProceduralAnimationEditorGraphNode::set_animation_keyframe_index(const int value) { + if (_animation_keyframe_index == value) + return; + + if (_animation_keyframe_spinbox->get_line_edit()->get_text().to_int() != value) { + _animation_keyframe_spinbox->get_line_edit()->set_text(String::num(value)); + } + _animation_keyframe_index = value; + //_animation_keyframe_index_option_button->select(value); emit_signal("graphnode_changed", this); } @@ -429,15 +437,33 @@ Ref ProceduralAnimationEditorGraphNode::get_in_curve() const { return _in_curve; } void ProceduralAnimationEditorGraphNode::set_in_curve(const Ref &value) { + if (_in_curve.is_valid()) { + _in_curve->disconnect(CoreStringNames::get_singleton()->changed, this, "changed"); + } + _in_curve = value; + _curve_editor->set_curve(value); + _in_curve->connect(CoreStringNames::get_singleton()->changed, this, "changed"); emit_signal("graphnode_changed", this); } -//void ProceduralAnimationEditorGraphNode::set_position(const Vector2 &value) { - //Control::set_position(value); +void ProceduralAnimationEditorGraphNode::set_animation_keyframe_names(const PoolVector &names) { + //_animation_keyframe_index_option_button->clear(); - //emit_signal("graphnode_changed", this); -//} + //for (int i = 0; i < names.size(); ++i) { + // const String &s = names[i]; + + // _animation_keyframe_index_option_button->add_item(s, s.get_slicec(' ', 0).to_int()); + //} +} + +void ProceduralAnimationEditorGraphNode::on_animation_keyframe_spinbox_value_changed(const String &value) { + set_animation_keyframe_index(value.to_int()); +} + +void ProceduralAnimationEditorGraphNode::changed() { + emit_signal("graphnode_changed", this); +} ProceduralAnimationEditorGraphNode::ProceduralAnimationEditorGraphNode() { _id = 0; @@ -447,7 +473,6 @@ ProceduralAnimationEditorGraphNode::ProceduralAnimationEditorGraphNode() { set_title("Animation Frame"); set_show_close_button(true); - //gn->set_position() Label *l1 = memnew(Label); l1->set_text("Name"); @@ -461,14 +486,19 @@ ProceduralAnimationEditorGraphNode::ProceduralAnimationEditorGraphNode() { l2->set_text("Keyframe"); add_child(l2); - HBoxContainer *kfc = memnew(HBoxContainer); - add_child(kfc); + _animation_keyframe_spinbox = memnew(SpinBox); + _animation_keyframe_spinbox->set_max(999999999); + _animation_keyframe_spinbox->set_h_size_flags(SIZE_EXPAND_FILL); + _animation_keyframe_spinbox->get_line_edit()->connect("text_changed", this, "on_animation_keyframe_spinbox_value_changed"); + add_child(_animation_keyframe_spinbox); - //OptionButton *kob = memnew(OptionButton); - SpinBox *kob = memnew(SpinBox); - kob->set_h_size_flags(SIZE_EXPAND_FILL); - kob->get_line_edit()->connect("text_entered", this, "set_animation_keyframe_str"); - kfc->add_child(kob); + //HBoxContainer *kfc = memnew(HBoxContainer); + //add_child(kfc); + + //_animation_keyframe_index_option_button = memnew(OptionButton); + //_animation_keyframe_index_option_button->set_h_size_flags(SIZE_EXPAND_FILL); + //_animation_keyframe_index_option_button->connect("item_selected", this, "set_animation_keyframe_index"); + //kfc->add_child(_animation_keyframe_index_option_button); //Button *kb = memnew(Button); //kb->set_text("E"); @@ -478,11 +508,9 @@ ProceduralAnimationEditorGraphNode::ProceduralAnimationEditorGraphNode() { l3->set_text("In Curve"); add_child(l3); - //placeholder - Button *pb = memnew(Button); - pb->set_text("Edit / Show"); - pb->set_custom_minimum_size(Size2(0, 69) * EDSCALE); - add_child(pb); + _curve_editor = memnew(CurveEditor); + _curve_editor->set_custom_minimum_size(Size2(0, 69) * EDSCALE); + add_child(_curve_editor); set_slot(0, true, 0, Color(0, 1, 0), true, 0, Color(0, 1, 0)); } @@ -491,11 +519,21 @@ ProceduralAnimationEditorGraphNode::~ProceduralAnimationEditorGraphNode() { _in_curve.unref(); } +void ProceduralAnimationEditorGraphNode::_notification(int p_what) { + switch (p_what){ + case NOTIFICATION_ENTER_TREE: + connect("offset_changed", this, "changed"); + break; + } +} + void ProceduralAnimationEditorGraphNode::_bind_methods() { ADD_SIGNAL(MethodInfo("graphnode_changed", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); - ClassDB::bind_method(D_METHOD("set_animation_keyframe_str", "name"), &ProceduralAnimationEditorGraphNode::set_animation_keyframe_str); ClassDB::bind_method(D_METHOD("on_keyframe_name_modified", "name"), &ProceduralAnimationEditorGraphNode::on_keyframe_name_modified); + ClassDB::bind_method(D_METHOD("changed"), &ProceduralAnimationEditorGraphNode::changed); + ClassDB::bind_method(D_METHOD("on_animation_keyframe_spinbox_value_changed", "value"), &ProceduralAnimationEditorGraphNode::on_animation_keyframe_spinbox_value_changed); + } void ProceduralAnimationEditorPlugin::edit(Object *p_object) { diff --git a/procedural_animation_editor_plugin.h b/procedural_animation_editor_plugin.h index 15701c1..ff8b09b 100644 --- a/procedural_animation_editor_plugin.h +++ b/procedural_animation_editor_plugin.h @@ -8,6 +8,9 @@ #include "scene/gui/menu_button.h" #include "procedural_animation.h" +#include "core/core_string_names.h" + +#include "editor/plugins/curve_editor_plugin.h" class ProceduralAnimationEditor : public VBoxContainer { GDCLASS(ProceduralAnimationEditor, VBoxContainer); @@ -83,7 +86,6 @@ public: void set_keyframe_name(const String &value); void on_keyframe_name_modified(const String &value); - void set_animation_keyframe_str(const String &value); int get_animation_keyframe_index() const; void set_animation_keyframe_index(const int value); @@ -93,20 +95,26 @@ public: Ref get_in_curve() const; void set_in_curve(const Ref &value); - //Vector2 get_position() const; - //void set_position(const Vector2 &value); + void set_animation_keyframe_names(const PoolVector &names); + void on_animation_keyframe_spinbox_value_changed(const String &value); + void changed(); + ProceduralAnimationEditorGraphNode(); ~ProceduralAnimationEditorGraphNode(); protected: + void _notification(int p_what); static void _bind_methods(); private: int _id; LineEdit *_name; + //OptionButton *_animation_keyframe_index_option_button; + SpinBox *_animation_keyframe_spinbox; int _animation_keyframe_index; int _next_keyframe; + CurveEditor *_curve_editor; Ref _in_curve; }; @@ -116,7 +124,7 @@ class ProceduralAnimationEditorPlugin : public EditorPlugin { public: virtual String get_name() const { return "ProceduralAnimation"; } bool has_main_screen() const { return false; } - virtual void edit(Object *p_object); + virtual void edit(Object *p_object); virtual bool handles(Object *p_object) const; virtual void make_visible(bool p_visible);