Skip to content

Commit f48c9e1

Browse files
committed
add empty cell remapping; add some comments
1 parent d6e0dd6 commit f48c9e1

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

addons/wfc/examples/demo_wfc_2d_tilemaplayer_multilayer_remap.tscn

Lines changed: 10 additions & 1 deletion
Large diffs are not rendered by default.

addons/wfc/problems/2d/preconditions/precondition_2d_remap.gd

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@ class_name WFC2DPreconditionRemap
55
var _node: Node
66
var _mapper: WFCMapper2D
77
var _domains_map: Array[WFCBitSet]
8+
var _default_domain: WFCBitSet
89

9-
func _init(node: Node, mapper: WFCMapper2D, domains_map: Array[WFCBitSet]) -> void:
10+
func _init(node: Node, mapper: WFCMapper2D, domains_map: Array[WFCBitSet], default_domain: WFCBitSet = null) -> void:
1011
assert(mapper.supports_map(node))
1112
assert(mapper.size() == domains_map.size())
1213

1314
_node = node
1415
_mapper = mapper
1516
_domains_map = domains_map
17+
_default_domain = default_domain
1618

1719
func read_domain(coords: Vector2i) -> WFCBitSet:
1820
var read := _mapper.read_cell(_node, coords)
19-
21+
2022
if read < 0:
21-
return null
22-
23+
return _default_domain
24+
2325
return _domains_map[read]

addons/wfc/problems/2d/preconditions/precondition_2d_remap_by_map.gd

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,23 @@ extends WFC2DPrecondition2DNullSettings
22

33
class_name WFC2DPrecondition2DRemapByMapSettings
44

5+
## A map that defines possible tile replacements.
6+
##
7+
## The tiles placed in the target map may be replaced by any tiles that are present in same rows of
8+
## this class map.
9+
##
10+
## E.g. if there are tiles A B C D in the tileset, and the class map contains a row of A B and A C,
11+
## then A tile may be replaced by either A, B or C; B - by A or B; C - by A or C; and the tile D
12+
## will always remain as is.
513
@export_node_path
614
var class_map: NodePath
715

16+
## Remap empty cells of target map to tiles from first row of class map.
17+
##
18+
## If not set, empty cells may be filled with any tile.
19+
@export
20+
var remap_empty: bool = false
21+
822
func _learn_classes(mapper: WFCMapper2D, map: Node) -> Array[WFCBitSet]:
923
var res: Array[WFCBitSet] = []
1024

@@ -31,9 +45,16 @@ func create_precondition(parameters: CreationParameters) -> WFC2DPrecondition:
3145
assert(class_map != null)
3246
var class_map_node := parameters.generator_node.get_node(class_map)
3347
assert(parameters.problem_settings.rules.mapper.supports_map(class_map_node))
48+
49+
var classes := _learn_classes(parameters.problem_settings.rules.mapper, class_map_node)
50+
var empty_domain: WFCBitSet = null
51+
52+
if remap_empty:
53+
empty_domain = classes[0]
3454

3555
return WFC2DPreconditionRemap.new(
3656
parameters.target_node,
3757
parameters.problem_settings.rules.mapper,
38-
_learn_classes(parameters.problem_settings.rules.mapper, class_map_node)
58+
classes,
59+
empty_domain,
3960
)

0 commit comments

Comments
 (0)