Add editor freelook navigation scheme settings
Depending on what one is trying to achieve, a different freelook mode may be more desirable. This closes #34034.
This commit is contained in:
parent
d817be92c2
commit
8a48fb3517
|
@ -559,6 +559,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
|
||||||
hints["editors/3d/navigation_feel/manipulation_translation_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/navigation_feel/manipulation_translation_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
|
hints["editors/3d/navigation_feel/manipulation_translation_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/navigation_feel/manipulation_translation_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
|
||||||
|
|
||||||
// 3D: Freelook
|
// 3D: Freelook
|
||||||
|
_initial_set("editors/3d/freelook/freelook_navigation_scheme", false);
|
||||||
|
hints["editors/3d/freelook/freelook_navigation_scheme"] = PropertyInfo(Variant::INT, "editors/3d/freelook/freelook_navigation_scheme", PROPERTY_HINT_ENUM, "Default,Partially Axis-Locked (id Tech),Fully Axis-Locked (Minecraft)");
|
||||||
_initial_set("editors/3d/freelook/freelook_inertia", 0.1);
|
_initial_set("editors/3d/freelook/freelook_inertia", 0.1);
|
||||||
hints["editors/3d/freelook/freelook_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/freelook/freelook_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
|
hints["editors/3d/freelook/freelook_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/freelook/freelook_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
|
||||||
_initial_set("editors/3d/freelook/freelook_base_speed", 5.0);
|
_initial_set("editors/3d/freelook/freelook_base_speed", 5.0);
|
||||||
|
|
|
@ -2287,9 +2287,27 @@ void Node3DEditorViewport::_update_freelook(real_t delta) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
|
const FreelookNavigationScheme navigation_scheme = (FreelookNavigationScheme)EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_navigation_scheme").operator int();
|
||||||
|
|
||||||
|
Vector3 forward;
|
||||||
|
if (navigation_scheme == FREELOOK_FULLY_AXIS_LOCKED) {
|
||||||
|
// Forward/backward keys will always go straight forward/backward, never moving on the Y axis.
|
||||||
|
forward = Vector3(0, 0, -1).rotated(Vector3(0, 1, 0), camera->get_rotation().y);
|
||||||
|
} else {
|
||||||
|
// Forward/backward keys will be relative to the camera pitch.
|
||||||
|
forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
|
||||||
|
}
|
||||||
|
|
||||||
const Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0));
|
const Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0));
|
||||||
const Vector3 up = camera->get_transform().basis.xform(Vector3(0, 1, 0));
|
|
||||||
|
Vector3 up;
|
||||||
|
if (navigation_scheme == FREELOOK_PARTIALLY_AXIS_LOCKED || navigation_scheme == FREELOOK_FULLY_AXIS_LOCKED) {
|
||||||
|
// Up/down keys will always go up/down regardless of camera pitch.
|
||||||
|
up = Vector3(0, 1, 0);
|
||||||
|
} else {
|
||||||
|
// Up/down keys will be relative to the camera pitch.
|
||||||
|
up = camera->get_transform().basis.xform(Vector3(0, 1, 0));
|
||||||
|
}
|
||||||
|
|
||||||
Vector3 direction;
|
Vector3 direction;
|
||||||
|
|
||||||
|
|
|
@ -241,6 +241,12 @@ public:
|
||||||
NAVIGATION_MODO,
|
NAVIGATION_MODO,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum FreelookNavigationScheme {
|
||||||
|
FREELOOK_DEFAULT,
|
||||||
|
FREELOOK_PARTIALLY_AXIS_LOCKED,
|
||||||
|
FREELOOK_FULLY_AXIS_LOCKED,
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float cpu_time_history[FRAME_TIME_HISTORY];
|
float cpu_time_history[FRAME_TIME_HISTORY];
|
||||||
int cpu_time_history_index;
|
int cpu_time_history_index;
|
||||||
|
|
Loading…
Reference in New Issue