Class GBGeometryMath
- Namespace
- GridPlacement.GDScript
- Assembly
- MoonBark.GridPlacement.GDScript.dll
Geometry & collision math utilities for the grid building addon.\n\nProvides compact, well-documented helper functions used across the addon for tile/polygon overlap and collision tasks. Main responsibilities include: - Computing polygon vs polygon intersection areas (uses Godot Geometry2D). - Producing tile polygons for square and isometric tiles and testing polygon overlaps against tiles (area-based and optimized native collision checks). - Converting various Shape2D types to polygon approximations for geometry processing (Rectangle, Circle, Capsule, ConvexPolygon, fallback to rect). - Utility helpers: axis-aligned rectangle detection and polygon bounding rect.\n\nNote: TILE SHAPE ENFORCEMENT: All functions use TileSet.TileShape enum values.[br] Use: TileSet.TILE_SHAPE_SQUARE, TileSet.TILE_SHAPE_ISOMETRIC, TileSet.TILE_SHAPE_HALF_OFFSET_SQUARE [br] Do NOT use: integers (0, 1, 2) or strings ("square", "isometric", etc.)
class GBGeometryMath
Properties
intersection
var intersection = Geometry2D.intersect_polygons(poly_a, poly_b)
area
var area: float = 0.0
poly_area
var poly_area: float = 0.0
j
var j = (i + 1) % n
half_w
var half_w = tile_size.x / 2.0
half_h
var half_h = tile_size.y / 2.0
tile_poly
var tile_poly = get_tile_polygon(tile_top_left_pos, tile_size, tile_shape)
area
var area: float = 0.0
area
var area: float = 0.0
tile_rect_shape
var tile_rect_shape: RectangleShape2D = RectangleShape2D.new()
tile_transform
var tile_transform = Transform2D(0, tile_top_left_pos + tile_size * 0.5)
native_result
var native_result: bool = shape.collide(shape_transform, tile_rect_shape, tile_transform)
shape_polygon
var shape_polygon = convert_shape_to_polygon(shape, shape_transform)
shape_polygon
var shape_polygon = convert_shape_to_polygon(shape, shape_transform)
bounds
var bounds = get_polygon_bounds(polygon)
rect_shape
var rect_shape = shape as RectangleShape2D
rect_transform
var rect_transform = Transform2D(0, bounds.position + bounds.size * 0.5)
p1
var p1 = polygon[i]
p2
var p2 = polygon[(i + 1) % 4]
diff
var diff = p2 - p1
min_pos
var min_pos = polygon[0]
max_pos
var max_pos = polygon[0]
polygon
var polygon: PackedVector2Array = PackedVector2Array()
rect_shape
var rect_shape = shape as RectangleShape2D
size
var size = rect_shape.size
circle_shape
var circle_shape = shape as CircleShape2D
radius
var radius = capsule_shape.radius
segments
var segments = 24
angle
var angle = (i * PI / (segments/2))
point
var point = Vector2(cos(angle) * radius, sin(angle) * radius + bottom_center_y)
capsule_shape
var capsule_shape = shape as CapsuleShape2D
radius
var radius = capsule_shape.radius
height
var height = capsule_shape.height
segments
var segments = 24
half_height
var half_height = height / 2.0
top_center_y
var top_center_y = -(half_height - radius)
bottom_center_y
var bottom_center_y = half_height - radius
angle
var angle = (i * PI / (segments/2))
point
var point = Vector2(cos(angle) * radius, sin(angle) * radius + bottom_center_y)
angle
var angle = (i * PI / (segments/2))
point
var point = Vector2(cos(angle) * radius, sin(angle) * radius + bottom_center_y)
convex_shape
var convex_shape = shape as ConvexPolygonShape2D
rect
var rect = shape.get_rect()
area
var area: float = 0.0
n
var n = points.size()
j
var j = (i + 1) % n
close
var close = true
min_tile
var min_tile = tile_poly[0]
max_tile
var max_tile = tile_poly[0]
tile_rect
var tile_rect = Rect2(min_tile, max_tile - min_tile)
min_poly
var min_poly = polygon[0]
max_poly
var max_poly = polygon[0]
poly_rect
var poly_rect = Rect2(min_poly, max_poly - min_poly)
intersection_rect
var intersection_rect = tile_rect.intersection(poly_rect)
intersection_area
var intersection_area = intersection_rect.size.x * intersection_rect.size.y
overlap_x
var overlap_x = (
overlap_y
var overlap_y = (
Methods
polygon_intersection_area
static func polygon_intersection_area(poly_a: PackedVector2Array, poly_b: PackedVector2Array) -> float:
Parameters
poly_apoly_b
Returns
get_tile_polygon
static func get_tile_polygon(tile_top_left_pos: Vector2, tile_size: Vector2, tile_shape: TileSet.TileShape) -> PackedVector2Array:
Parameters
tile_top_left_postile_sizetile_shape
Returns
intersection_area_with_tile
static func intersection_area_with_tile(polygon: PackedVector2Array, tile_top_left_pos: Vector2, tile_size: Vector2, tile_shape: TileSet.TileShape) -> float:
Parameters
polygontile_top_left_postile_sizetile_shape
Returns
does_polygon_overlap_tile
static func does_polygon_overlap_tile(polygon: PackedVector2Array, tile_top_left_pos: Vector2, tile_size: Vector2, tile_shape: TileSet.TileShape, epsilon: float) -> bool:
Parameters
polygontile_top_left_postile_sizetile_shapeepsilon
Returns
does_shape_overlap_tile_optimized
static func does_shape_overlap_tile_optimized(shape: Shape2D, shape_transform: Transform2D, tile_top_left_pos: Vector2, tile_size: Vector2, tile_shape: TileSet.TileShape, epsilon: float = 0.01) -> bool:
Parameters
shapeshape_transformtile_top_left_postile_sizetile_shapeepsilon
Returns
does_polygon_overlap_tile_optimized
static func does_polygon_overlap_tile_optimized(polygon: PackedVector2Array, tile_top_left_pos: Vector2, tile_size: Vector2, tile_shape: TileSet.TileShape, epsilon: float = 0.01) -> bool:
Parameters
polygontile_top_left_postile_sizetile_shapeepsilon
Returns
get_polygon_bounds
static func get_polygon_bounds(polygon: PackedVector2Array) -> Rect2:
Parameters
polygon
Returns
convert_shape_to_polygon
static func convert_shape_to_polygon(shape: Shape2D, transform: Transform2D) -> PackedVector2Array:
Parameters
shapetransform
Returns
intersection_polygon_area
static func intersection_polygon_area(points: PackedVector2Array) -> float:
Parameters
points
Returns
is_exact_polygon_match
static func is_exact_polygon_match(poly_a: PackedVector2Array, poly_b: PackedVector2Array) -> bool:
Parameters
poly_apoly_b
Returns
exact_polygon_area
static func exact_polygon_area(poly: PackedVector2Array) -> float:
Parameters
poly
Returns
isometric_floating_point_fallback
static func isometric_floating_point_fallback( tile_poly: PackedVector2Array, polygon: PackedVector2Array
square_bounding_box_fallback
static func square_bounding_box_fallback( tile_poly: PackedVector2Array, polygon: PackedVector2Array