diff options
| author | reduz | 2014-04-05 09:28:13 -0300 |
|---|---|---|
| committer | reduz | 2014-04-05 09:28:13 -0300 |
| commit | d7b93c3776ddd29892b26da6f40ef78349859736 (patch) | |
| tree | aecde637dc7cde4698259f7600885805e6d66c01 /tools/editor/plugins/spatial_editor_plugin.cpp | |
| parent | 368a14b5008c38c589aad7d15e4567426394f308 (diff) | |
| parent | 145d069da0e394c4b685a16fe0392fdcf931df4e (diff) | |
| download | godot-d7b93c3776ddd29892b26da6f40ef78349859736.tar.gz godot-d7b93c3776ddd29892b26da6f40ef78349859736.tar.zst godot-d7b93c3776ddd29892b26da6f40ef78349859736.zip | |
Merge pull request #237 from marynate/PR-maya-nav
Maya and modo style navigation
Diffstat (limited to 'tools/editor/plugins/spatial_editor_plugin.cpp')
| -rw-r--r-- | tools/editor/plugins/spatial_editor_plugin.cpp | 434 |
1 files changed, 246 insertions, 188 deletions
diff --git a/tools/editor/plugins/spatial_editor_plugin.cpp b/tools/editor/plugins/spatial_editor_plugin.cpp index 3af6aded6..816102573 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) { + if (!clicked_includes_current) { - _select_clicked(clicked_wants_append,true); - //clickd processing was deferred - } + _select_clicked(clicked_wants_append,true); + //clickd processing was deferred + } - _compute_edit(_edit.mouse_pos); - clicked=0; + _compute_edit(_edit.mouse_pos); + clicked=0; - _edit.mode=TRANSFORM_TRANSLATE; + _edit.mode=TRANSFORM_TRANSLATE; - } + } - if (cursor.region_select) { + if (cursor.region_select && nav_mode == NAVIGATION_NONE) { - cursor.region_end=Point2(m.x,m.y); - surface->update(); - return; - } + cursor.region_end=Point2(m.x,m.y); + surface->update(); + return; + } - if (_edit.mode==TRANSFORM_NONE) - break; + if (_edit.mode==TRANSFORM_NONE && nav_mode == NAVIGATION_NONE) + break; - Vector3 ray_pos=_get_ray_pos( Vector2( m.x, m.y ) ); - Vector3 ray=_get_ray( Vector2( m.x, m.y ) ); + Vector3 ray_pos=_get_ray_pos( Vector2( m.x, m.y ) ); + Vector3 ray=_get_ray( Vector2( m.x, m.y ) ); - switch(_edit.mode) { - case TRANSFORM_SCALE: { + switch(_edit.mode) { + case TRANSFORM_SCALE: { - Plane plane=Plane(_edit.center,_get_camera_normal()); + Plane plane=Plane(_edit.center,_get_camera_normal()); - 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 intersection; + if (!plane.intersects_ray(ray_pos,ray,&intersection)) + 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 click; + if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click)) + break; - float scale = (center_inters_dist / center_click_dist)*100.0; + float center_click_dist = click.distance_to(_edit.center); + float center_inters_dist = intersection.distance_to(_edit.center); + if (center_click_dist==0) + break; - if (_edit.snap || spatial_editor->is_snap_enabled()) { + float scale = (center_inters_dist / center_click_dist)*100.0; - scale = Math::stepify(scale,spatial_editor->get_scale_snap()); - } + if (_edit.snap || spatial_editor->is_snap_enabled()) { - set_message("Scaling to "+String::num(scale,1)+"%."); - scale/=100.0; + scale = Math::stepify(scale,spatial_editor->get_scale_snap()); + } - Transform r; - r.basis.scale(Vector3(scale,scale,scale)); + set_message("Scaling to "+String::num(scale,1)+"%."); + scale/=100.0; + Transform r; + r.basis.scale(Vector3(scale,scale,scale)); - List<Node*> &selection = editor_selection->get_selected_node_list(); - 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; + SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp); + if (!se) + continue; - Transform original=se->original; - Transform base=Transform( Matrix3(), _edit.center); - Transform t=base * (r * (base.inverse() * original)); + Transform original=se->original; - sp->set_global_transform(t); - } + Transform base=Transform( Matrix3(), _edit.center); + Transform t=base * (r * (base.inverse() * original)); - surface->update(); + sp->set_global_transform(t); + } - } break; + surface->update(); - case TRANSFORM_TRANSLATE: { + } 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; + } + + SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp); + if (!se) { + continue; + } + + Transform t=se->original; + t.origin+=motion; + sp->set_global_transform(t); } + } break; - Transform t=se->original; - t.origin+=motion; - sp->set_global_transform(t); - } - } break; + case TRANSFORM_ROTATE: { - case TRANSFORM_ROTATE: { + Plane plane; - 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; + } - 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); - 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&2) { - 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:{} + 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; + 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: { |
