Skip to content

Commit d52b84e

Browse files
committed
Merge pull request #103993 from aaronfranke/geometry-segment
Directly use segment points in Geometry2D/3D function parameters
2 parents dee3ee7 + c1acc83 commit d52b84e

30 files changed

+206
-225
lines changed

core/core_bind.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -806,13 +806,11 @@ Vector<Vector2> Geometry2D::get_closest_points_between_segments(const Vector2 &p
806806
}
807807

808808
Vector2 Geometry2D::get_closest_point_to_segment(const Vector2 &p_point, const Vector2 &p_a, const Vector2 &p_b) {
809-
Vector2 s[2] = { p_a, p_b };
810-
return ::Geometry2D::get_closest_point_to_segment(p_point, s);
809+
return ::Geometry2D::get_closest_point_to_segment(p_point, p_a, p_b);
811810
}
812811

813812
Vector2 Geometry2D::get_closest_point_to_segment_uncapped(const Vector2 &p_point, const Vector2 &p_a, const Vector2 &p_b) {
814-
Vector2 s[2] = { p_a, p_b };
815-
return ::Geometry2D::get_closest_point_to_segment_uncapped(p_point, s);
813+
return ::Geometry2D::get_closest_point_to_segment_uncapped(p_point, p_a, p_b);
816814
}
817815

818816
bool Geometry2D::point_is_inside_triangle(const Vector2 &s, const Vector2 &a, const Vector2 &b, const Vector2 &c) const {
@@ -1069,13 +1067,11 @@ Vector<Vector3> Geometry3D::get_closest_points_between_segments(const Vector3 &p
10691067
}
10701068

10711069
Vector3 Geometry3D::get_closest_point_to_segment(const Vector3 &p_point, const Vector3 &p_a, const Vector3 &p_b) {
1072-
Vector3 s[2] = { p_a, p_b };
1073-
return ::Geometry3D::get_closest_point_to_segment(p_point, s);
1070+
return ::Geometry3D::get_closest_point_to_segment(p_point, p_a, p_b);
10741071
}
10751072

10761073
Vector3 Geometry3D::get_closest_point_to_segment_uncapped(const Vector3 &p_point, const Vector3 &p_a, const Vector3 &p_b) {
1077-
Vector3 s[2] = { p_a, p_b };
1078-
return ::Geometry3D::get_closest_point_to_segment_uncapped(p_point, s);
1074+
return ::Geometry3D::get_closest_point_to_segment_uncapped(p_point, p_a, p_b);
10791075
}
10801076

10811077
Vector3 Geometry3D::get_triangle_barycentric_coords(const Vector3 &p_point, const Vector3 &p_v0, const Vector3 &p_v1, const Vector3 &p_v2) {

core/math/a_star.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,12 +302,7 @@ Vector3 AStar3D::get_closest_position_in_segment(const Vector3 &p_point) const {
302302
continue;
303303
}
304304

305-
Vector3 segment[2] = {
306-
from_point->pos,
307-
to_point->pos,
308-
};
309-
310-
Vector3 p = Geometry3D::get_closest_point_to_segment(p_point, segment);
305+
Vector3 p = Geometry3D::get_closest_point_to_segment(p_point, from_point->pos, to_point->pos);
311306
real_t d = p_point.distance_squared_to(p);
312307
if (d < closest_dist) {
313308
closest_point = p;

core/math/geometry_2d.h

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -99,27 +99,39 @@ class Geometry2D {
9999
return Math::sqrt((c1 - c2).dot(c1 - c2));
100100
}
101101

102+
#ifndef DISABLE_DEPRECATED
102103
static Vector2 get_closest_point_to_segment(const Vector2 &p_point, const Vector2 *p_segment) {
103-
Vector2 p = p_point - p_segment[0];
104-
Vector2 n = p_segment[1] - p_segment[0];
104+
return get_closest_point_to_segment(p_point, p_segment[0], p_segment[1]);
105+
}
106+
#endif // DISABLE_DEPRECATED
107+
108+
static Vector2 get_closest_point_to_segment(const Vector2 &p_point, const Vector2 &p_segment_a, const Vector2 &p_segment_b) {
109+
Vector2 p = p_point - p_segment_a;
110+
Vector2 n = p_segment_b - p_segment_a;
105111
real_t l2 = n.length_squared();
106112
if (l2 < 1e-20f) {
107-
return p_segment[0]; // Both points are the same, just give any.
113+
return p_segment_a; // Both points are the same, just give any.
108114
}
109115

110116
real_t d = n.dot(p) / l2;
111117

112118
if (d <= 0.0f) {
113-
return p_segment[0]; // Before first point.
119+
return p_segment_a; // Before first point.
114120
} else if (d >= 1.0f) {
115-
return p_segment[1]; // After first point.
121+
return p_segment_b; // After first point.
116122
} else {
117-
return p_segment[0] + n * d; // Inside.
123+
return p_segment_a + n * d; // Inside.
118124
}
119125
}
120126

127+
#ifndef DISABLE_DEPRECATED
121128
static real_t get_distance_to_segment(const Vector2 &p_point, const Vector2 *p_segment) {
122-
return p_point.distance_to(get_closest_point_to_segment(p_point, p_segment));
129+
return get_distance_to_segment(p_point, p_segment[0], p_segment[1]);
130+
}
131+
#endif // DISABLE_DEPRECATED
132+
133+
static real_t get_distance_to_segment(const Vector2 &p_point, const Vector2 &p_segment_a, const Vector2 &p_segment_b) {
134+
return p_point.distance_to(get_closest_point_to_segment(p_point, p_segment_a, p_segment_b));
123135
}
124136

125137
static bool is_point_in_triangle(const Vector2 &s, const Vector2 &a, const Vector2 &b, const Vector2 &c) {
@@ -136,17 +148,23 @@ class Geometry2D {
136148
return (cn.cross(an) > 0) == orientation;
137149
}
138150

151+
#ifndef DISABLE_DEPRECATED
139152
static Vector2 get_closest_point_to_segment_uncapped(const Vector2 &p_point, const Vector2 *p_segment) {
140-
Vector2 p = p_point - p_segment[0];
141-
Vector2 n = p_segment[1] - p_segment[0];
153+
return get_closest_point_to_segment_uncapped(p_point, p_segment[0], p_segment[1]);
154+
}
155+
#endif // DISABLE_DEPRECATED
156+
157+
static Vector2 get_closest_point_to_segment_uncapped(const Vector2 &p_point, const Vector2 &p_segment_a, const Vector2 &p_segment_b) {
158+
Vector2 p = p_point - p_segment_a;
159+
Vector2 n = p_segment_b - p_segment_a;
142160
real_t l2 = n.length_squared();
143161
if (l2 < 1e-20f) {
144-
return p_segment[0]; // Both points are the same, just give any.
162+
return p_segment_a; // Both points are the same, just give any.
145163
}
146164

147165
real_t d = n.dot(p) / l2;
148166

149-
return p_segment[0] + n * d; // Inside.
167+
return p_segment_a + n * d; // Inside.
150168
}
151169

152170
// Disable False Positives in MSVC compiler; we correctly check for 0 here to prevent a division by 0.

core/math/geometry_3d.h

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ class Geometry3D {
272272
return true;
273273
}
274274

275-
static bool segment_intersects_convex(const Vector3 &p_from, const Vector3 &p_to, const Plane *p_planes, int p_plane_count, Vector3 *p_res, Vector3 *p_norm) {
275+
static bool segment_intersects_convex(const Vector3 &p_from, const Vector3 &p_to, const Plane *p_planes, int p_plane_count, Vector3 *r_res, Vector3 *r_norm) {
276276
real_t min = -1e20, max = 1e20;
277277

278278
Vector3 rel = p_to - p_from;
@@ -315,46 +315,58 @@ class Geometry3D {
315315
return false; // No intersection.
316316
}
317317

318-
if (p_res) {
319-
*p_res = p_from + dir * min;
318+
if (r_res) {
319+
*r_res = p_from + dir * min;
320320
}
321-
if (p_norm) {
322-
*p_norm = p_planes[min_index].normal;
321+
if (r_norm) {
322+
*r_norm = p_planes[min_index].normal;
323323
}
324324

325325
return true;
326326
}
327327

328+
#ifndef DISABLE_DEPRECATED
328329
static Vector3 get_closest_point_to_segment(const Vector3 &p_point, const Vector3 *p_segment) {
329-
Vector3 p = p_point - p_segment[0];
330-
Vector3 n = p_segment[1] - p_segment[0];
330+
return get_closest_point_to_segment(p_point, p_segment[0], p_segment[1]);
331+
}
332+
#endif // DISABLE_DEPRECATED
333+
334+
static Vector3 get_closest_point_to_segment(const Vector3 &p_point, const Vector3 &p_segment_a, const Vector3 &p_segment_b) {
335+
Vector3 p = p_point - p_segment_a;
336+
Vector3 n = p_segment_b - p_segment_a;
331337
real_t l2 = n.length_squared();
332338
if (l2 < 1e-20f) {
333-
return p_segment[0]; // Both points are the same, just give any.
339+
return p_segment_a; // Both points are the same, just give any.
334340
}
335341

336342
real_t d = n.dot(p) / l2;
337343

338344
if (d <= 0.0f) {
339-
return p_segment[0]; // Before first point.
345+
return p_segment_a; // Before first point.
340346
} else if (d >= 1.0f) {
341-
return p_segment[1]; // After first point.
347+
return p_segment_b; // After first point.
342348
} else {
343-
return p_segment[0] + n * d; // Inside.
349+
return p_segment_a + n * d; // Inside.
344350
}
345351
}
346352

353+
#ifndef DISABLE_DEPRECATED
347354
static Vector3 get_closest_point_to_segment_uncapped(const Vector3 &p_point, const Vector3 *p_segment) {
348-
Vector3 p = p_point - p_segment[0];
349-
Vector3 n = p_segment[1] - p_segment[0];
355+
return get_closest_point_to_segment_uncapped(p_point, p_segment[0], p_segment[1]);
356+
}
357+
#endif // DISABLE_DEPRECATED
358+
359+
static Vector3 get_closest_point_to_segment_uncapped(const Vector3 &p_point, const Vector3 &p_segment_a, const Vector3 &p_segment_b) {
360+
Vector3 p = p_point - p_segment_a;
361+
Vector3 n = p_segment_b - p_segment_a;
350362
real_t l2 = n.length_squared();
351363
if (l2 < 1e-20f) {
352-
return p_segment[0]; // Both points are the same, just give any.
364+
return p_segment_a; // Both points are the same, just give any.
353365
}
354366

355367
real_t d = n.dot(p) / l2;
356368

357-
return p_segment[0] + n * d; // Inside.
369+
return p_segment_a + n * d; // Inside.
358370
}
359371

360372
static inline bool point_in_projected_triangle(const Vector3 &p_point, const Vector3 &p_v1, const Vector3 &p_v2, const Vector3 &p_v3) {
@@ -381,8 +393,14 @@ class Geometry3D {
381393
return true;
382394
}
383395

396+
#ifndef DISABLE_DEPRECATED
384397
static inline bool triangle_sphere_intersection_test(const Vector3 *p_triangle, const Vector3 &p_normal, const Vector3 &p_sphere_pos, real_t p_sphere_radius, Vector3 &r_triangle_contact, Vector3 &r_sphere_contact) {
385-
real_t d = p_normal.dot(p_sphere_pos) - p_normal.dot(p_triangle[0]);
398+
return triangle_sphere_intersection_test(p_triangle[0], p_triangle[1], p_triangle[2], p_normal, p_sphere_pos, p_sphere_radius, r_triangle_contact, r_sphere_contact);
399+
}
400+
#endif // DISABLE_DEPRECATED
401+
402+
static inline bool triangle_sphere_intersection_test(const Vector3 &p_triangle_a, const Vector3 &p_triangle_b, const Vector3 &p_triangle_c, const Vector3 &p_normal, const Vector3 &p_sphere_pos, real_t p_sphere_radius, Vector3 &r_triangle_contact, Vector3 &r_sphere_contact) {
403+
real_t d = p_normal.dot(p_sphere_pos) - p_normal.dot(p_triangle_a);
386404

387405
if (d > p_sphere_radius || d < -p_sphere_radius) {
388406
// Not touching the plane of the face, return.
@@ -393,7 +411,7 @@ class Geometry3D {
393411

394412
/** 2nd) TEST INSIDE TRIANGLE **/
395413

396-
if (Geometry3D::point_in_projected_triangle(contact, p_triangle[0], p_triangle[1], p_triangle[2])) {
414+
if (Geometry3D::point_in_projected_triangle(contact, p_triangle_a, p_triangle_b, p_triangle_c)) {
397415
r_triangle_contact = contact;
398416
r_sphere_contact = p_sphere_pos - p_normal * p_sphere_radius;
399417
//printf("solved inside triangle\n");
@@ -402,7 +420,7 @@ class Geometry3D {
402420

403421
/** 3rd TEST INSIDE EDGE CYLINDERS **/
404422

405-
const Vector3 verts[4] = { p_triangle[0], p_triangle[1], p_triangle[2], p_triangle[0] }; // for() friendly
423+
const Vector3 verts[4] = { p_triangle_a, p_triangle_b, p_triangle_c, p_triangle_a }; // for() friendly
406424

407425
for (int i = 0; i < 3; i++) {
408426
// Check edge cylinder.

editor/plugins/abstract_polygon_2d_editor.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -707,12 +707,12 @@ AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_edge_point(c
707707
const int n_segments = n_points - (_is_line() ? 1 : 0);
708708

709709
for (int i = 0; i < n_segments; i++) {
710-
Vector2 segment[2] = { xform.xform(points[i] + offset),
711-
xform.xform(points[(i + 1) % n_points] + offset) };
710+
const Vector2 segment_a = xform.xform(points[i] + offset);
711+
const Vector2 segment_b = xform.xform(points[(i + 1) % n_points] + offset);
712712

713-
Vector2 cp = Geometry2D::get_closest_point_to_segment(p_pos, segment);
713+
Vector2 cp = Geometry2D::get_closest_point_to_segment(p_pos, segment_a, segment_b);
714714

715-
if (cp.distance_squared_to(segment[0]) < eps2 || cp.distance_squared_to(segment[1]) < eps2) {
715+
if (cp.distance_squared_to(segment_a) < eps2 || cp.distance_squared_to(segment_b) < eps2) {
716716
continue; //not valid to reuse point
717717
}
718718

editor/plugins/animation_state_machine_editor.cpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
232232

233233
// First find closest lines using point-to-segment distance.
234234
for (int i = 0; i < transition_lines.size(); i++) {
235-
Vector2 s[2] = {
236-
transition_lines[i].from,
237-
transition_lines[i].to
238-
};
239-
Vector2 cpoint = Geometry2D::get_closest_point_to_segment(mb->get_position(), s);
235+
Vector2 cpoint = Geometry2D::get_closest_point_to_segment(mb->get_position(), transition_lines[i].from, transition_lines[i].to);
240236
float d = cpoint.distance_to(mb->get_position());
241237

242238
if (d > transition_lines[i].width) {
@@ -545,11 +541,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
545541
int closest = -1;
546542
float closest_d = 1e20;
547543
for (int i = 0; i < transition_lines.size(); i++) {
548-
Vector2 s[2] = {
549-
transition_lines[i].from,
550-
transition_lines[i].to
551-
};
552-
Vector2 cpoint = Geometry2D::get_closest_point_to_segment(mm->get_position(), s);
544+
Vector2 cpoint = Geometry2D::get_closest_point_to_segment(mm->get_position(), transition_lines[i].from, transition_lines[i].to);
553545
float d = cpoint.distance_to(mm->get_position());
554546
if (d > transition_lines[i].width) {
555547
continue;

editor/plugins/navigation_obstacle_3d_editor_plugin.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -466,13 +466,11 @@ EditorPlugin::AfterGUIInput NavigationObstacle3DEditorPlugin::forward_3d_gui_inp
466466
Vector2 closest_edge_point;
467467
real_t closest_dist = 1e10;
468468
for (int i = 0; i < obstacle_vertices.size(); i++) {
469-
Vector2 points[2] = {
470-
p_camera->unproject_position(gt.xform(obstacle_vertices[i])),
471-
p_camera->unproject_position(gt.xform(obstacle_vertices[(i + 1) % obstacle_vertices.size()]))
472-
};
469+
const Vector2 a = p_camera->unproject_position(gt.xform(obstacle_vertices[i]));
470+
const Vector2 b = p_camera->unproject_position(gt.xform(obstacle_vertices[(i + 1) % obstacle_vertices.size()]));
473471

474-
Vector2 cp = Geometry2D::get_closest_point_to_segment(mouse_position, points);
475-
if (cp.distance_squared_to(points[0]) < grab_threshold || cp.distance_squared_to(points[1]) < grab_threshold) {
472+
Vector2 cp = Geometry2D::get_closest_point_to_segment(mouse_position, a, b);
473+
if (cp.distance_squared_to(a) < grab_threshold || cp.distance_squared_to(b) < grab_threshold) {
476474
continue; // Skip edge as clicked point is too close to existing vertex.
477475
}
478476

@@ -548,13 +546,11 @@ EditorPlugin::AfterGUIInput NavigationObstacle3DEditorPlugin::forward_3d_gui_inp
548546
Vector2 closest_pos;
549547
real_t closest_dist = 1e10;
550548
for (int i = 0; i < obstacle_vertices.size(); i++) {
551-
Vector2 points[2] = {
552-
p_camera->unproject_position(gt.xform(obstacle_vertices[i])),
553-
p_camera->unproject_position(gt.xform(obstacle_vertices[(i + 1) % obstacle_vertices.size()]))
554-
};
549+
const Vector2 a = p_camera->unproject_position(gt.xform(obstacle_vertices[i]));
550+
const Vector2 b = p_camera->unproject_position(gt.xform(obstacle_vertices[(i + 1) % obstacle_vertices.size()]));
555551

556-
Vector2 cp = Geometry2D::get_closest_point_to_segment(mouse_position, points);
557-
if (cp.distance_squared_to(points[0]) < CMP_EPSILON2 || cp.distance_squared_to(points[1]) < CMP_EPSILON2) {
552+
Vector2 cp = Geometry2D::get_closest_point_to_segment(mouse_position, a, b);
553+
if (cp.distance_squared_to(a) < CMP_EPSILON2 || cp.distance_squared_to(b) < CMP_EPSILON2) {
558554
continue; //not valid to reuse point
559555
}
560556

editor/plugins/node_3d_editor_gizmos.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -715,21 +715,20 @@ bool EditorNode3DGizmo::intersect_ray(Camera3D *p_camera, const Point2 &p_point,
715715
float cpd = 1e20;
716716

717717
for (int i = 0; i < vc / 2; i++) {
718-
Vector3 a = t.xform(vptr[i * 2 + 0]);
719-
Vector3 b = t.xform(vptr[i * 2 + 1]);
720-
Vector2 s[2];
721-
s[0] = p_camera->unproject_position(a);
722-
s[1] = p_camera->unproject_position(b);
718+
const Vector3 a = t.xform(vptr[i * 2 + 0]);
719+
const Vector3 b = t.xform(vptr[i * 2 + 1]);
720+
const Vector2 segment_a = p_camera->unproject_position(a);
721+
const Vector2 segment_b = p_camera->unproject_position(b);
723722

724-
Vector2 p = Geometry2D::get_closest_point_to_segment(p_point, s);
723+
Vector2 p = Geometry2D::get_closest_point_to_segment(p_point, segment_a, segment_b);
725724

726725
float pd = p.distance_to(p_point);
727726

728727
if (pd < cpd) {
729-
float d = s[0].distance_to(s[1]);
728+
float d = segment_a.distance_to(segment_b);
730729
Vector3 tcp;
731730
if (d > 0) {
732-
float d2 = s[0].distance_to(p) / d;
731+
float d2 = segment_a.distance_to(p) / d;
733732
tcp = a + (b - a) * d2;
734733

735734
} else {

editor/plugins/path_3d_editor_plugin.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -620,10 +620,9 @@ EditorPlugin::AfterGUIInput Path3DEditorPlugin::forward_3d_gui_input(Camera3D *p
620620
from = gt.xform(from);
621621
to = gt.xform(to);
622622
if (cdist > 0) {
623-
Vector2 s[2];
624-
s[0] = viewport->point_to_screen(from);
625-
s[1] = viewport->point_to_screen(to);
626-
Vector2 inters = Geometry2D::get_closest_point_to_segment(mbpos, s);
623+
const Vector2 segment_a = viewport->point_to_screen(from);
624+
const Vector2 segment_b = viewport->point_to_screen(to);
625+
Vector2 inters = Geometry2D::get_closest_point_to_segment(mbpos, segment_a, segment_b);
627626
float d = inters.distance_to(mbpos);
628627

629628
if (d < 10 && d < closest_d) {

editor/plugins/polygon_3d_editor_plugin.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,13 +200,11 @@ EditorPlugin::AfterGUIInput Polygon3DEditor::forward_3d_gui_input(Camera3D *p_ca
200200
Vector2 closest_pos;
201201
real_t closest_dist = 1e10;
202202
for (int i = 0; i < poly.size(); i++) {
203-
Vector2 points[2] = {
204-
p_camera->unproject_position(gt.xform(Vector3(poly[i].x, poly[i].y, depth))),
205-
p_camera->unproject_position(gt.xform(Vector3(poly[(i + 1) % poly.size()].x, poly[(i + 1) % poly.size()].y, depth)))
206-
};
203+
const Vector2 segment_a = p_camera->unproject_position(gt.xform(Vector3(poly[i].x, poly[i].y, depth)));
204+
const Vector2 segment_b = p_camera->unproject_position(gt.xform(Vector3(poly[(i + 1) % poly.size()].x, poly[(i + 1) % poly.size()].y, depth)));
207205

208-
Vector2 cp = Geometry2D::get_closest_point_to_segment(gpoint, points);
209-
if (cp.distance_squared_to(points[0]) < CMP_EPSILON2 || cp.distance_squared_to(points[1]) < CMP_EPSILON2) {
206+
Vector2 cp = Geometry2D::get_closest_point_to_segment(gpoint, segment_a, segment_b);
207+
if (cp.distance_squared_to(segment_a) < CMP_EPSILON2 || cp.distance_squared_to(segment_b) < CMP_EPSILON2) {
210208
continue; //not valid to reuse point
211209
}
212210

0 commit comments

Comments
 (0)