Modify Earcut and Triangulization Library to Work With Godot::Vector2

Allows use to ease some pain when converting PackedVector2Array
to std::vector<Vector2>.
This commit is contained in:
2025-11-08 09:05:50 -05:00
parent 35a1706e58
commit 2d0408c09e
11 changed files with 34 additions and 77 deletions

View File

@@ -8,35 +8,31 @@ class_name GeoPolyTriangulization
const CHUNK_RESULT: int = 3
# the boundary polygon
var _outer_polygon: Polygon2D
var _outer_polygon: PackedVector2Array
# inner polygons (holes)
var _inner_polygons: Array[Polygon2D]
var _inner_polygons: Array[PackedVector2Array]
# all vector points defined by outer and inner polygons
var vectors: PackedVector2Array = []
var _edge_safety: float = 0.0
func _init(outer_polygon: Polygon2D, inner_polygons: Array[Polygon2D], edge_safety: float):
func _init(outer_polygon: PackedVector2Array, inner_polygons: Array[PackedVector2Array], edge_safety: float):
self._outer_polygon = outer_polygon
self._inner_polygons = inner_polygons
self._edge_safety = edge_safety
# create a polygon that will be used to intesect the hole and control where they can destoy the wall
var intersect_polygon = Polygon2D.new()
# calulate the new smaller polygon
intersect_polygon.polygon = Geometry2D.offset_polygon(outer_polygon.polygon, self._edge_safety)[0]
print(intersect_polygon.polygon)
# calulate boundary
var hole_boundary = Geometry2D.offset_polygon(outer_polygon, self._edge_safety)[0]
for ip in inner_polygons:
var new_hole = Geometry2D.intersect_polygons(intersect_polygon.polygon, ip.polygon)[0]
ip.polygon = new_hole
var new_hole = Geometry2D.intersect_polygons(hole_boundary, ip)[0]
self._inner_polygons.append(new_hole)
self.vectors.append_array(self._outer_polygon.polygon)
self.vectors.append_array(self._outer_polygon)
for inner_polygon in self._inner_polygons:
self.vectors.append_array(inner_polygon.polygon)
self.vectors.append_array(inner_polygon)
# returns all triangles generated by ear clipping the outer and inner polygons
func triangulate() -> PackedInt32Array: