Merge pull request #237 from marynate/PR-maya-nav
Maya and modo style navigation
This commit is contained in:
commit
d7b93c3776
3 changed files with 290 additions and 218 deletions
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
_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);
|
||||
clicked=0;
|
||||
|
||||
_edit.mode=TRANSFORM_TRANSLATE;
|
||||
|
||||
}
|
||||
|
||||
if (cursor.region_select) {
|
||||
|
||||
cursor.region_end=Point2(m.x,m.y);
|
||||
surface->update();
|
||||
return;
|
||||
}
|
||||
|
||||
if (_edit.mode==TRANSFORM_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);
|
||||
}
|
||||
|
||||
cursor.region_end=Point2(m.x,m.y);
|
||||
surface->update();
|
||||
return;
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
case TRANSFORM_TRANSLATE: {
|
||||
if (_edit.mode==TRANSFORM_NONE && nav_mode == NAVIGATION_NONE)
|
||||
break;
|
||||
|
||||
|
||||
Vector3 motion_mask;
|
||||
Plane plane;
|
||||
Vector3 ray_pos=_get_ray_pos( Vector2( m.x, m.y ) );
|
||||
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;
|
||||
if (!plane.intersects_ray(ray_pos,ray,&intersection))
|
||||
break;
|
||||
switch(_edit.mode) {
|
||||
|
||||
Vector3 click;
|
||||
if (!plane.intersects_ray(_edit.click_ray_pos,_edit.click_ray,&click))
|
||||
break;
|
||||
case TRANSFORM_SCALE: {
|
||||
|
||||
//_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();
|
||||
motion.snap(snap);
|
||||
}
|
||||
Vector3 intersection;
|
||||
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 (!sp) {
|
||||
continue;
|
||||
if (_edit.snap || spatial_editor->is_snap_enabled()) {
|
||||
|
||||
scale = Math::stepify(scale,spatial_editor->get_scale_snap());
|
||||
}
|
||||
|
||||
SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp);
|
||||
if (!se) {
|
||||
continue;
|
||||
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);
|
||||
}
|
||||
|
||||
Transform t=se->original;
|
||||
t.origin+=motion;
|
||||
sp->set_global_transform(t);
|
||||
}
|
||||
} break;
|
||||
surface->update();
|
||||
|
||||
case TRANSFORM_ROTATE: {
|
||||
} break;
|
||||
|
||||
case TRANSFORM_TRANSLATE: {
|
||||
|
||||
|
||||
Plane plane;
|
||||
Vector3 motion_mask;
|
||||
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:
|
||||
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;
|
||||
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;
|
||||
|
||||
//_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();
|
||||
Vector3 x_axis=plane.normal.cross(y_axis).normalized();
|
||||
Plane plane;
|
||||
|
||||
float angle=Math::atan2( x_axis.dot(intersection-_edit.center), y_axis.dot(intersection-_edit.center) );
|
||||
if (_edit.snap || spatial_editor->is_snap_enabled()) {
|
||||
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;
|
||||
}
|
||||
|
||||
float snap = spatial_editor->get_rotate_snap();
|
||||
Vector3 intersection;
|
||||
if (!plane.intersects_ray(ray_pos,ray,&intersection))
|
||||
break;
|
||||
|
||||
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
|
||||
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 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.");
|
||||
|
||||
} 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:{}
|
||||
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) {
|
||||
|
||||
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;
|
||||
|
||||
} else if (mod == _get_key_modifier("3d_editor/orbit_modifier")) {
|
||||
} break;
|
||||
|
||||
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: {
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue