This concludes the mesh generation of walls. We can now put holes into walls deterministically.
45 lines
1.5 KiB
GDScript
45 lines
1.5 KiB
GDScript
extends Node
|
|
|
|
# provides all the utility functions for generating
|
|
# a triangulized Polygon with holes
|
|
class_name GeoPolyTriangulization
|
|
|
|
# triangles are made by 3 vector
|
|
const CHUNK_RESULT: int = 3
|
|
|
|
# the boundary polygon
|
|
var _outer_polygon: Polygon2D
|
|
|
|
# inner polygons (holes)
|
|
var _inner_polygons: Array[Polygon2D]
|
|
|
|
# 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):
|
|
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)
|
|
|
|
for ip in inner_polygons:
|
|
var new_hole = Geometry2D.intersect_polygons(intersect_polygon.polygon, ip.polygon)[0]
|
|
ip.polygon = new_hole
|
|
|
|
self.vectors.append_array(self._outer_polygon.polygon)
|
|
|
|
for inner_polygon in self._inner_polygons:
|
|
self.vectors.append_array(inner_polygon.polygon)
|
|
|
|
# returns all triangles generated by ear clipping the outer and inner polygons
|
|
func triangulate() -> PackedInt32Array:
|
|
var triag = Triangulization.new()
|
|
return triag.triangulate_with_holes(self._outer_polygon, self._inner_polygons)
|