summaryrefslogtreecommitdiff
path: root/editor/plugins/animation_blend_space_editor.h
blob: 66d2ec6caeff70e7053e2c388636589ebdb401bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#ifndef ANIMATION_BLEND_SPACE_EDITOR_H
#define ANIMATION_BLEND_SPACE_EDITOR_H

#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
#include "editor/property_editor.h"
#include "scene/animation/animation_blend_space.h"
#include "scene/gui/button.h"
#include "scene/gui/graph_edit.h"
#include "scene/gui/popup.h"
#include "scene/gui/tree.h"
/**
	@author Juan Linietsky <reduzio@gmail.com>
*/

class AnimationNodeBlendSpaceEditor : public VBoxContainer {

	GDCLASS(AnimationNodeBlendSpaceEditor, VBoxContainer);

	Ref<AnimationNodeBlendSpace> blend_space;

	HBoxContainer *goto_parent_hb;
	ToolButton *goto_parent;

	PanelContainer *panel;
	ToolButton *tool_blend;
	ToolButton *tool_select;
	ToolButton *tool_create;
	ToolButton *tool_triangle;
	VSeparator *tool_erase_sep;
	ToolButton *tool_erase;
	ToolButton *snap;
	SpinBox *snap_x;
	SpinBox *snap_y;

	ToolButton *auto_triangles;

	LineEdit *label_x;
	LineEdit *label_y;
	SpinBox *max_x_value;
	SpinBox *min_x_value;
	SpinBox *max_y_value;
	SpinBox *min_y_value;

	HBoxContainer *edit_hb;
	SpinBox *edit_x;
	SpinBox *edit_y;
	Button *open_editor;

	int selected_point;
	int selected_triangle;

	Control *blend_space_draw;

	PanelContainer *error_panel;
	Label *error_label;

	bool updating;

	UndoRedo *undo_redo;

	static AnimationNodeBlendSpaceEditor *singleton;

	void _blend_space_gui_input(const Ref<InputEvent> &p_event);
	void _blend_space_draw();

	void _update_space();

	void _config_changed(double);
	void _labels_changed(String);
	void _snap_toggled();

	PopupMenu *menu;
	PopupMenu *animations_menu;
	Vector<String> animations_to_add;
	Vector2 add_point_pos;
	Vector<Vector2> points;

	bool dragging_selected_attempt;
	bool dragging_selected;
	Vector2 drag_from;
	Vector2 drag_ofs;

	Vector<int> making_triangle;

	void _add_menu_type(int p_index);
	void _add_animation_type(int p_index);

	void _tool_switch(int p_tool);
	void _update_edited_point_pos();
	void _update_tool_erase();
	void _erase_selected();
	void _edit_point_pos(double);
	void _open_editor();

	void _goto_parent();

	void _removed_from_graph();

	void _auto_triangles_toggled();

protected:
	void _notification(int p_what);
	static void _bind_methods();

public:
	static AnimationNodeBlendSpaceEditor *get_singleton() { return singleton; }
	void edit(AnimationNodeBlendSpace *p_blend_space);
	AnimationNodeBlendSpaceEditor();
};

class AnimationNodeBlendSpaceEditorPlugin : public EditorPlugin {

	GDCLASS(AnimationNodeBlendSpaceEditorPlugin, EditorPlugin);

	AnimationNodeBlendSpaceEditor *anim_tree_editor;
	EditorNode *editor;
	Button *button;

public:
	virtual String get_name() const { return "BlendSpace"; }
	bool has_main_screen() const { return false; }
	virtual void edit(Object *p_object);
	virtual bool handles(Object *p_object) const;
	virtual void make_visible(bool p_visible);

	AnimationNodeBlendSpaceEditorPlugin(EditorNode *p_node);
	~AnimationNodeBlendSpaceEditorPlugin();
};
#endif // ANIMATION_BLEND_SPACE_EDITOR_H