You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-20 14:45:44 +00:00
Merge pull request #237 from marynate/PR-maya-nav
Maya and modo style navigation
This commit is contained in:
@@ -403,6 +403,8 @@ void EditorSettings::_load_defaults() {
|
|||||||
set("3d_editor/default_z_near",0.1);
|
set("3d_editor/default_z_near",0.1);
|
||||||
set("3d_editor/default_z_far",500.0);
|
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);
|
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");
|
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);
|
set("3d_editor/pan_modifier",1);
|
||||||
|
|||||||
@@ -526,6 +526,14 @@ static int _get_key_modifier(const String& p_property) {
|
|||||||
return 0;
|
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) {
|
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) {
|
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.mouse_pos=Point2(b.x,b.y);
|
||||||
_edit.snap=false;
|
_edit.snap=false;
|
||||||
_edit.mode=TRANSFORM_NONE;
|
_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()) {
|
if (_edit.gizmo.is_valid()) {
|
||||||
|
|
||||||
@@ -1025,6 +1040,15 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
|
|||||||
|
|
||||||
} else if (m.button_mask&1) {
|
} else if (m.button_mask&1) {
|
||||||
|
|
||||||
|
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) {
|
||||||
|
|
||||||
if (!clicked_includes_current) {
|
if (!clicked_includes_current) {
|
||||||
@@ -1041,16 +1065,17 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cursor.region_select) {
|
if (cursor.region_select && nav_mode == NAVIGATION_NONE) {
|
||||||
|
|
||||||
cursor.region_end=Point2(m.x,m.y);
|
cursor.region_end=Point2(m.x,m.y);
|
||||||
surface->update();
|
surface->update();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_edit.mode==TRANSFORM_NONE)
|
if (_edit.mode==TRANSFORM_NONE && nav_mode == NAVIGATION_NONE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
Vector3 ray_pos=_get_ray_pos( 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 ) );
|
Vector3 ray=_get_ray( Vector2( m.x, m.y ) );
|
||||||
|
|
||||||
@@ -1277,8 +1302,17 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
|
|||||||
default:{}
|
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) {
|
} else if (m.button_mask&4) {
|
||||||
|
|
||||||
|
if (nav_scheme == NAVIGATION_GODOT) {
|
||||||
|
|
||||||
int mod = 0;
|
int mod = 0;
|
||||||
if (m.mod.shift)
|
if (m.mod.shift)
|
||||||
@@ -1290,39 +1324,63 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {
|
|||||||
if (m.mod.meta)
|
if (m.mod.meta)
|
||||||
mod=KEY_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;
|
Transform camera_transform;
|
||||||
|
|
||||||
camera_transform.translate(cursor.pos);
|
camera_transform.translate(cursor.pos);
|
||||||
camera_transform.basis.rotate(Vector3(0,1,0),cursor.y_rot);
|
camera_transform.basis.rotate(Vector3(0,1,0),cursor.y_rot);
|
||||||
camera_transform.basis.rotate(Vector3(1,0,0),cursor.x_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;
|
translation*=cursor.distance/DISTANCE_DEFAULT;
|
||||||
camera_transform.translate(translation);
|
camera_transform.translate(translation);
|
||||||
cursor.pos=camera_transform.origin;
|
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)
|
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)
|
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.x_rot+=m.relative_y/80.0;
|
||||||
cursor.y_rot+=m.relative_x/80.0;
|
cursor.y_rot+=m.relative_x/80.0;
|
||||||
if (cursor.x_rot>Math_PI/2.0)
|
if (cursor.x_rot>Math_PI/2.0)
|
||||||
cursor.x_rot=Math_PI/2.0;
|
cursor.x_rot=Math_PI/2.0;
|
||||||
if (cursor.x_rot<-Math_PI/2.0)
|
if (cursor.x_rot<-Math_PI/2.0)
|
||||||
cursor.x_rot=-Math_PI/2.0;
|
cursor.x_rot=-Math_PI/2.0;
|
||||||
|
} break;
|
||||||
|
|
||||||
|
default: {}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case InputEvent::KEY: {
|
case InputEvent::KEY: {
|
||||||
|
|||||||
@@ -110,7 +110,6 @@ class SpatialEditorViewport : public Control {
|
|||||||
void _update_selection();
|
void _update_selection();
|
||||||
bool _gizmo_select(const Vector2& p_screenpos,bool p_hilite_only=false);
|
bool _gizmo_select(const Vector2& p_screenpos,bool p_hilite_only=false);
|
||||||
|
|
||||||
|
|
||||||
float get_znear() const;
|
float get_znear() const;
|
||||||
float get_zfar() const;
|
float get_zfar() const;
|
||||||
float get_fov() const;
|
float get_fov() const;
|
||||||
@@ -119,6 +118,19 @@ class SpatialEditorViewport : public Control {
|
|||||||
bool clicked_includes_current;
|
bool clicked_includes_current;
|
||||||
bool clicked_wants_append;
|
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 {
|
enum TransformMode {
|
||||||
TRANSFORM_NONE,
|
TRANSFORM_NONE,
|
||||||
TRANSFORM_ROTATE,
|
TRANSFORM_ROTATE,
|
||||||
|
|||||||
Reference in New Issue
Block a user