You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-08 12:40:44 +00:00
Fix selection in 3D orthogonal view
This commit is contained in:
@@ -471,7 +471,11 @@ void SpatialEditorViewport::_find_items_at_pos(const Point2 &p_pos, bool &r_incl
|
|||||||
Vector3 SpatialEditorViewport::_get_screen_to_space(const Vector3 &p_vector3) {
|
Vector3 SpatialEditorViewport::_get_screen_to_space(const Vector3 &p_vector3) {
|
||||||
|
|
||||||
CameraMatrix cm;
|
CameraMatrix cm;
|
||||||
|
if (orthogonal) {
|
||||||
|
cm.set_orthogonal(camera->get_size(), get_size().aspect(), get_znear() + p_vector3.z, get_zfar());
|
||||||
|
} else {
|
||||||
cm.set_perspective(get_fov(), get_size().aspect(), get_znear() + p_vector3.z, get_zfar());
|
cm.set_perspective(get_fov(), get_size().aspect(), get_znear() + p_vector3.z, get_zfar());
|
||||||
|
}
|
||||||
float screen_w, screen_h;
|
float screen_w, screen_h;
|
||||||
cm.get_viewport_size(screen_w, screen_h);
|
cm.get_viewport_size(screen_w, screen_h);
|
||||||
|
|
||||||
@@ -518,9 +522,14 @@ void SpatialEditorViewport::_select_region() {
|
|||||||
|
|
||||||
Vector3 a = _get_screen_to_space(box[i]);
|
Vector3 a = _get_screen_to_space(box[i]);
|
||||||
Vector3 b = _get_screen_to_space(box[(i + 1) % 4]);
|
Vector3 b = _get_screen_to_space(box[(i + 1) % 4]);
|
||||||
|
if (orthogonal) {
|
||||||
|
frustum.push_back(Plane(a, (a - b).normalized()));
|
||||||
|
} else {
|
||||||
frustum.push_back(Plane(a, b, cam_pos));
|
frustum.push_back(Plane(a, b, cam_pos));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!orthogonal) {
|
||||||
Plane near(cam_pos, -_get_camera_normal());
|
Plane near(cam_pos, -_get_camera_normal());
|
||||||
near.d -= get_znear();
|
near.d -= get_znear();
|
||||||
|
|
||||||
@@ -530,6 +539,7 @@ void SpatialEditorViewport::_select_region() {
|
|||||||
far.d += get_zfar();
|
far.d += get_zfar();
|
||||||
|
|
||||||
frustum.push_back(far);
|
frustum.push_back(far);
|
||||||
|
}
|
||||||
|
|
||||||
Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_convex(frustum, get_tree()->get_root()->get_world()->get_scenario());
|
Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_convex(frustum, get_tree()->get_root()->get_world()->get_scenario());
|
||||||
Vector<Spatial *> selected;
|
Vector<Spatial *> selected;
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ void EditorSpatialGizmo::add_unscaled_billboard(const Ref<Material> &p_material,
|
|||||||
}
|
}
|
||||||
|
|
||||||
selectable_icon_size = p_scale;
|
selectable_icon_size = p_scale;
|
||||||
mesh->set_custom_aabb(AABB(Vector3(-selectable_icon_size, -selectable_icon_size, -selectable_icon_size) * 40.0f, Vector3(selectable_icon_size, selectable_icon_size, selectable_icon_size) * 80.0f));
|
mesh->set_custom_aabb(AABB(Vector3(-selectable_icon_size, -selectable_icon_size, -selectable_icon_size) * 100.0f, Vector3(selectable_icon_size, selectable_icon_size, selectable_icon_size) * 200.0f));
|
||||||
|
|
||||||
ins.mesh = mesh;
|
ins.mesh = mesh;
|
||||||
ins.unscaled = true;
|
ins.unscaled = true;
|
||||||
@@ -212,7 +212,7 @@ void EditorSpatialGizmo::add_unscaled_billboard(const Ref<Material> &p_material,
|
|||||||
VS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
|
VS::get_singleton()->instance_set_transform(ins.instance, spatial_node->get_global_transform());
|
||||||
}
|
}
|
||||||
|
|
||||||
selectable_icon_size = p_scale * 2.0;
|
selectable_icon_size = p_scale;
|
||||||
|
|
||||||
instances.push_back(ins);
|
instances.push_back(ins);
|
||||||
}
|
}
|
||||||
@@ -475,8 +475,9 @@ bool EditorSpatialGizmo::intersect_ray(Camera *p_camera, const Point2 &p_point,
|
|||||||
float scale = t.origin.distance_to(p_camera->get_camera_transform().origin);
|
float scale = t.origin.distance_to(p_camera->get_camera_transform().origin);
|
||||||
|
|
||||||
if (p_camera->get_projection() == Camera::PROJECTION_ORTHOGONAL) {
|
if (p_camera->get_projection() == Camera::PROJECTION_ORTHOGONAL) {
|
||||||
float h = Math::abs(p_camera->get_size());
|
float aspect = p_camera->get_viewport()->get_visible_rect().size.aspect();
|
||||||
scale = (h * 2.0);
|
float size = p_camera->get_size();
|
||||||
|
scale = size / aspect;
|
||||||
}
|
}
|
||||||
|
|
||||||
Point2 center = p_camera->unproject_position(t.origin);
|
Point2 center = p_camera->unproject_position(t.origin);
|
||||||
|
|||||||
Reference in New Issue
Block a user