| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  spatial_editor_plugin.h                                              */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							|  |  |  | /*                    http://www.godotengine.org                         */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2016-01-01 11:50:53 -02:00
										 |  |  | /* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03: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.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | #ifndef SPATIAL_EDITOR_PLUGIN_H
 | 
					
						
							|  |  |  | #define SPATIAL_EDITOR_PLUGIN_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "tools/editor/editor_plugin.h"
 | 
					
						
							|  |  |  | #include "tools/editor/editor_node.h"
 | 
					
						
							|  |  |  | #include "scene/3d/visual_instance.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | #include "scene/3d/immediate_geometry.h"
 | 
					
						
							|  |  |  | #include "scene/3d/light.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "scene/gui/panel_container.h"
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  | 	@author Juan Linietsky <reduzio@gmail.com> | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Camera; | 
					
						
							|  |  |  | class SpatialEditor; | 
					
						
							|  |  |  | class SpatialEditorGizmos; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SpatialEditorGizmo : public SpatialGizmo { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	OBJ_TYPE(SpatialEditorGizmo,SpatialGizmo); | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	bool selected; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	void set_selected(bool p_selected) { selected=p_selected; } | 
					
						
							|  |  |  | 	bool is_selected() const { return selected; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	virtual String get_handle_name(int p_idx) const; | 
					
						
							|  |  |  | 	virtual Variant get_handle_value(int p_idx) const; | 
					
						
							|  |  |  | 	virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point); | 
					
						
							|  |  |  | 	virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual bool intersect_frustum(const Camera *p_camera,const Vector<Plane> &p_frustum); | 
					
						
							|  |  |  | 	virtual bool intersect_ray(const Camera *p_camera,const Point2& p_point,  Vector3& r_pos, Vector3& r_normal,int *r_gizmo_handle=NULL,bool p_sec_first=false); | 
					
						
							|  |  |  | 	SpatialEditorGizmo(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SpatialEditorViewport : public Control { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	OBJ_TYPE( SpatialEditorViewport, Control ); | 
					
						
							| 
									
										
										
										
											2014-10-03 00:10:51 -03:00
										 |  |  | friend class SpatialEditor; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	enum { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		VIEW_TOP, | 
					
						
							|  |  |  | 		VIEW_BOTTOM, | 
					
						
							|  |  |  | 		VIEW_LEFT, | 
					
						
							|  |  |  | 		VIEW_RIGHT, | 
					
						
							|  |  |  | 		VIEW_FRONT, | 
					
						
							|  |  |  | 		VIEW_REAR, | 
					
						
							|  |  |  | 		VIEW_CENTER_TO_SELECTION, | 
					
						
							| 
									
										
										
										
											2014-03-31 23:06:36 +08:00
										 |  |  | 		VIEW_ALIGN_SELECTION_WITH_VIEW, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		VIEW_PERSPECTIVE, | 
					
						
							|  |  |  | 		VIEW_ENVIRONMENT, | 
					
						
							| 
									
										
										
										
											2014-10-03 00:10:51 -03:00
										 |  |  | 		VIEW_ORTHOGONAL, | 
					
						
							|  |  |  | 		VIEW_AUDIO_LISTENER, | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 		VIEW_GIZMOS, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	enum { | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 		GIZMO_BASE_LAYER=27, | 
					
						
							| 
									
										
										
										
											2014-10-16 00:06:34 -03:00
										 |  |  | 		GIZMO_EDIT_LAYER=26, | 
					
						
							|  |  |  | 		GIZMO_GRID_LAYER=25 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	int index; | 
					
						
							| 
									
										
										
										
											2015-03-21 21:47:21 +01:00
										 |  |  | 	String name; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _menu_option(int p_option); | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	Size2 prev_size; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	EditorNode *editor; | 
					
						
							|  |  |  | 	EditorSelection *editor_selection; | 
					
						
							|  |  |  | 	UndoRedo *undo_redo; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Button *preview_camera; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	MenuButton *view_menu; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Control *surface; | 
					
						
							|  |  |  | 	Viewport *viewport; | 
					
						
							|  |  |  | 	Camera *camera; | 
					
						
							|  |  |  | 	bool transforming; | 
					
						
							|  |  |  | 	bool orthogonal; | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	float gizmo_scale; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-04 22:39:07 +01:00
										 |  |  | 	struct _RayResult { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Spatial* item; | 
					
						
							|  |  |  | 		float depth; | 
					
						
							|  |  |  | 		int handle; | 
					
						
							|  |  |  | 		_FORCE_INLINE_ bool operator<(const _RayResult& p_rr) const { return depth<p_rr.depth; } | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-21 21:47:21 +01:00
										 |  |  | 	void _update_name(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _compute_edit(const Point2& p_point); | 
					
						
							|  |  |  | 	void _clear_selected(); | 
					
						
							|  |  |  | 	void _select_clicked(bool p_append,bool p_single); | 
					
						
							|  |  |  | 	void _select(Spatial *p_node, bool p_append,bool p_single); | 
					
						
							|  |  |  | 	ObjectID _select_ray(const Point2& p_pos, bool p_append,bool &r_includes_current,int *r_gizmo_handle=NULL,bool p_alt_select=false); | 
					
						
							| 
									
										
										
										
											2015-11-04 22:39:07 +01:00
										 |  |  | 	void _find_items_at_pos(const Point2& p_pos,bool &r_includes_current,Vector<_RayResult> &results,bool p_alt_select=false); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Vector3 _get_ray_pos(const Vector2& p_pos) const; | 
					
						
							|  |  |  | 	Vector3 _get_ray(const Vector2& p_pos); | 
					
						
							|  |  |  | 	Point2 _point_to_screen(const Vector3& p_point); | 
					
						
							|  |  |  | 	Transform _get_camera_transform() const; | 
					
						
							|  |  |  | 	int get_selected_count() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector3 _get_camera_pos() const; | 
					
						
							|  |  |  | 	Vector3 _get_camera_normal() const; | 
					
						
							|  |  |  | 	Vector3 _get_screen_to_space(const Vector3& p_vector3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void _select_region(); | 
					
						
							|  |  |  | 	bool _gizmo_select(const Vector2& p_screenpos,bool p_hilite_only=false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	float get_znear() const; | 
					
						
							|  |  |  | 	float get_zfar() const; | 
					
						
							|  |  |  | 	float get_fov() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ObjectID clicked; | 
					
						
							| 
									
										
										
										
											2015-11-04 22:39:07 +01:00
										 |  |  | 	Vector<_RayResult> selection_results; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	bool clicked_includes_current; | 
					
						
							|  |  |  | 	bool clicked_wants_append; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-04 22:39:07 +01:00
										 |  |  | 	PopupMenu *selection_menu; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-31 11:07:21 +08:00
										 |  |  | 	enum NavigationScheme { | 
					
						
							|  |  |  | 		NAVIGATION_GODOT, | 
					
						
							| 
									
										
										
										
											2014-03-31 15:52:27 +08:00
										 |  |  | 		NAVIGATION_MAYA, | 
					
						
							|  |  |  | 		NAVIGATION_MODO, | 
					
						
							| 
									
										
										
										
											2014-03-31 11:07:21 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 	NavigationScheme _get_navigation_schema(const String& p_property); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-28 14:01:08 +01:00
										 |  |  | 	enum NavigationZoomStyle { | 
					
						
							|  |  |  | 		NAVIGATION_ZOOM_VERTICAL, | 
					
						
							|  |  |  | 		NAVIGATION_ZOOM_HORIZONTAL | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 	NavigationZoomStyle _get_navigation_zoom_style(const String& p_property); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-31 11:07:21 +08:00
										 |  |  | 	enum NavigationMode { | 
					
						
							|  |  |  | 		NAVIGATION_NONE, | 
					
						
							|  |  |  | 		NAVIGATION_PAN, | 
					
						
							|  |  |  | 		NAVIGATION_ZOOM, | 
					
						
							|  |  |  | 		NAVIGATION_ORBIT | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	enum TransformMode { | 
					
						
							|  |  |  | 		TRANSFORM_NONE, | 
					
						
							|  |  |  | 		TRANSFORM_ROTATE, | 
					
						
							|  |  |  | 		TRANSFORM_TRANSLATE, | 
					
						
							|  |  |  | 		TRANSFORM_SCALE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 	enum TransformPlane { | 
					
						
							|  |  |  | 		TRANSFORM_VIEW, | 
					
						
							|  |  |  | 		TRANSFORM_X_AXIS, | 
					
						
							|  |  |  | 		TRANSFORM_Y_AXIS, | 
					
						
							|  |  |  | 		TRANSFORM_Z_AXIS, | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct EditData { | 
					
						
							|  |  |  | 		TransformMode mode; | 
					
						
							|  |  |  | 		TransformPlane plane; | 
					
						
							|  |  |  | 		Transform original; | 
					
						
							|  |  |  | 		Vector3 click_ray; | 
					
						
							|  |  |  | 		Vector3 click_ray_pos; | 
					
						
							|  |  |  | 		Vector3 center; | 
					
						
							|  |  |  | 		Vector3 orig_gizmo_pos; | 
					
						
							|  |  |  | 		int edited_gizmo; | 
					
						
							|  |  |  | 		Point2 mouse_pos; | 
					
						
							|  |  |  | 		bool snap; | 
					
						
							|  |  |  | 		Ref<SpatialEditorGizmo> gizmo; | 
					
						
							|  |  |  | 		int gizmo_handle; | 
					
						
							|  |  |  | 		Variant gizmo_initial_value; | 
					
						
							|  |  |  | 		Vector3 gizmo_initial_pos; | 
					
						
							|  |  |  | 	} _edit; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct Cursor { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Vector3 cursor_pos; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Vector3 pos; | 
					
						
							|  |  |  | 		float x_rot,y_rot,distance; | 
					
						
							|  |  |  | 		bool region_select; | 
					
						
							|  |  |  | 		Point2 region_begin,region_end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Cursor() { x_rot=y_rot=0; distance=4; region_select=false; } | 
					
						
							|  |  |  | 	} cursor; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	RID move_gizmo_instance[3], rotate_gizmo_instance[3]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	String last_message; | 
					
						
							|  |  |  | 	String message; | 
					
						
							|  |  |  | 	float message_time; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_message(String p_message,float p_time=5); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	void _update_camera(); | 
					
						
							|  |  |  | 	void _draw(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void _smouseenter(); | 
					
						
							|  |  |  | 	void _sinput(const InputEvent& p_ie); | 
					
						
							|  |  |  | 	SpatialEditor *spatial_editor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Camera* previewing; | 
					
						
							|  |  |  | 	Camera* preview; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void _preview_exited_scene(); | 
					
						
							|  |  |  | 	void _toggle_camera_preview(bool); | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	void _init_gizmo_instance(int p_idx); | 
					
						
							| 
									
										
										
										
											2015-04-20 19:38:02 -03:00
										 |  |  | 	void _finish_gizmo_instances(); | 
					
						
							| 
									
										
										
										
											2015-11-04 22:39:07 +01:00
										 |  |  | 	void _selection_result_pressed(int); | 
					
						
							|  |  |  | 	void _selection_menu_hide(); | 
					
						
							| 
									
										
										
										
											2015-12-13 17:16:13 -03:00
										 |  |  | 	void _list_select(InputEventMouseButton b); | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | protected: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void _notification(int p_what); | 
					
						
							|  |  |  | 	static void _bind_methods(); | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	void update_transform_gizmo_view(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void set_can_preview(Camera* p_preview); | 
					
						
							|  |  |  | 	void set_state(const Dictionary& p_state); | 
					
						
							|  |  |  | 	Dictionary get_state() const; | 
					
						
							| 
									
										
										
										
											2014-09-19 18:39:50 -03:00
										 |  |  | 	void reset(); | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 	Viewport *get_viewport_node() { return viewport; } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	SpatialEditorViewport(SpatialEditor *p_spatial_editor,EditorNode *p_editor,int p_index); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SpatialEditorSelectedItem : public Object { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	OBJ_TYPE(SpatialEditorSelectedItem,Object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AABB aabb; | 
					
						
							|  |  |  | 	Transform original; // original location when moving
 | 
					
						
							|  |  |  | 	Transform last_xform; // last transform
 | 
					
						
							|  |  |  | 	Spatial *sp; | 
					
						
							|  |  |  | 	RID sbox_instance; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SpatialEditorSelectedItem() { sp=NULL; } | 
					
						
							|  |  |  | 	~SpatialEditorSelectedItem(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SpatialEditor : public VBoxContainer { | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	OBJ_TYPE(SpatialEditor, VBoxContainer ); | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	enum ToolMode { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		TOOL_MODE_SELECT, | 
					
						
							|  |  |  | 		TOOL_MODE_MOVE, | 
					
						
							|  |  |  | 		TOOL_MODE_ROTATE, | 
					
						
							| 
									
										
										
										
											2015-12-13 17:16:13 -03:00
										 |  |  | 		TOOL_MODE_SCALE, | 
					
						
							|  |  |  | 		TOOL_MODE_LIST_SELECT, | 
					
						
							|  |  |  | 		TOOL_MAX | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	EditorNode *editor; | 
					
						
							|  |  |  | 	EditorSelection *editor_selection; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Control *viewport_base; | 
					
						
							|  |  |  | 	SpatialEditorViewport *viewports[4]; | 
					
						
							|  |  |  | 	VSplitContainer *shader_split; | 
					
						
							|  |  |  | 	HSplitContainer *palette_split; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ToolMode tool_mode; | 
					
						
							|  |  |  | 	bool orthogonal; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VisualServer::ScenarioDebugMode scenario_debug; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RID light; | 
					
						
							|  |  |  | 	RID light_instance; | 
					
						
							|  |  |  | 	Transform light_transform; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RID origin; | 
					
						
							|  |  |  | 	RID origin_instance; | 
					
						
							|  |  |  | 	RID grid[3]; | 
					
						
							|  |  |  | 	RID grid_instance[3]; | 
					
						
							|  |  |  | 	bool grid_visible[3]; //currently visible
 | 
					
						
							|  |  |  | 	float last_grid_snap; | 
					
						
							|  |  |  | 	bool grid_enable[3]; //should be always visible if true
 | 
					
						
							|  |  |  | 	bool grid_enabled; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Mesh> move_gizmo[3], rotate_gizmo[3]; | 
					
						
							|  |  |  | 	Ref<FixedMaterial> gizmo_color[3]; | 
					
						
							|  |  |  | 	Ref<FixedMaterial> gizmo_hl; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	int over_gizmo_handle; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Mesh> selection_box; | 
					
						
							|  |  |  | 	RID indicators; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 	RID indicators_instance; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	RID cursor_mesh; | 
					
						
							|  |  |  | 	RID cursor_instance; | 
					
						
							| 
									
										
										
										
											2015-04-20 19:38:02 -03:00
										 |  |  | 	RID indicator_mat; | 
					
						
							|  |  |  | 	RID cursor_material; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | 	struct Selected { | 
					
						
							|  |  |  | 		AABB aabb; | 
					
						
							|  |  |  | 		Transform original; // original location when moving
 | 
					
						
							|  |  |  | 		Transform last_xform; // last transform
 | 
					
						
							|  |  |  | 		Spatial *sp; | 
					
						
							|  |  |  | 		RID poly_instance; | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Map<uint32_t,Selected> selected; | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 	struct Gizmo { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		bool visible; | 
					
						
							|  |  |  | 		float scale; | 
					
						
							|  |  |  | 		Transform transform; | 
					
						
							|  |  |  | 	} gizmo; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	enum MenuOption { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		MENU_TOOL_SELECT, | 
					
						
							|  |  |  | 		MENU_TOOL_MOVE, | 
					
						
							|  |  |  | 		MENU_TOOL_ROTATE, | 
					
						
							|  |  |  | 		MENU_TOOL_SCALE, | 
					
						
							| 
									
										
										
										
											2015-12-13 17:16:13 -03:00
										 |  |  | 		MENU_TOOL_LIST_SELECT, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		MENU_TRANSFORM_USE_SNAP, | 
					
						
							|  |  |  | 		MENU_TRANSFORM_CONFIGURE_SNAP, | 
					
						
							|  |  |  | 		MENU_TRANSFORM_LOCAL_COORDS, | 
					
						
							|  |  |  | 		MENU_TRANSFORM_DIALOG, | 
					
						
							|  |  |  | 		MENU_VIEW_USE_1_VIEWPORT, | 
					
						
							|  |  |  | 		MENU_VIEW_USE_2_VIEWPORTS, | 
					
						
							| 
									
										
										
										
											2014-10-09 00:06:51 -03:00
										 |  |  | 		MENU_VIEW_USE_2_VIEWPORTS_ALT, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		MENU_VIEW_USE_3_VIEWPORTS, | 
					
						
							| 
									
										
										
										
											2014-10-09 00:06:51 -03:00
										 |  |  | 		MENU_VIEW_USE_3_VIEWPORTS_ALT, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		MENU_VIEW_USE_4_VIEWPORTS, | 
					
						
							|  |  |  | 		MENU_VIEW_USE_DEFAULT_LIGHT, | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 		MENU_VIEW_USE_DEFAULT_SRGB, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		MENU_VIEW_DISPLAY_NORMAL, | 
					
						
							|  |  |  | 		MENU_VIEW_DISPLAY_WIREFRAME, | 
					
						
							|  |  |  | 		MENU_VIEW_DISPLAY_OVERDRAW, | 
					
						
							| 
									
										
										
										
											2014-09-18 00:18:57 -03:00
										 |  |  | 		MENU_VIEW_DISPLAY_SHADELESS, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		MENU_VIEW_ORIGIN, | 
					
						
							|  |  |  | 		MENU_VIEW_GRID, | 
					
						
							|  |  |  | 		MENU_VIEW_CAMERA_SETTINGS, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-13 17:16:13 -03:00
										 |  |  | 	Button *tool_button[TOOL_MAX]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Button *instance_button; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	MenuButton* transform_menu; | 
					
						
							|  |  |  | 	MenuButton* view_menu; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ConfirmationDialog *snap_dialog; | 
					
						
							|  |  |  | 	ConfirmationDialog *xform_dialog; | 
					
						
							|  |  |  | 	ConfirmationDialog *settings_dialog; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool snap_enabled; | 
					
						
							|  |  |  | 	LineEdit *snap_translate; | 
					
						
							|  |  |  | 	LineEdit *snap_rotate; | 
					
						
							|  |  |  | 	LineEdit *snap_scale; | 
					
						
							|  |  |  | 	PanelContainer* menu_panel; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	LineEdit *xform_translate[3]; | 
					
						
							|  |  |  | 	LineEdit *xform_rotate[3]; | 
					
						
							|  |  |  | 	LineEdit *xform_scale[3]; | 
					
						
							|  |  |  | 	OptionButton *xform_type; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 	VBoxContainer *settings_vbc; | 
					
						
							|  |  |  | 	SpinBox *settings_fov; | 
					
						
							|  |  |  | 	SpinBox *settings_znear; | 
					
						
							|  |  |  | 	SpinBox *settings_zfar; | 
					
						
							|  |  |  | 	DirectionalLight *settings_dlight; | 
					
						
							|  |  |  | 	ImmediateGeometry *settings_sphere; | 
					
						
							|  |  |  | 	Camera *settings_camera; | 
					
						
							|  |  |  | 	float settings_default_light_rot_x; | 
					
						
							|  |  |  | 	float settings_default_light_rot_y; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Control *settings_light_base; | 
					
						
							|  |  |  | 	Viewport *settings_light_vp; | 
					
						
							|  |  |  | 	ColorPickerButton *settings_ambient_color; | 
					
						
							|  |  |  | 	Image settings_light_dir_image; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void _xform_dialog_action(); | 
					
						
							|  |  |  | 	void _menu_item_pressed(int p_option); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	HBoxContainer *hbc_menu; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | //
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 	void _generate_selection_box(); | 
					
						
							|  |  |  | 	UndoRedo *undo_redo; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void _instance_scene(); | 
					
						
							|  |  |  | 	void _init_indicators(); | 
					
						
							|  |  |  | 	void _finish_indicators(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 18:45:48 +08:00
										 |  |  | 	void _toggle_maximize_view(Object* p_viewport); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Node *custom_camera; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Object *_get_editor_data(Object *p_what); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Environment> viewport_environment; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	Spatial *selected; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _request_gizmo(Object* p_obj); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static SpatialEditor *singleton; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	void _node_removed(Node* p_node); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	SpatialEditorGizmos *gizmos; | 
					
						
							|  |  |  | 	SpatialEditor(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 	void _update_ambient_light_color(const Color& p_color); | 
					
						
							|  |  |  | 	void _update_default_light_angle(); | 
					
						
							|  |  |  | 	void _default_light_angle_input(const InputEvent& p_event); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void _notification(int p_what); | 
					
						
							|  |  |  | 	//void _input_event(InputEvent p_event);
 | 
					
						
							|  |  |  | 	void _unhandled_key_input(InputEvent p_event); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static void _bind_methods(); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static SpatialEditor *get_singleton() { return singleton; } | 
					
						
							|  |  |  | 	void snap_cursor_to_plane(const Plane& p_plane); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 02:13:22 -03:00
										 |  |  | 	float get_znear() const { return settings_znear->get_val(); } | 
					
						
							|  |  |  | 	float get_zfar() const { return settings_zfar->get_val(); } | 
					
						
							|  |  |  | 	float get_fov() const { return settings_fov->get_val(); } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Transform get_gizmo_transform() const { return gizmo.transform; } | 
					
						
							|  |  |  | 	bool is_gizmo_visible() const { return gizmo.visible; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ToolMode get_tool_mode() const { return tool_mode; } | 
					
						
							|  |  |  | 	bool is_snap_enabled() const { return snap_enabled; } | 
					
						
							|  |  |  | 	float get_translate_snap() const { return snap_translate->get_text().to_double(); } | 
					
						
							|  |  |  | 	float get_rotate_snap() const { return snap_rotate->get_text().to_double(); } | 
					
						
							|  |  |  | 	float get_scale_snap() const { return snap_scale->get_text().to_double(); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	Ref<Mesh> get_move_gizmo(int idx) const { return move_gizmo[idx]; } | 
					
						
							|  |  |  | 	Ref<Mesh> get_rotate_gizmo(int idx) const { return rotate_gizmo[idx]; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void update_transform_gizmo(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void select_gizmo_hilight_axis(int p_axis); | 
					
						
							|  |  |  | 	void set_custom_camera(Node *p_camera) { custom_camera=p_camera; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_undo_redo(UndoRedo *p_undo_redo) {undo_redo=p_undo_redo; } | 
					
						
							|  |  |  | 	Dictionary get_state() const; | 
					
						
							|  |  |  | 	void set_state(const Dictionary& p_state); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Environment> get_viewport_environment() { return viewport_environment; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	UndoRedo *get_undo_redo() { return undo_redo; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void add_control_to_menu_panel(Control *p_control); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VSplitContainer *get_shader_split(); | 
					
						
							|  |  |  | 	HSplitContainer *get_palette_split(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 22:50:23 -03:00
										 |  |  | 	Spatial *get_selected() { return selected; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int get_over_gizmo_handle() const { return over_gizmo_handle; } | 
					
						
							|  |  |  | 	void set_over_gizmo_handle(int idx) { over_gizmo_handle=idx; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void set_can_preview(Camera* p_preview); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-31 01:59:42 -03:00
										 |  |  | 	SpatialEditorViewport *get_editor_viewport(int p_idx) { | 
					
						
							|  |  |  | 		ERR_FAIL_INDEX_V(p_idx,4,NULL); | 
					
						
							|  |  |  | 		return viewports[p_idx]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Camera *get_camera() { return NULL; } | 
					
						
							|  |  |  | 	void edit(Spatial *p_spatial); | 
					
						
							| 
									
										
										
										
											2014-09-19 18:39:50 -03:00
										 |  |  | 	void clear(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	SpatialEditor(EditorNode *p_editor); | 
					
						
							|  |  |  | 	~SpatialEditor(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SpatialEditorPlugin : public EditorPlugin { | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	OBJ_TYPE( SpatialEditorPlugin, EditorPlugin ); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	SpatialEditor *spatial_editor; | 
					
						
							|  |  |  | 	EditorNode *editor; | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  | 	static void _bind_methods(); | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void snap_cursor_to_plane(const Plane& p_plane); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SpatialEditor *get_spatial_editor() { return spatial_editor; } | 
					
						
							|  |  |  | 	virtual String get_name() const { return "3D"; } | 
					
						
							|  |  |  | 	bool has_main_screen() const { return true; } | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 	virtual void make_visible(bool p_visible); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	virtual void edit(Object *p_object); | 
					
						
							|  |  |  | 	virtual bool handles(Object *p_object) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual Dictionary get_state() const; | 
					
						
							|  |  |  | 	virtual void set_state(const Dictionary& p_state); | 
					
						
							| 
									
										
										
										
											2014-09-19 18:39:50 -03:00
										 |  |  | 	virtual void clear() { spatial_editor->clear(); } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SpatialEditorPlugin(EditorNode *p_node); | 
					
						
							|  |  |  | 	~SpatialEditorPlugin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |