Table of Contents

Class CollisionMapper

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

Responsibilities: - Translate CollisionShape2D / CollisionPolygon2D geometry into tile offsets used by placement rules and indicators. - Apply filtering, normalization, and heuristics to remove slivers and normalize pivots for consistent indicators. - Provide caching and utility helpers consumed by IndicatorManager and the placement pipeline.\n\nSee: Collision Mapping guide

class CollisionMapper extends GBInjectable
CollisionMapper

Fields

MIN_POLY_TILE_OVERLAP_RATIO

const MIN_POLY_TILE_OVERLAP_RATIO = 0.12

Properties

indicator_contact_positions

var indicator_contact_positions: Array = []

test_indicator

var test_indicator: RuleCheckIndicator

test_setups

Maps each CollisionObject2D to its CollisionTestSetup2D for collision testing.

var test_setups: Array[CollisionTestSetup2D] = []

targeting_state

var targeting_state = container.get_targeting_state()

logger

var logger = container.get_logger()

mapper

var mapper = CollisionMapper.new(targeting_state, logger)

issues

var issues: Array[String] = []

issues

var issues: Array[String] = []

map

var map = _targeting_state.target_map

dbg_msg

var dbg_msg = "map_collision_positions_to_rules: col_objects.size=%d, tile_check_rules.size=%d" % [col_objects.size(), tile_check_rules.size()]

co

var co = col_objects[idx]

default_mask

var default_mask = 1

positions_only

var positions_only = get_collision_tile_positions_with_mask(col_objects, default_mask)

pos_tile

var pos_tile: Vector2i = _targeting_state.target_map.local_to_map(_targeting_state.target_map.to_local(_targeting_state.positioner.global_position))

abs_tile

var abs_tile: Vector2i = rel_off + pos_tile

rule_info

var rule_info = "rule=%s, apply_to_objects_mask=%s" % [str(rule), str(rule.apply_to_objects_mask)]

found_positions

var found_positions = get_collision_tile_positions_with_mask(

found_count

var found_count = found_positions.size() if found_positions else 0

pos_tile

var pos_tile: Vector2i = _targeting_state.target_map.local_to_map(_targeting_state.target_map.to_local(_targeting_state.positioner.global_position))

abs_tile

var abs_tile: Vector2i = rel_off + pos_tile

colliding_tile_positions

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

diag_lines

var diag_lines: Array = []

col_obj

var col_obj = test_data.collision_object

resolution

var resolution = _object_resolver.resolve_collision_object(col_obj, test_setups)

matches

var matches = _object_resolver.object_matches_layer_mask(resolution.collision_object, collision_mask)

obj_layer

var obj_layer = 0

mask_layers

var mask_layers = PhysicsMatchingUtils2D.get_layers_from_bitmask(collision_mask)

obj_layers

var obj_layers = PhysicsMatchingUtils2D.get_layers_from_bitmask(obj_layer)

collision_tile_offsets

var collision_tile_offsets = _collision_processor.get_tile_offsets_for_collision(collision_obj, null, _targeting_state.target_map, _targeting_state.positioner)

offsets_count

var offsets_count = collision_tile_offsets.size() if collision_tile_offsets else 0

shown

var shown = []

i

var i = 0

msg

var msg = "CollisionMapper diagnostic: no tile positions computed. Details:\n" + "\n".join(diag_lines)

combined_results

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

child_offsets

var child_offsets = _collision_processor.get_tile_offsets_for_collision(child, null, _targeting_state.target_map, _targeting_state.positioner)

collision_tile_offsets

var collision_tile_offsets = _collision_processor.get_tile_offsets_for_collision(collision_obj, null, _targeting_state.target_map, _targeting_state.positioner)

result

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

collision_positions

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

validation_issues

var validation_issues = get_runtime_issues()

col_obj

var col_obj = test_data.collision_object

map

var map = _targeting_state.target_map

Methods

create_with_injection

static func create_with_injection(container: PlacementContainer) -> CollisionMapper:

Parameters

container

Returns

get_runtime_issues

func get_runtime_issues() -> Array[String]:

Returns

resolve_gb_dependencies

func resolve_gb_dependencies(container: PlacementContainer) -> bool:

Parameters

container

Returns

setup

func setup(p_test_indicator: RuleCheckIndicator, p_collision_object_test_setups: Array[CollisionTestSetup2D]) -> void:

Parameters

p_test_indicator
p_collision_object_test_setups

Returns

map_collision_positions_to_rules

func map_collision_positions_to_rules( col_objects: Array[Node2D],

get_collision_tile_positions_with_mask

func get_collision_tile_positions_with_mask( col_objects: Array[Node2D], collision_mask: int

get_tile_offsets_for_collision_polygon

func get_tile_offsets_for_collision_polygon(collision_obj: Node2D, tile_map: TileMapLayer) -> Dictionary[Vector2i, Array]:

Parameters

collision_obj
tile_map

Returns

get_tile_offsets_for_test_collisions

func get_tile_offsets_for_test_collisions(test_data: CollisionTestSetup2D) -> Dictionary[Vector2i, Array]:

Parameters

test_data

Returns

get_rect_tile_positions

func get_rect_tile_positions(global_center_position: Vector2, transformed_rect_size: Vector2) -> Array[Vector2i]:

Parameters

global_center_position
transformed_rect_size

Returns

does_indicator_overlap_shape

func does_indicator_overlap_shape( tile_indicator: RuleCheckIndicator, shape: Shape2D, shape_owner: Node2D, shape_owner_id: int = -1