summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/editor/editor_settings.cpp2
-rw-r--r--tools/editor/plugins/spatial_editor_plugin.cpp450
-rw-r--r--tools/editor/plugins/spatial_editor_plugin.h14
3 files changed, 269 insertions, 197 deletions
diff --git a/tools/editor/editor_settings.cpp b/tools/editor/editor_settings.cpp
index 09d55650c8..6f4db7412b 100644
--- a/tools/editor/editor_settings.cpp
+++ b/tools/editor/editor_settings.cpp
@@ -403,6 +403,8 @@ void EditorSettings::_load_defaults() {
set("3d_editor/default_z_near",0.1);
set("3d_editor/default_z_far",500.0);
+ set("3d_editor/navigation_scheme",0);
+ hints["3d_editor/navigation_scheme"]=PropertyInfo(Variant::INT,"3d_editor/navigation_scheme",PROPERTY_HINT_ENUM,"Godot,Maya,Modo");
set("3d_editor/orbit_modifier",0);
hints["3d_editor/orbit_modifier"]=PropertyInfo(Variant::INT,"3d_editor/orbit_modifier",PROPERTY_HINT_ENUM,"None,Shift,Alt,Meta,Ctrl");
set("3d_editor/pan_modifier",1);
diff --git a/tools/editor/plugins/spatial_editor_plugin.cpp b/tools/editor/plugins/spatial_editor_plugin.cpp
index 3af6aded6b..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 (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) {
- if (!clicked_includes_current) {
-
- _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;
+ Vector3 intersection;
+ if (!plane.intersects_ray(ray_pos,ray,&intersection))
+ break;
- case TRANSFORM_ROTATE: {
+ Vector3 click;
+ if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
+ break;
- Plane plane;
+ Vector3 y_axis=(click-_edit.center).normalized();
+ Vector3 x_axis=plane.normal.cross(y_axis).normalized();
- 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 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();
+ 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;
+
+ } break;
- } else if (mod == _get_key_modifier("3d_editor/orbit_modifier")) {
+ 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: {
diff --git a/tools/editor/plugins/spatial_editor_plugin.h b/tools/editor/plugins/spatial_editor_plugin.h
index 3f64e51cdb..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,