| 
									
										
										
										
											2017-04-28 20:04:09 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  curve_editor_plugin.h                                                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2017-04-28 20:04:09 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2022-01-03 21:27:34 +01:00
										 |  |  | /* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2017-04-28 20:04:09 +02:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | #ifndef CURVE_EDITOR_PLUGIN_H
 | 
					
						
							|  |  |  | #define CURVE_EDITOR_PLUGIN_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-11 20:12:48 +01:00
										 |  |  | #include "editor/editor_inspector.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | #include "editor/editor_plugin.h"
 | 
					
						
							| 
									
										
										
										
											2019-12-24 15:17:23 +08:00
										 |  |  | #include "editor/editor_resource_preview.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | #include "scene/resources/curve.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | // Edits a y(x) curve
 | 
					
						
							|  |  |  | class CurveEditor : public Control { | 
					
						
							| 
									
										
										
										
											2019-03-19 14:35:57 -04:00
										 |  |  | 	GDCLASS(CurveEditor, Control); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | public: | 
					
						
							|  |  |  | 	CurveEditor(); | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	Size2 get_minimum_size() const override; | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 	void set_curve(Ref<Curve> curve); | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 	enum PresetID { | 
					
						
							|  |  |  | 		PRESET_FLAT0 = 0, | 
					
						
							|  |  |  | 		PRESET_FLAT1, | 
					
						
							|  |  |  | 		PRESET_LINEAR, | 
					
						
							|  |  |  | 		PRESET_EASE_IN, | 
					
						
							|  |  |  | 		PRESET_EASE_OUT, | 
					
						
							|  |  |  | 		PRESET_SMOOTHSTEP, | 
					
						
							|  |  |  | 		PRESET_COUNT | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 	enum ContextAction { | 
					
						
							|  |  |  | 		CONTEXT_ADD_POINT = 0, | 
					
						
							| 
									
										
										
										
											2017-06-26 23:39:35 +02:00
										 |  |  | 		CONTEXT_REMOVE_POINT, | 
					
						
							|  |  |  | 		CONTEXT_LINEAR, | 
					
						
							|  |  |  | 		CONTEXT_LEFT_LINEAR, | 
					
						
							|  |  |  | 		CONTEXT_RIGHT_LINEAR | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 	enum TangentIndex { | 
					
						
							|  |  |  | 		TANGENT_NONE = -1, | 
					
						
							|  |  |  | 		TANGENT_LEFT = 0, | 
					
						
							|  |  |  | 		TANGENT_RIGHT = 1 | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  | 	void _notification(int p_what); | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2021-08-22 12:37:22 -03:00
										 |  |  | 	virtual void gui_input(const Ref<InputEvent> &p_event) override; | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 	void on_preset_item_selected(int preset_id); | 
					
						
							|  |  |  | 	void _curve_changed(); | 
					
						
							|  |  |  | 	void on_context_menu_item_selected(int action_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void open_context_menu(Vector2 pos); | 
					
						
							|  |  |  | 	int get_point_at(Vector2 pos) const; | 
					
						
							| 
									
										
										
										
											2017-06-26 23:39:35 +02:00
										 |  |  | 	TangentIndex get_tangent_at(Vector2 pos) const; | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 	void add_point(Vector2 pos); | 
					
						
							|  |  |  | 	void remove_point(int index); | 
					
						
							| 
									
										
										
										
											2017-06-26 23:39:35 +02:00
										 |  |  | 	void toggle_linear(TangentIndex tangent = TANGENT_NONE); | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 	void set_selected_point(int index); | 
					
						
							|  |  |  | 	void set_hover_point_index(int index); | 
					
						
							|  |  |  | 	void update_view_transform(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector2 get_tangent_view_pos(int i, TangentIndex tangent) const; | 
					
						
							|  |  |  | 	Vector2 get_view_pos(Vector2 world_pos) const; | 
					
						
							|  |  |  | 	Vector2 get_world_pos(Vector2 view_pos) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void _draw(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	Transform2D _world_to_view; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Curve> _curve_ref; | 
					
						
							| 
									
										
										
										
											2022-04-04 15:06:57 +02:00
										 |  |  | 	PopupMenu *_context_menu = nullptr; | 
					
						
							|  |  |  | 	PopupMenu *_presets_menu = nullptr; | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Array _undo_data; | 
					
						
							|  |  |  | 	bool _has_undo_data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector2 _context_click_pos; | 
					
						
							|  |  |  | 	int _selected_point; | 
					
						
							|  |  |  | 	int _hover_point; | 
					
						
							| 
									
										
										
										
											2017-06-26 23:39:35 +02:00
										 |  |  | 	TangentIndex _selected_tangent; | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | 	bool _dragging; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Constant
 | 
					
						
							|  |  |  | 	float _hover_radius; | 
					
						
							|  |  |  | 	float _tangents_length; | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-17 18:02:16 -03:00
										 |  |  | class EditorInspectorPluginCurve : public EditorInspectorPlugin { | 
					
						
							| 
									
										
										
										
											2019-03-19 14:35:57 -04:00
										 |  |  | 	GDCLASS(EditorInspectorPluginCurve, EditorInspectorPlugin); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-17 18:02:16 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual bool can_handle(Object *p_object) override; | 
					
						
							|  |  |  | 	virtual void parse_begin(Object *p_object) override; | 
					
						
							| 
									
										
										
										
											2018-05-17 18:02:16 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | class CurveEditorPlugin : public EditorPlugin { | 
					
						
							| 
									
										
										
										
											2019-03-19 14:35:57 -04:00
										 |  |  | 	GDCLASS(CurveEditorPlugin, EditorPlugin); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 16:27:10 +02:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-01-27 10:36:51 +01:00
										 |  |  | 	CurveEditorPlugin(); | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual String get_name() const override { return "Curve"; } | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-02 01:46:44 +02:00
										 |  |  | class CurvePreviewGenerator : public EditorResourcePreviewGenerator { | 
					
						
							| 
									
										
										
										
											2019-03-19 14:35:57 -04:00
										 |  |  | 	GDCLASS(CurvePreviewGenerator, EditorResourcePreviewGenerator); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-02 01:46:44 +02:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual bool handles(const String &p_type) const override; | 
					
						
							|  |  |  | 	virtual Ref<Texture2D> generate(const Ref<Resource> &p_from, const Size2 &p_size) const override; | 
					
						
							| 
									
										
										
										
											2017-07-02 01:46:44 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-06 23:36:37 -03:00
										 |  |  | #endif // CURVE_EDITOR_PLUGIN_H
 |