Skip to content

Commit

Permalink
Merge pull request #83353 from Chubercik/expose_delaunay_3d
Browse files Browse the repository at this point in the history
Expose 3D Delaunay tetrahedralization in `Geometry3D`
  • Loading branch information
akien-mga committed Jan 4, 2024
2 parents 150f2a7 + bc78c83 commit acd37f9
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 0 deletions.
5 changes: 5 additions & 0 deletions core/core_bind.cpp
Expand Up @@ -1040,6 +1040,10 @@ Vector<Vector3> Geometry3D::clip_polygon(const Vector<Vector3> &p_points, const
return ::Geometry3D::clip_polygon(p_points, p_plane);
}

Vector<int32_t> Geometry3D::tetrahedralize_delaunay(const Vector<Vector3> &p_points) {
return ::Geometry3D::tetrahedralize_delaunay(p_points);
}

void Geometry3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("compute_convex_mesh_points", "planes"), &Geometry3D::compute_convex_mesh_points);
ClassDB::bind_method(D_METHOD("build_box_planes", "extents"), &Geometry3D::build_box_planes);
Expand All @@ -1061,6 +1065,7 @@ void Geometry3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("segment_intersects_convex", "from", "to", "planes"), &Geometry3D::segment_intersects_convex);

ClassDB::bind_method(D_METHOD("clip_polygon", "points", "plane"), &Geometry3D::clip_polygon);
ClassDB::bind_method(D_METHOD("tetrahedralize_delaunay", "points"), &Geometry3D::tetrahedralize_delaunay);
}

////// Marshalls //////
Expand Down
1 change: 1 addition & 0 deletions core/core_bind.h
Expand Up @@ -337,6 +337,7 @@ class Geometry3D : public Object {
Vector<Vector3> segment_intersects_convex(const Vector3 &p_from, const Vector3 &p_to, const TypedArray<Plane> &p_planes);

Vector<Vector3> clip_polygon(const Vector<Vector3> &p_points, const Plane &p_plane);
Vector<int32_t> tetrahedralize_delaunay(const Vector<Vector3> &p_points);

Geometry3D() { singleton = this; }
};
Expand Down
16 changes: 16 additions & 0 deletions core/math/geometry_3d.h
Expand Up @@ -31,6 +31,7 @@
#ifndef GEOMETRY_3D_H
#define GEOMETRY_3D_H

#include "core/math/delaunay_3d.h"
#include "core/math/face3.h"
#include "core/object/object.h"
#include "core/templates/local_vector.h"
Expand Down Expand Up @@ -532,6 +533,21 @@ class Geometry3D {
return clipped;
}

static Vector<int32_t> tetrahedralize_delaunay(const Vector<Vector3> &p_points) {
Vector<Delaunay3D::OutputSimplex> tetr = Delaunay3D::tetrahedralize(p_points);
Vector<int32_t> tetrahedrons;

tetrahedrons.resize(4 * tetr.size());
int32_t *ptr = tetrahedrons.ptrw();
for (int i = 0; i < tetr.size(); i++) {
*ptr++ = tetr[i].points[0];
*ptr++ = tetr[i].points[1];
*ptr++ = tetr[i].points[2];
*ptr++ = tetr[i].points[3];
}
return tetrahedrons;
}

// Create a "wrap" that encloses the given geometry.
static Vector<Face3> wrap_geometry(Vector<Face3> p_array, real_t *p_error = nullptr);

Expand Down
7 changes: 7 additions & 0 deletions doc/classes/Geometry3D.xml
Expand Up @@ -142,5 +142,12 @@
Tests if the segment ([param from], [param to]) intersects the triangle [param a], [param b], [param c]. If yes, returns the point of intersection as [Vector3]. If no intersection takes place, returns [code]null[/code].
</description>
</method>
<method name="tetrahedralize_delaunay">
<return type="PackedInt32Array" />
<param index="0" name="points" type="PackedVector3Array" />
<description>
Tetrahedralizes the volume specified by a discrete set of [param points] in 3D space, ensuring that no point lies within the circumsphere of any resulting tetrahedron. The method returns a [PackedInt32Array] where each tetrahedron consists of four consecutive point indices into the [param points] array (resulting in an array with [code]n * 4[/code] elements, where [code]n[/code] is the number of tetrahedra found). If the tetrahedralization is unsuccessful, an empty [PackedInt32Array] is returned.
</description>
</method>
</methods>
</class>

0 comments on commit acd37f9

Please sign in to comment.