Disable transform operation when navigation

This commit is contained in:
marynate 2014-03-31 11:59:42 +08:00
parent 5ed527d8b8
commit eb294bb6ea
1 changed files with 203 additions and 202 deletions

View File

@ -1037,259 +1037,260 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) { if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) {
nav_mode = NAVIGATION_ORBIT; nav_mode = NAVIGATION_ORBIT;
} } else {
if (clicked) {
if (clicked) { if (!clicked_includes_current) {
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;
_select_clicked(clicked_wants_append,true);
//clickd processing was deferred
} }
if (cursor.region_select && nav_mode == NAVIGATION_NONE) {
_compute_edit(_edit.mouse_pos); cursor.region_end=Point2(m.x,m.y);
clicked=0;
_edit.mode=TRANSFORM_TRANSLATE;
}
if (cursor.region_select && nav_mode == NAVIGATION_NONE) {
cursor.region_end=Point2(m.x,m.y);
surface->update();
return;
}
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 ) );
switch(_edit.mode) {
case TRANSFORM_SCALE: {
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;
float center_click_dist = click.distance_to(_edit.center);
float center_inters_dist = intersection.distance_to(_edit.center);
if (center_click_dist==0)
break;
float scale = (center_inters_dist / center_click_dist)*100.0;
if (_edit.snap || spatial_editor->is_snap_enabled()) {
scale = Math::stepify(scale,spatial_editor->get_scale_snap());
}
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()) {
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));
sp->set_global_transform(t);
}
surface->update(); surface->update();
return;
}
} break; if (_edit.mode==TRANSFORM_NONE && nav_mode == NAVIGATION_NONE)
break;
case TRANSFORM_TRANSLATE: {
Vector3 motion_mask; Vector3 ray_pos=_get_ray_pos( Vector2( m.x, m.y ) );
Plane plane; Vector3 ray=_get_ray( Vector2( m.x, m.y ) );
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 intersection; switch(_edit.mode) {
if (!plane.intersects_ray(ray_pos,ray,&intersection))
break;
Vector3 click; case TRANSFORM_SCALE: {
if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
break;
//_validate_selection();
Vector3 motion = intersection-click;
if (motion_mask!=Vector3()) {
motion=motion_mask.dot(motion)*motion_mask;
}
float snap=0; Plane plane=Plane(_edit.center,_get_camera_normal());
if (_edit.snap || spatial_editor->is_snap_enabled()) {
snap = spatial_editor->get_translate_snap(); Vector3 intersection;
motion.snap(snap); if (!plane.intersects_ray(ray_pos,ray,&intersection))
} break;
//set_message("Translating: "+motion); Vector3 click;
if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
break;
List<Node*> &selection = editor_selection->get_selected_node_list(); float center_click_dist = click.distance_to(_edit.center);
float center_inters_dist = intersection.distance_to(_edit.center);
if (center_click_dist==0)
break;
for(List<Node*>::Element *E=selection.front();E;E=E->next()) { float scale = (center_inters_dist / center_click_dist)*100.0;
Spatial *sp = E->get()->cast_to<Spatial>(); if (_edit.snap || spatial_editor->is_snap_enabled()) {
if (!sp) {
continue; scale = Math::stepify(scale,spatial_editor->get_scale_snap());
} }
SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp); set_message("Scaling to "+String::num(scale,1)+"%.");
if (!se) { scale/=100.0;
continue;
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()) {
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));
sp->set_global_transform(t);
} }
Transform t=se->original; surface->update();
t.origin+=motion;
sp->set_global_transform(t);
}
} break;
case TRANSFORM_ROTATE: { } break;
case TRANSFORM_TRANSLATE: {
Plane plane; Vector3 motion_mask;
Plane plane;
switch( _edit.plane ) { switch( _edit.plane ) {
case TRANSFORM_VIEW: case TRANSFORM_VIEW:
plane=Plane(_edit.center,_get_camera_normal()); motion_mask=Vector3(0,0,0);
break; plane=Plane(_edit.center,_get_camera_normal());
case TRANSFORM_X_AXIS: break;
plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(0)); case TRANSFORM_X_AXIS:
break; motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(0);
case TRANSFORM_Y_AXIS: plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(1)); break;
break; case TRANSFORM_Y_AXIS:
case TRANSFORM_Z_AXIS: motion_mask=spatial_editor->get_gizmo_transform().basis.get_axis(1);
plane=Plane(_edit.center,spatial_editor->get_gizmo_transform().basis.get_axis(2)); plane=Plane(_edit.center,motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized());
break; 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 intersection; Vector3 intersection;
if (!plane.intersects_ray(ray_pos,ray,&intersection)) if (!plane.intersects_ray(ray_pos,ray,&intersection))
break; break;
Vector3 click; Vector3 click;
if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click)) if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
break; break;
//_validate_selection();
Vector3 motion = intersection-click;
if (motion_mask!=Vector3()) {
motion=motion_mask.dot(motion)*motion_mask;
}
float snap=0;
if (_edit.snap || spatial_editor->is_snap_enabled()) {
snap = spatial_editor->get_translate_snap();
motion.snap(snap);
}
//set_message("Translating: "+motion);
List<Node*> &selection = editor_selection->get_selected_node_list();
for(List<Node*>::Element *E=selection.front();E;E=E->next()) {
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;
case TRANSFORM_ROTATE: {
Vector3 y_axis=(click-_edit.center).normalized(); Plane plane;
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) ); switch( _edit.plane ) {
if (_edit.snap || spatial_editor->is_snap_enabled()) { 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;
}
float snap = spatial_editor->get_rotate_snap(); Vector3 intersection;
if (!plane.intersects_ray(ray_pos,ray,&intersection))
break;
if (snap) { Vector3 click;
angle=Math::rad2deg(angle)+snap*0.5; //else it wont reach +180 if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
angle-=Math::fmod(angle,snap); break;
set_message("Rotating "+rtos(angle)+" degrees.");
angle=Math::deg2rad(angle);
} else 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 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.");
} else {
set_message("Rotating "+rtos(Math::rad2deg(angle))+" degrees."); set_message("Rotating "+rtos(Math::rad2deg(angle))+" degrees.");
}
} else {
set_message("Rotating "+rtos(Math::rad2deg(angle))+" degrees.");
}
Transform r; Transform r;
r.basis.rotate(plane.normal,-angle); 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>(); Spatial *sp = E->get()->cast_to<Spatial>();
if (!sp) if (!sp)
continue; continue;
SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp); SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
if (!se) if (!se)
continue; continue;
Transform original=se->original; Transform original=se->original;
Transform base=Transform( Matrix3(), _edit.center); Transform base=Transform( Matrix3(), _edit.center);
Transform t=base * (r * (base.inverse() * original)); Transform t=base * (r * (base.inverse() * original));
sp->set_global_transform(t); sp->set_global_transform(t);
} }
surface->update(); surface->update();
/* /*
VisualServer::get_singleton()->poly_clear(indicators); 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:{}
}
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) { } else if (m.button_mask&2) {