Fix selection in 3D orthogonal view

This commit is contained in:
JFonS 2018-06-27 16:59:45 +02:00
parent 68f7cf13c7
commit e245efaead
2 changed files with 23 additions and 12 deletions

View file

@ -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;
cm.set_perspective(get_fov(), get_size().aspect(), get_znear() + p_vector3.z, get_zfar()); 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());
}
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,18 +522,24 @@ 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]);
frustum.push_back(Plane(a, b, cam_pos)); if (orthogonal) {
frustum.push_back(Plane(a, (a - b).normalized()));
} else {
frustum.push_back(Plane(a, b, cam_pos));
}
} }
Plane near(cam_pos, -_get_camera_normal()); if (!orthogonal) {
near.d -= get_znear(); Plane near(cam_pos, -_get_camera_normal());
near.d -= get_znear();
frustum.push_back(near); frustum.push_back(near);
Plane far = -near; Plane far = -near;
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;

View file

@ -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);