diff options
author | marynate <mary.w.nate@gmail.com> | 2014-03-31 11:59:42 +0800 |
---|---|---|
committer | marynate <mary.w.nate@gmail.com> | 2014-04-01 00:49:48 +0800 |
commit | eb294bb6eadc3dcb4e7c91459d5261ce10885c5d (patch) | |
tree | 3e2a0874207c2706a1dbcac646c2e772567db660 /tools | |
parent | 5ed527d8b886498f2270c23a92ccd2e0cfc74cf0 (diff) |
Disable transform operation when navigation
Diffstat (limited to 'tools')
-rw-r--r-- | tools/editor/plugins/spatial_editor_plugin.cpp | 361 |
1 files changed, 181 insertions, 180 deletions
diff --git a/tools/editor/plugins/spatial_editor_plugin.cpp b/tools/editor/plugins/spatial_editor_plugin.cpp index 992ca0e36e..600d4f5103 100644 --- a/tools/editor/plugins/spatial_editor_plugin.cpp +++ b/tools/editor/plugins/spatial_editor_plugin.cpp @@ -1037,259 +1037,260 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) { nav_mode = NAVIGATION_ORBIT; - } - - if (clicked) { + } 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; - if (cursor.region_select && nav_mode == NAVIGATION_NONE) { + _edit.mode=TRANSFORM_TRANSLATE; - cursor.region_end=Point2(m.x,m.y); - surface->update(); - return; - } + } - if (_edit.mode==TRANSFORM_NONE && nav_mode == NAVIGATION_NONE) - break; + if (cursor.region_select && nav_mode == NAVIGATION_NONE) { + 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; + 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(); - Vector3 y_axis=(click-_edit.center).normalized(); - Vector3 x_axis=plane.normal.cross(y_axis).normalized(); + 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."); - 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(); - - 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&2) { |