diff options
author | reduz <reduzio@gmail.com> | 2014-04-05 09:28:13 -0300 |
---|---|---|
committer | reduz <reduzio@gmail.com> | 2014-04-05 09:28:13 -0300 |
commit | d7b93c3776ddd29892b26da6f40ef78349859736 (patch) | |
tree | aecde637dc7cde4698259f7600885805e6d66c01 /tools/editor/plugins | |
parent | 368a14b5008c38c589aad7d15e4567426394f308 (diff) | |
parent | 145d069da0e394c4b685a16fe0392fdcf931df4e (diff) |
Merge pull request #237 from marynate/PR-maya-nav
Maya and modo style navigation
Diffstat (limited to 'tools/editor/plugins')
-rw-r--r-- | tools/editor/plugins/spatial_editor_plugin.cpp | 450 | ||||
-rw-r--r-- | tools/editor/plugins/spatial_editor_plugin.h | 14 |
2 files changed, 267 insertions, 197 deletions
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, |