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_indicatorp_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_objtile_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_positiontransformed_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