Table of Contents

Class TerrainPreview

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

Ghost preview for terrain painting: shows the selected terrain's tile at the hovered cell while the placement system is in TERRAIN mode.\n\nImplemented as a one-cell TileMapLayer that mirrors the target map's TileSet and global transform, so square and isometric layouts render identically to the real paint result. The ghost look comes from [member preview_self_modulate] (default: subtle ghost blue).\n\nAdd one inside the PlacementInjectorSystem's injection scope (e.g. under World). It tracks the positioner each frame while visible and repaints only when the hovered cell or selected terrain changes.

class TerrainPreview extends PlacementNode2D
TerrainPreview

Properties

preview_self_modulate

Ghost tint applied to the preview layer (self_modulate so child nodes, if any are ever added, keep their own colors).

@export var preview_self_modulate: Color = Color(0.6, 0.8, 1.0, 0.6)

active

var active = p_mode == PlacementSystem.BuildMode.TERRAIN

target_map

var target_map: TileMapLayer = _targeting_state.target_map if _targeting_state != null else null

positioner

var positioner: Node2D = _targeting_state.positioner if _targeting_state != null else null

terrain_name

var terrain_name: StringName = _building_system.selected_terrain_name if _building_system != null else StringName()

preview_cells

var preview_cells: Array[Vector2i] = []

cell_count

var cell_count: int = preview_cells.size()

last_cell

var last_cell: Vector2i = preview_cells[-1] if not preview_cells.is_empty() else Vector2i.MAX

brush_shape

var brush_shape: int = _building_system.get_current_brush_shape() if _building_system else -1

drag_start

var drag_start: Vector2i = _building_system.get_brush_drag_start() if _building_system else Vector2i.ZERO

drag_active

var drag_active: bool = _building_system.is_brush_drag_active() if _building_system else false

pending_active

var pending_active: bool = _building_system.is_pending_active() if _building_system else false

valid_cells

var valid_cells: Array[Vector2i] = []

invalid_cells

var invalid_cells: Array[Vector2i] = []

entry

var entry: TilePlacementEntry = _building_system.selected_terrain_entry if _building_system else null

palette

var palette: TerrainPalette = _building_system.selected_terrain_palette if _building_system else null

issue_map

var issue_map: Dictionary = {}

target_modulate

var target_modulate = preview_self_modulate

invalid_modulate

var invalid_modulate = Color(1.0, 0.3, 0.3, 0.7)

valid_cells

var valid_cells: Array[Vector2i] = []

invalid_cells

var invalid_cells: Array[Vector2i] = []

entry

var entry: TilePlacementEntry = _building_system.selected_terrain_entry if _building_system else null

palette

var palette: TerrainPalette = _building_system.selected_terrain_palette if _building_system else null

issues

var issues: Array[String] = []

resolved

var resolved = TerrainTilePainter.resolve_terrain_by_name(p_target_map.tile_set, p_terrain_name)

preview_tileset

var preview_tileset = p_target_map.tile_set.duplicate() as TileSet

Methods

resolve_placement_dependencies

func resolve_placement_dependencies(p_container: PlacementContainer) -> void:

Parameters

p_container

Returns