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_objtest_datamappositioner
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_setuptest_datamapcenter_tiletile_sizeshape_epsiloncol_obj
Returns
calculate_tile_range
func calculate_tile_range(shape: Shape2D, bounds: Rect2, map: TileMapLayer, tile_size: Vector2, shape_transform: Transform2D) -> Dictionary:
Parameters
shapeboundsmaptile_sizeshape_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
shapeshape_transformmaptile_sizeshape_epsilonstart_tileend_exclusivecenter_tileshape_polygon