summaryrefslogtreecommitdiff
path: root/tools/editor/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'tools/editor/plugins')
-rw-r--r--tools/editor/plugins/path_2d_editor_plugin.cpp90
-rw-r--r--tools/editor/plugins/path_2d_editor_plugin.h11
-rw-r--r--tools/editor/plugins/path_editor_plugin.cpp61
-rw-r--r--tools/editor/plugins/spatial_editor_plugin.cpp511
-rw-r--r--tools/editor/plugins/spatial_editor_plugin.h16
5 files changed, 413 insertions, 276 deletions
diff --git a/tools/editor/plugins/path_2d_editor_plugin.cpp b/tools/editor/plugins/path_2d_editor_plugin.cpp
index e83fed5ced..5e4cd98127 100644
--- a/tools/editor/plugins/path_2d_editor_plugin.cpp
+++ b/tools/editor/plugins/path_2d_editor_plugin.cpp
@@ -78,6 +78,9 @@ bool Path2DEditor::forward_input_event(const InputEvent& p_event) {
if (!node)
return false;
+ if (!node->is_visible())
+ return false;
+
if (!node->get_curve().is_valid())
return false;
@@ -89,9 +92,9 @@ bool Path2DEditor::forward_input_event(const InputEvent& p_event) {
Matrix32 xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
-
Vector2 gpoint = Point2(mb.x,mb.y);
- Vector2 cpoint = xform.affine_inverse().xform(gpoint);
+ Vector2 cpoint = !mb.mod.alt? snap_point(xform.affine_inverse().xform(gpoint))
+ : node->get_global_transform().affine_inverse().xform( snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)) );
//first check if a point is to be added (segment split)
real_t grab_treshold=EDITOR_DEF("poly_editor/point_grab_radius",8);
@@ -112,7 +115,7 @@ bool Path2DEditor::forward_input_event(const InputEvent& p_event) {
Point2 p = xform.xform( curve->get_point_pos(i) );
if (gpoint.distance_to(p) < grab_treshold ) {
- if (!mb.mod.control) {
+ if (!mb.mod.shift) {
action=ACTION_MOVING_POINT;
action_point=i;
@@ -173,6 +176,8 @@ bool Path2DEditor::forward_input_event(const InputEvent& p_event) {
moving_from=curve->get_point_pos(action_point);
moving_screen_from=gpoint;
+ canvas_item_editor->get_viewport_control()->update();
+
return true;
}
@@ -188,7 +193,7 @@ bool Path2DEditor::forward_input_event(const InputEvent& p_event) {
undo_redo->create_action("Move Point in Curve");
- undo_redo->add_do_method(curve.ptr(),"set_point_pos",action_point,new_pos);
+ undo_redo->add_do_method(curve.ptr(),"set_point_pos",action_point,cpoint);
undo_redo->add_undo_method(curve.ptr(),"set_point_pos",action_point,moving_from);
undo_redo->add_do_method(canvas_item_editor,"update");
undo_redo->add_undo_method(canvas_item_editor,"update");
@@ -420,17 +425,18 @@ bool Path2DEditor::forward_input_event(const InputEvent& p_event) {
Matrix32 xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
Vector2 gpoint = Point2(mm.x,mm.y);
+ Vector2 cpoint = !mm.mod.alt? snap_point(xform.affine_inverse().xform(gpoint))
+ : node->get_global_transform().affine_inverse().xform( snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)) );
Ref<Curve2D> curve = node->get_curve();
-
Vector2 new_pos = moving_from + xform.basis_xform( gpoint - moving_screen_from );
switch(action) {
case ACTION_MOVING_POINT: {
- curve->set_point_pos(action_point,new_pos);
+ curve->set_point_pos(action_point,cpoint);
} break;
case ACTION_MOVING_IN: {
@@ -445,7 +451,7 @@ bool Path2DEditor::forward_input_event(const InputEvent& p_event) {
}
- canvas_item_editor->update();
+ canvas_item_editor->get_viewport_control()->update();
return true;
}
@@ -471,59 +477,74 @@ void Path2DEditor::_canvas_draw() {
if (!node)
return ;
+ if (!node->is_visible())
+ return;
+
if (!node->get_curve().is_valid())
return ;
Matrix32 xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
Ref<Texture> handle= get_icon("EditorHandle","EditorIcons");
+ Size2 handle_size = handle->get_size();
Ref<Curve2D> curve = node->get_curve();
int len = curve->get_point_count();
- RID ci = canvas_item_editor->get_canvas_item();
+ Control *vpc = canvas_item_editor->get_viewport_control();
+
for(int i=0;i<len;i++) {
Vector2 point = xform.xform(curve->get_point_pos(i));
- handle->draw(ci,point-handle->get_size()*0.5,Color(1,1,1,0.3));
+ vpc->draw_texture_rect(handle,Rect2(point-handle_size*0.5,handle_size),false,Color(1,1,1,1));
if (i<len-1) {
Vector2 pointout = xform.xform(curve->get_point_pos(i)+curve->get_point_out(i));
- canvas_item_editor->draw_line(point,pointout,Color(0.5,0.5,1.0,0.8),1.0);
- handle->draw(ci,pointout-handle->get_size()*0.5,Color(1,0.5,1,0.3));
+ vpc->draw_line(point,pointout,Color(0.5,0.5,1.0,0.8),1.0);
+ vpc->draw_texture_rect(handle, Rect2(pointout-handle_size*0.5,handle_size),false,Color(1,0.5,1,0.3));
}
if (i>0) {
Vector2 pointin = xform.xform(curve->get_point_pos(i)+curve->get_point_in(i));
- canvas_item_editor->draw_line(point,pointin,Color(0.5,0.5,1.0,0.8),1.0);
- handle->draw(ci,pointin-handle->get_size()*0.5,Color(1,0.5,1,0.3));
+ vpc->draw_line(point,pointin,Color(0.5,0.5,1.0,0.8),1.0);
+ vpc->draw_texture_rect(handle, Rect2(pointin-handle_size*0.5,handle_size),false,Color(1,0.5,1,0.3));
}
}
}
+void Path2DEditor::_node_visibility_changed() {
+ if (!node)
+ return;
+ canvas_item_editor->get_viewport_control()->update();
+}
-void Path2DEditor::edit(Node *p_collision_polygon) {
+void Path2DEditor::edit(Node *p_path2d) {
if (!canvas_item_editor) {
canvas_item_editor=CanvasItemEditor::get_singleton();
}
- if (p_collision_polygon) {
-
- node=p_collision_polygon->cast_to<Path2D>();
- if (!canvas_item_editor->is_connected("draw",this,"_canvas_draw"))
- canvas_item_editor->connect("draw",this,"_canvas_draw");
+ if (p_path2d) {
+ node=p_path2d->cast_to<Path2D>();
+ if (!canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->connect("draw",this,"_canvas_draw");
+ if (!node->is_connected("visibility_changed", this, "_node_visibility_changed"))
+ node->connect("visibility_changed", this, "_node_visibility_changed");
} else {
- node=NULL;
- if (canvas_item_editor->is_connected("draw",this,"_canvas_draw"))
- canvas_item_editor->disconnect("draw",this,"_canvas_draw");
+ if (canvas_item_editor->get_viewport_control()->is_connected("draw",this,"_canvas_draw"))
+ canvas_item_editor->get_viewport_control()->disconnect("draw",this,"_canvas_draw");
+
+ // node may have been deleted at this point
+ if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed"))
+ node->disconnect("visibility_changed", this, "_node_visibility_changed");
+ node=NULL;
}
}
@@ -532,7 +553,7 @@ void Path2DEditor::_bind_methods() {
//ObjectTypeDB::bind_method(_MD("_menu_option"),&Path2DEditor::_menu_option);
ObjectTypeDB::bind_method(_MD("_canvas_draw"),&Path2DEditor::_canvas_draw);
-
+ ObjectTypeDB::bind_method(_MD("_node_visibility_changed"),&Path2DEditor::_node_visibility_changed);
}
Path2DEditor::Path2DEditor(EditorNode *p_editor) {
@@ -559,7 +580,7 @@ Path2DEditor::Path2DEditor(EditorNode *p_editor) {
void Path2DEditorPlugin::edit(Object *p_object) {
- collision_polygon_editor->edit(p_object->cast_to<Node>());
+ path2d_editor->edit(p_object->cast_to<Node>());
}
bool Path2DEditorPlugin::handles(Object *p_object) const {
@@ -570,11 +591,11 @@ bool Path2DEditorPlugin::handles(Object *p_object) const {
void Path2DEditorPlugin::make_visible(bool p_visible) {
if (p_visible) {
- collision_polygon_editor->show();
+ path2d_editor->show();
} else {
- collision_polygon_editor->hide();
- collision_polygon_editor->edit(NULL);
+ path2d_editor->hide();
+ path2d_editor->edit(NULL);
}
}
@@ -582,19 +603,10 @@ void Path2DEditorPlugin::make_visible(bool p_visible) {
Path2DEditorPlugin::Path2DEditorPlugin(EditorNode *p_node) {
editor=p_node;
- collision_polygon_editor = memnew( Path2DEditor(p_node) );
- editor->get_viewport()->add_child(collision_polygon_editor);
-
- collision_polygon_editor->set_margin(MARGIN_LEFT,200);
- collision_polygon_editor->set_margin(MARGIN_RIGHT,230);
- collision_polygon_editor->set_margin(MARGIN_TOP,0);
- collision_polygon_editor->set_margin(MARGIN_BOTTOM,10);
-
-
- collision_polygon_editor->hide();
-
-
+ path2d_editor = memnew( Path2DEditor(p_node) );
+ CanvasItemEditor::get_singleton()->add_control_to_menu_panel(path2d_editor);
+ path2d_editor->hide();
}
diff --git a/tools/editor/plugins/path_2d_editor_plugin.h b/tools/editor/plugins/path_2d_editor_plugin.h
index 3f917f29d9..1ddda3f65f 100644
--- a/tools/editor/plugins/path_2d_editor_plugin.h
+++ b/tools/editor/plugins/path_2d_editor_plugin.h
@@ -40,9 +40,9 @@
*/
class CanvasItemEditor;
-class Path2DEditor : public ButtonGroup {
+class Path2DEditor : public HBoxContainer {
- OBJ_TYPE(Path2DEditor, ButtonGroup );
+ OBJ_TYPE(Path2DEditor, HBoxContainer);
UndoRedo *undo_redo;
@@ -67,6 +67,7 @@ class Path2DEditor : public ButtonGroup {
void _canvas_draw();
+ void _node_visibility_changed();
protected:
void _notification(int p_what);
@@ -76,7 +77,7 @@ public:
Vector2 snap_point(const Vector2& p_point) const;
bool forward_input_event(const InputEvent& p_event);
- void edit(Node *p_collision_polygon);
+ void edit(Node *p_path2d);
Path2DEditor(EditorNode *p_editor);
};
@@ -84,12 +85,12 @@ class Path2DEditorPlugin : public EditorPlugin {
OBJ_TYPE( Path2DEditorPlugin, EditorPlugin );
- Path2DEditor *collision_polygon_editor;
+ Path2DEditor *path2d_editor;
EditorNode *editor;
public:
- virtual bool forward_input_event(const InputEvent& p_event) { return collision_polygon_editor->forward_input_event(p_event); }
+ virtual bool forward_input_event(const InputEvent& p_event) { return path2d_editor->forward_input_event(p_event); }
virtual String get_name() const { return "Path2D"; }
bool has_main_screen() const { return false; }
diff --git a/tools/editor/plugins/path_editor_plugin.cpp b/tools/editor/plugins/path_editor_plugin.cpp
index 1c910e5436..61b1df9ca8 100644
--- a/tools/editor/plugins/path_editor_plugin.cpp
+++ b/tools/editor/plugins/path_editor_plugin.cpp
@@ -1,31 +1,31 @@
-/*************************************************************************/
-/* path_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
-/* */
-/* 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. */
-/*************************************************************************/
+/*************************************************************************/
+/* path_editor_plugin.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
+/* */
+/* 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. */
+/*************************************************************************/
#include "path_editor_plugin.h"
#include "spatial_editor_plugin.h"
#include "scene/resources/curve.h"
@@ -565,9 +565,8 @@ PathEditorPlugin::PathEditorPlugin(EditorNode *p_node) {
curve_del->set_tooltip("Delete Point.");
SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_del);
curve_close = memnew( ToolButton );
-//curve_close->set_icon(SpatialEditor::get_singleton()->get_icon("CurveDelete","EditorIcons"));
- curve_close->set_text("close");
- curve_close->hide();
+ curve_close->set_icon(SpatialEditor::get_singleton()->get_icon("CurveClose","EditorIcons"));
+ curve_close->hide();
curve_close->set_focus_mode(Control::FOCUS_NONE);
curve_close->set_tooltip("Close Curve");
SpatialEditor::get_singleton()->add_control_to_menu_panel(curve_close);
diff --git a/tools/editor/plugins/spatial_editor_plugin.cpp b/tools/editor/plugins/spatial_editor_plugin.cpp
index 0014c5a68a..8161025731 100644
--- a/tools/editor/plugins/spatial_editor_plugin.cpp
+++ b/tools/editor/plugins/spatial_editor_plugin.cpp
@@ -526,6 +526,14 @@ static int _get_key_modifier(const String& p_property) {
return 0;
}
+SpatialEditorViewport::NavigationScheme SpatialEditorViewport::_get_navigation_schema(const String& p_property) {
+ switch(EditorSettings::get_singleton()->get(p_property).operator int()) {
+ case 0: return NAVIGATION_GODOT;
+ case 1: return NAVIGATION_MAYA;
+ case 2: return NAVIGATION_MODO;
+ }
+ return NAVIGATION_GODOT;
+}
bool SpatialEditorViewport::_gizmo_select(const Vector2& p_screenpos,bool p_hilite_only) {
@@ -836,6 +844,11 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
if (b.pressed) {
+ NavigationScheme nav_scheme = _get_navigation_schema("3d_editor/navigation_scheme");
+ if ( (nav_scheme==NAVIGATION_MAYA || nav_scheme==NAVIGATION_MODO) && b.mod.alt) {
+ break;
+ }
+
_edit.mouse_pos=Point2(b.x,b.y);
_edit.snap=false;
_edit.mode=TRANSFORM_NONE;
@@ -1005,6 +1018,8 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
}
+ NavigationScheme nav_scheme = _get_navigation_schema("3d_editor/navigation_scheme");
+ NavigationMode nav_mode = NAVIGATION_NONE;
if (_edit.gizmo.is_valid()) {
@@ -1025,304 +1040,347 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
} else if (m.button_mask&1) {
- if (clicked) {
-
- if (!clicked_includes_current) {
+ if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) {
+ nav_mode = NAVIGATION_ORBIT;
+ } else if (nav_scheme == NAVIGATION_MODO && m.mod.alt && m.mod.shift) {
+ nav_mode = NAVIGATION_PAN;
+ } else if (nav_scheme == NAVIGATION_MODO && m.mod.alt && m.mod.control) {
+ nav_mode = NAVIGATION_ZOOM;
+ } else if (nav_scheme == NAVIGATION_MODO && m.mod.alt) {
+ nav_mode = NAVIGATION_ORBIT;
+ } else {
+ if (clicked) {
- _select_clicked(clicked_wants_append,true);
- //clickd processing was deferred
- }
+ if (!clicked_includes_current) {
+ _select_clicked(clicked_wants_append,true);
+ //clickd processing was deferred
+ }
- _compute_edit(_edit.mouse_pos);
- clicked=0;
- _edit.mode=TRANSFORM_TRANSLATE;
+ _compute_edit(_edit.mouse_pos);
+ clicked=0;
- }
+ _edit.mode=TRANSFORM_TRANSLATE;
- if (cursor.region_select) {
+ }
- cursor.region_end=Point2(m.x,m.y);
- surface->update();
- return;
- }
+ if (cursor.region_select && nav_mode == NAVIGATION_NONE) {
- if (_edit.mode==TRANSFORM_NONE)
- break;
+ cursor.region_end=Point2(m.x,m.y);
+ surface->update();
+ return;
+ }
- Vector3 ray_pos=_get_ray_pos( Vector2( m.x, m.y ) );
- Vector3 ray=_get_ray( Vector2( m.x, m.y ) );
+ if (_edit.mode==TRANSFORM_NONE && nav_mode == NAVIGATION_NONE)
+ break;
- switch(_edit.mode) {
+ Vector3 ray_pos=_get_ray_pos( Vector2( m.x, m.y ) );
+ Vector3 ray=_get_ray( Vector2( m.x, m.y ) );
- case TRANSFORM_SCALE: {
+ switch(_edit.mode) {
- Plane plane=Plane(_edit.center,_get_camera_normal());
+ case TRANSFORM_SCALE: {
- Vector3 intersection;
- if (!plane.intersects_ray(ray_pos,ray,&intersection))
- break;
+ Plane plane=Plane(_edit.center,_get_camera_normal());
- Vector3 click;
- if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
- break;
- float center_click_dist = click.distance_to(_edit.center);
- float center_inters_dist = intersection.distance_to(_edit.center);
- if (center_click_dist==0)
- break;
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos,ray,&intersection))
+ break;
- float scale = (center_inters_dist / center_click_dist)*100.0;
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
+ break;
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ float center_click_dist = click.distance_to(_edit.center);
+ float center_inters_dist = intersection.distance_to(_edit.center);
+ if (center_click_dist==0)
+ break;
- scale = Math::stepify(scale,spatial_editor->get_scale_snap());
- }
+ float scale = (center_inters_dist / center_click_dist)*100.0;
- set_message("Scaling to "+String::num(scale,1)+"%.");
- scale/=100.0;
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
- Transform r;
- r.basis.scale(Vector3(scale,scale,scale));
+ scale = Math::stepify(scale,spatial_editor->get_scale_snap());
+ }
+ set_message("Scaling to "+String::num(scale,1)+"%.");
+ scale/=100.0;
- List<Node*> &selection = editor_selection->get_selected_node_list();
+ Transform r;
+ r.basis.scale(Vector3(scale,scale,scale));
- for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
- Spatial *sp = E->get()->cast_to<Spatial>();
- if (!sp)
- continue;
+ List<Node*> &selection = editor_selection->get_selected_node_list();
- SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
- Transform original=se->original;
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
- Transform base=Transform( Matrix3(), _edit.center);
- Transform t=base * (r * (base.inverse() * original));
- sp->set_global_transform(t);
- }
+ Transform original=se->original;
- surface->update();
+ Transform base=Transform( Matrix3(), _edit.center);
+ Transform t=base * (r * (base.inverse() * original));
- } break;
+ sp->set_global_transform(t);
+ }
- case TRANSFORM_TRANSLATE: {
+ surface->update();
+ } break;
+
+ case TRANSFORM_TRANSLATE: {
+
+
+ Vector3 motion_mask;
+ Plane plane;
+
+ switch( _edit.plane ) {
+ case TRANSFORM_VIEW:
+ motion_mask=Vector3(0,0,0);
+ plane=Plane(_edit.center,_get_camera_normal());
+ break;
+ case TRANSFORM_X_AXIS:
+ motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(0);
+ plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_Y_AXIS:
+ motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(1);
+ plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ case TRANSFORM_Z_AXIS:
+ motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(2);
+ plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
+ break;
+ }
- Vector3 motion_mask;
- Plane plane;
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos,ray,&intersection))
+ break;
- switch( _edit.plane ) {
- case TRANSFORM_VIEW:
- motion_mask=Vector3(0,0,0);
- plane=Plane(_edit.center,_get_camera_normal());
- break;
- case TRANSFORM_X_AXIS:
- motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(0);
- plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
- break;
- case TRANSFORM_Y_AXIS:
- motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(1);
- plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
- break;
- case TRANSFORM_Z_AXIS:
- motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(2);
- plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
- break;
- }
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
+ break;
- Vector3 intersection;
- if (!plane.intersects_ray(ray_pos,ray,&intersection))
- break;
+ //_validate_selection();
+ Vector3 motion = intersection-click;
+ if (motion_mask!=Vector3()) {
+ motion=motion_mask.dot(motion)*motion_mask;
+ }
- Vector3 click;
- if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
- break;
+ float snap=0;
- //_validate_selection();
- Vector3 motion = intersection-click;
- if (motion_mask!=Vector3()) {
- motion=motion_mask.dot(motion)*motion_mask;
- }
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
- float snap=0;
+ snap = spatial_editor->get_translate_snap();
+ motion.snap(snap);
+ }
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ //set_message("Translating: "+motion);
- snap = spatial_editor->get_translate_snap();
- motion.snap(snap);
- }
+ List<Node*> &selection = editor_selection->get_selected_node_list();
- //set_message("Translating: "+motion);
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
- List<Node*> &selection = editor_selection->get_selected_node_list();
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp) {
+ continue;
+ }
- for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se) {
+ continue;
+ }
- Spatial *sp = E->get()->cast_to<Spatial>();
- if (!sp) {
- continue;
+ Transform t=se->original;
+ t.origin+=motion;
+ sp->set_global_transform(t);
}
-
- SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se) {
- continue;
+ } break;
+
+ case TRANSFORM_ROTATE: {
+
+
+ Plane plane;
+
+ switch( _edit.plane ) {
+ case TRANSFORM_VIEW:
+ plane=Plane(_edit.center,_get_camera_normal());
+ break;
+ case TRANSFORM_X_AXIS:
+ plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(0));
+ break;
+ case TRANSFORM_Y_AXIS:
+ plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(1));
+ break;
+ case TRANSFORM_Z_AXIS:
+ plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(2));
+ break;
}
- Transform t=se->original;
- t.origin+=motion;
- sp->set_global_transform(t);
- }
- } break;
-
- case TRANSFORM_ROTATE: {
-
-
- Plane plane;
-
- switch( _edit.plane ) {
- case TRANSFORM_VIEW:
- plane=Plane(_edit.center,_get_camera_normal());
- break;
- case TRANSFORM_X_AXIS:
- plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(0));
- break;
- case TRANSFORM_Y_AXIS:
- plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(1));
- break;
- case TRANSFORM_Z_AXIS:
- plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(2));
- break;
- }
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos,ray,&intersection))
+ break;
- Vector3 intersection;
- if (!plane.intersects_ray(ray_pos,ray,&intersection))
- break;
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
+ break;
- Vector3 click;
- if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
- break;
+ Vector3 y_axis=(click-_edit.center).normalized();
+ Vector3 x_axis=plane.normal.cross(y_axis).normalized();
- Vector3 y_axis=(click-_edit.center).normalized();
- Vector3 x_axis=plane.normal.cross(y_axis).normalized();
+ float angle=Math::atan2( x_axis.dot(intersection-_edit.center), y_axis.dot(intersection-_edit.center) );
+ if (_edit.snap || spatial_editor->is_snap_enabled()) {
- float angle=Math::atan2( x_axis.dot(intersection-_edit.center), y_axis.dot(intersection-_edit.center) );
- if (_edit.snap || spatial_editor->is_snap_enabled()) {
+ float snap = spatial_editor->get_rotate_snap();
- float snap = spatial_editor->get_rotate_snap();
+ if (snap) {
+ angle=Math::rad2deg(angle)+snap*0.5; //else it wont reach +180
+ angle-=Math::fmod(angle,snap);
+ set_message("Rotating "+rtos(angle)+" degrees.");
+ angle=Math::deg2rad(angle);
+ } else
+ set_message("Rotating "+rtos(Math::rad2deg(angle))+" degrees.");
- if (snap) {
- angle=Math::rad2deg(angle)+snap*0.5; //else it wont reach +180
- angle-=Math::fmod(angle,snap);
- set_message("Rotating "+rtos(angle)+" degrees.");
- angle=Math::deg2rad(angle);
- } else
+ } else {
set_message("Rotating "+rtos(Math::rad2deg(angle))+" degrees.");
+ }
- } else {
- set_message("Rotating "+rtos(Math::rad2deg(angle))+" degrees.");
- }
+ Transform r;
+ r.basis.rotate(plane.normal,-angle);
- Transform r;
- r.basis.rotate(plane.normal,-angle);
+ List<Node*> &selection = editor_selection->get_selected_node_list();
- List<Node*> &selection = editor_selection->get_selected_node_list();
+ for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
- for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
+ Spatial *sp = E->get()->cast_to<Spatial>();
+ if (!sp)
+ continue;
- Spatial *sp = E->get()->cast_to<Spatial>();
- if (!sp)
- continue;
+ SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
+ if (!se)
+ continue;
- SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
- if (!se)
- continue;
+ Transform original=se->original;
- Transform original=se->original;
+ Transform base=Transform( Matrix3(), _edit.center);
+ Transform t=base * (r * (base.inverse() * original));
- Transform base=Transform( Matrix3(), _edit.center);
- Transform t=base * (r * (base.inverse() * original));
+ sp->set_global_transform(t);
+ }
- sp->set_global_transform(t);
- }
+ surface->update();
+ /*
+ VisualServer::get_singleton()->poly_clear(indicators);
+
+ Vector<Vector3> points;
+ Vector<Vector3> empty;
+ Vector<Color> colors;
+ points.push_back(intersection);
+ points.push_back(_edit.original.origin);
+ colors.push_back( Color(255,155,100) );
+ colors.push_back( Color(255,155,100) );
+ VisualServer::get_singleton()->poly_add_primitive(indicators,points,empty,colors,empty);
+ */
+ } break;
+ default:{}
+ }
- surface->update();
- /*
- VisualServer::get_singleton()->poly_clear(indicators);
-
- Vector<Vector3> points;
- Vector<Vector3> empty;
- Vector<Color> colors;
- points.push_back(intersection);
- points.push_back(_edit.original.origin);
- colors.push_back( Color(255,155,100) );
- colors.push_back( Color(255,155,100) );
- VisualServer::get_singleton()->poly_add_primitive(indicators,points,empty,colors,empty);
- */
- } break;
- default:{}
}
- } else if (m.button_mask&4) {
-
+ } else if (m.button_mask&2) {
- int mod = 0;
- if (m.mod.shift)
- mod=KEY_SHIFT;
- if (m.mod.alt)
- mod=KEY_ALT;
- if (m.mod.control)
- mod=KEY_CONTROL;
- if (m.mod.meta)
- mod=KEY_META;
+ if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) {
+ nav_mode = NAVIGATION_ZOOM;
+ }
+ } else if (m.button_mask&4) {
+ if (nav_scheme == NAVIGATION_GODOT) {
+
+ int mod = 0;
+ if (m.mod.shift)
+ mod=KEY_SHIFT;
+ if (m.mod.alt)
+ mod=KEY_ALT;
+ if (m.mod.control)
+ mod=KEY_CONTROL;
+ if (m.mod.meta)
+ mod=KEY_META;
+
+ if (mod == _get_key_modifier("3d_editor/pan_modifier"))
+ nav_mode = NAVIGATION_PAN;
+ else if (mod == _get_key_modifier("3d_editor/zoom_modifier"))
+ nav_mode = NAVIGATION_ZOOM;
+ else if (mod == _get_key_modifier("3d_editor/orbit_modifier"))
+ nav_mode = NAVIGATION_ORBIT;
+
+ } else if (nav_scheme == NAVIGATION_MAYA) {
+ if (m.mod.alt)
+ nav_mode = NAVIGATION_PAN;
+ }
+ }
- if (mod == _get_key_modifier("3d_editor/pan_modifier")) {
+ switch(nav_mode) {
+ case NAVIGATION_PAN:{
+ real_t pan_speed = 1/150.0;
+ int pan_speed_modifier = 10;
+ if (nav_scheme==NAVIGATION_MAYA && m.mod.shift)
+ pan_speed *= pan_speed_modifier;
Transform camera_transform;
camera_transform.translate(cursor.pos);
camera_transform.basis.rotate(Vector3(0,1,0),cursor.y_rot);
camera_transform.basis.rotate(Vector3(1,0,0),cursor.x_rot);
- Vector3 translation(-m.relative_x/150.0,m.relative_y/150.0,0);
+ Vector3 translation(-m.relative_x*pan_speed,m.relative_y*pan_speed,0);
translation*=cursor.distance/DISTANCE_DEFAULT;
camera_transform.translate(translation);
cursor.pos=camera_transform.origin;
- } else if (mod == _get_key_modifier("3d_editor/zoom_modifier")) {
+ } break;
+
+ case NAVIGATION_ZOOM: {
+ real_t zoom_speed = 1/80.0;
+ int zoom_speed_modifier = 10;
+ if (nav_scheme==NAVIGATION_MAYA && m.mod.shift)
+ zoom_speed *= zoom_speed_modifier;
if ( m.relative_y > 0)
- cursor.distance*=1+m.relative_y/80.0;
+ cursor.distance*=1+m.relative_y*zoom_speed;
else if (m.relative_y < 0)
- cursor.distance/=1-m.relative_y/80.0;
+ cursor.distance/=1-m.relative_y*zoom_speed;
- } else if (mod == _get_key_modifier("3d_editor/orbit_modifier")) {
+ } break;
+
+ case NAVIGATION_ORBIT: {
cursor.x_rot+=m.relative_y/80.0;
cursor.y_rot+=m.relative_x/80.0;
if (cursor.x_rot>Math_PI/2.0)
cursor.x_rot=Math_PI/2.0;
if (cursor.x_rot<-Math_PI/2.0)
cursor.x_rot=-Math_PI/2.0;
+ } break;
- }
+ default: {}
}
-
} break;
case InputEvent::KEY: {
@@ -1410,6 +1468,12 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
case KEY_F: {
_menu_option(VIEW_CENTER_TO_SELECTION);
} break;
+
+ case KEY_SPACE: {
+ if (!k.pressed)
+ emit_signal("toggle_maximize_view", this);
+ } break;
+
}
@@ -1816,6 +1880,7 @@ void SpatialEditorViewport::_bind_methods(){
ObjectTypeDB::bind_method(_MD("_toggle_camera_preview"),&SpatialEditorViewport::_toggle_camera_preview);
ObjectTypeDB::bind_method(_MD("_preview_exited_scene"),&SpatialEditorViewport::_preview_exited_scene);
+ ADD_SIGNAL( MethodInfo("toggle_maximize_view", PropertyInfo(Variant::OBJECT, "viewport")) );
}
@@ -2916,6 +2981,48 @@ void SpatialEditor::_request_gizmo(Object* p_obj) {
}
+void SpatialEditor::_toggle_maximize_view(Object* p_viewport) {
+ if (!p_viewport) return;
+ SpatialEditorViewport *current_viewport = p_viewport->cast_to<SpatialEditorViewport>();
+ if (!current_viewport) return;
+
+ int index=-1;
+ bool maximized = false;
+ for(int i=0;i<4;i++) {
+ if (viewports[i]==current_viewport) {
+ index=i;
+ if ( current_viewport->get_global_rect() == viewport_base->get_global_rect() )
+ maximized=true;
+ break;
+ }
+ }
+ if (index==-1) return;
+
+ if (!maximized) {
+
+ for(int i=0;i<4;i++) {
+ if (i==index)
+ viewports[i]->set_area_as_parent_rect();
+ else
+ viewports[i]->hide();
+ }
+ } else {
+
+ for(int i=0;i<4;i++)
+ viewports[i]->show();
+
+ if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT) ))
+ _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS) ))
+ _menu_item_pressed(MENU_VIEW_USE_2_VIEWPORTS);
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS) ))
+ _menu_item_pressed(MENU_VIEW_USE_3_VIEWPORTS);
+ else if (view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS) ))
+ _menu_item_pressed(MENU_VIEW_USE_4_VIEWPORTS);
+ }
+
+}
+
void SpatialEditor::_bind_methods() {
// ObjectTypeDB::bind_method("_input_event",&SpatialEditor::_input_event);
@@ -2928,8 +3035,11 @@ void SpatialEditor::_bind_methods() {
ObjectTypeDB::bind_method("_get_editor_data",&SpatialEditor::_get_editor_data);
ObjectTypeDB::bind_method("_request_gizmo",&SpatialEditor::_request_gizmo);
+ ObjectTypeDB::bind_method("_toggle_maximize_view",&SpatialEditor::_toggle_maximize_view);
+
ADD_SIGNAL( MethodInfo("transform_key_request") );
+
}
SpatialEditor::SpatialEditor(EditorNode *p_editor) {
@@ -3029,10 +3139,10 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
p->add_check_item("Use Default Light",MENU_VIEW_USE_DEFAULT_LIGHT);
p->add_separator();
- p->add_check_item("1 Viewport",MENU_VIEW_USE_1_VIEWPORT);
- p->add_check_item("2 Viewports",MENU_VIEW_USE_2_VIEWPORTS);
- p->add_check_item("3 Viewports",MENU_VIEW_USE_3_VIEWPORTS);
- p->add_check_item("4 Viewports",MENU_VIEW_USE_4_VIEWPORTS);
+ p->add_check_item("1 Viewport",MENU_VIEW_USE_1_VIEWPORT,KEY_MASK_ALT+KEY_1);
+ p->add_check_item("2 Viewports",MENU_VIEW_USE_2_VIEWPORTS,KEY_MASK_ALT+KEY_2);
+ p->add_check_item("3 Viewports",MENU_VIEW_USE_3_VIEWPORTS,KEY_MASK_ALT+KEY_3);
+ p->add_check_item("4 Viewports",MENU_VIEW_USE_4_VIEWPORTS,KEY_MASK_ALT+KEY_4);
p->add_separator();
p->add_check_item("Display Normal",MENU_VIEW_DISPLAY_NORMAL);
@@ -3069,6 +3179,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
for(int i=0;i<4;i++) {
viewports[i] = memnew( SpatialEditorViewport(this,editor) );
+ viewports[i]->connect("toggle_maximize_view",this,"_toggle_maximize_view");
viewport_base->add_child(viewports[i]);
}
//vbc->add_child(viewport_base);
diff --git a/tools/editor/plugins/spatial_editor_plugin.h b/tools/editor/plugins/spatial_editor_plugin.h
index 308590ecea..aac2d62002 100644
--- a/tools/editor/plugins/spatial_editor_plugin.h
+++ b/tools/editor/plugins/spatial_editor_plugin.h
@@ -110,7 +110,6 @@ class SpatialEditorViewport : public Control {
void _update_selection();
bool _gizmo_select(const Vector2& p_screenpos,bool p_hilite_only=false);
-
float get_znear() const;
float get_zfar() const;
float get_fov() const;
@@ -119,6 +118,19 @@ class SpatialEditorViewport : public Control {
bool clicked_includes_current;
bool clicked_wants_append;
+ enum NavigationScheme {
+ NAVIGATION_GODOT,
+ NAVIGATION_MAYA,
+ NAVIGATION_MODO,
+ };
+ NavigationScheme _get_navigation_schema(const String& p_property);
+
+ enum NavigationMode {
+ NAVIGATION_NONE,
+ NAVIGATION_PAN,
+ NAVIGATION_ZOOM,
+ NAVIGATION_ORBIT
+ };
enum TransformMode {
TRANSFORM_NONE,
TRANSFORM_ROTATE,
@@ -364,6 +376,8 @@ private:
void _init_indicators();
void _finish_indicators();
+ void _toggle_maximize_view(Object* p_viewport);
+
Node *custom_camera;
Object *_get_editor_data(Object *p_what);