Table of Contents

Class CollisionProcessor

Namespace
GridPlacement.GDScript
Assembly
MoonBark.GridPlacement.GDScript.dll

Unified Collision Processor\n\nHandles processing for both CollisionObject2D (with shapes) and CollisionPolygon2D. Converts collision geometry to relative tile offsets for indicator positioning.\n\n[b]CRITICAL:[/b] Must use positioner.global_position as coordinate reference to maintain relative offsets. Using collision object position causes positioning displacement.\n\n[b]📖 COMPLETE GUIDE:[/b] /astro_docs/src/content/docs/internal/positioning-regression-fix-guide.mdx

class CollisionProcessor extends GBInjectable
CollisionProcessor

Fields

GeometryCacheManager

const GeometryCacheManager = preload("res://addons/grid_building/placement/manager/components/mapper/geometry_cache_manager.gd")

Properties

issues

var issues: Array[String] = []

collision_positions

var collision_positions: Dictionary[Vector2i, Array] = {}

collision_positions

var collision_positions: Dictionary[Vector2i, Array] = {}

proc_result

var proc_result = PolygonTileMapper.process_polygon_with_diagnostics(polygon_node, map)

offsets

var offsets: Array[Vector2i] = PolygonTileMapper.compute_tile_offsets_with_positioner(polygon_node, map, positioner)

collision_positions

var collision_positions: Dictionary[Vector2i, Array] = {}

col_obj

var col_obj = test_data.collision_object

center_tile

var center_tile = map.local_to_map(map.to_local(positioner.global_position))

tile_size

var tile_size = Vector2(map.tile_set.tile_size)

shape_epsilon

var shape_epsilon = 0.035

tile_shape

var tile_shape: TileSet.TileShape = map.tile_set.tile_shape

shape_positions

var shape_positions: Dictionary[Vector2i, Array] = {}

shape_positions

var shape_positions: Dictionary[Vector2i, Array] = {}

shape_owner

var shape_owner = rect_test_setup.shape_owner

shape_transform

var shape_transform = CollisionGeometryUtils.build_shape_transform(col_obj, shape_owner)

shape_polygon

var shape_polygon = GBGeometryMath.convert_shape_to_polygon(shape, shape_transform)

bounds

var bounds = _cache_manager.get_cached_polygon_bounds(shape_polygon)

tile_range

var tile_range = calculate_tile_range(shape, bounds, map, tile_size, shape_transform)

start_tile

var start_tile = Vector2i(

end_exclusive

var end_exclusive = Vector2i(

shape_offsets

var shape_offsets: Array[Vector2i] = CollisionGeometryUtils.compute_polygon_tile_offsets(

min_local

var min_local = map.to_local(bounds.position)

max_local

var max_local = map.to_local(bounds.position + bounds.size)

start_tile

var start_tile = Vector2i(

end_exclusive

var end_exclusive = Vector2i(

shape_center_tile

var shape_center_tile = map.local_to_map(map.to_local(shape_transform.origin))

left_span

var left_span = shape_center_tile.x - start_tile.x

right_span

var right_span = end_exclusive.x - shape_center_tile.x

desired_right_exclusive

var desired_right_exclusive = shape_center_tile.x + left_span + 1

eff_size

var eff_size = bounds.size

shape_center_tile

var shape_center_tile = map.local_to_map(map.to_local(shape_transform.origin))

adjusted

var adjusted = GBCollisionTileFilter.adjust_rect_tile_range(eff_size, tile_size, shape_center_tile, start_tile, end_exclusive)

tile_shape

var tile_shape: TileSet.TileShape = map.tile_set.tile_shape

shape_offsets

var shape_offsets: Array[Vector2i] = CollisionGeometryUtils.compute_polygon_tile_offsets(

sample_list

var sample_list = shape_offsets

collision_objects

var collision_objects = source_positions[tile_offset]

Methods

invalidate_cache

func invalidate_cache() -> void:

Returns

resolve_gb_dependencies

func resolve_gb_dependencies(container: PlacementContainer) -> bool:

Parameters

container

Returns

get_runtime_issues

func get_runtime_issues() -> Array[String]:

Returns

get_tile_offsets_for_collision

func get_tile_offsets_for_collision(collision_obj: Node2D, test_data: CollisionTestSetup2D, map: TileMapLayer, positioner: Node2D) -> Dictionary[Vector2i, Array]:

Parameters

collision_obj
test_data
map
positioner

Returns

process_shape_offsets

func process_shape_offsets(rect_test_setup: RectCollisionTestingSetup, test_data: CollisionTestSetup2D, map: TileMapLayer, center_tile: Vector2i, tile_size: Vector2, shape_epsilon: float, col_obj: CollisionObject2D) -> Dictionary[Vector2i, Array]:

Parameters

rect_test_setup
test_data
map
center_tile
tile_size
shape_epsilon
col_obj

Returns

calculate_tile_range

func calculate_tile_range(shape: Shape2D, bounds: Rect2, map: TileMapLayer, tile_size: Vector2, shape_transform: Transform2D) -> Dictionary:

Parameters

shape
bounds
map
tile_size
shape_transform

Returns

compute_shape_tile_offsets

func compute_shape_tile_offsets(shape: Shape2D, shape_transform: Transform2D, map: TileMapLayer, tile_size: Vector2, shape_epsilon: float, start_tile: Vector2i, end_exclusive: Vector2i, center_tile: Vector2i, shape_polygon: PackedVector2Array) -> Array[Vector2i]:

Parameters

shape
shape_transform
map
tile_size
shape_epsilon
start_tile
end_exclusive
center_tile
shape_polygon

Returns