OverviewFilesCommitsIssuesDocsReleasesPeers

godot-witchy_world_demo / addons / scatter / src / modifiers / distribute_inside_grid.gd

46 lines · gd ref:
tool
extends "base_modifier.gd"


export var x_spacing := 2.0
export var z_spacing := 2.0


func _init() -> void:
	display_name = "Distribute Inside (Grid)"
	category = "Distribute"
	warning_ignore_no_transforms = true
	warning_ignore_no_path = false


func _process_transforms(transforms, global_seed) -> void:
	x_spacing = max(0.05, x_spacing)
	z_spacing = max(0.05, z_spacing)

	var center = transforms.path.center
	var size = transforms.path.size
	var half_size = size * 0.5
	var height: float = transforms.path.bounds_max.y

	var width := int(ceil(size.x / x_spacing))
	var length := int(ceil(size.z / z_spacing))
	var max_count: int = width * length
	transforms.resize(max_count)

	var t_index := 0
	for i in transforms.list.size():
		var pos = Vector3.ZERO
		pos.x = (i % width) * x_spacing
		pos.z = (i / width) * z_spacing
		pos += (center - half_size)
		pos.y = height

		if transforms.path.is_point_inside(pos):
			transforms.list[t_index].origin = pos
			t_index += 1

	if t_index < max_count:
		transforms.remove(max_count - t_index)

	shuffle(transforms.list, global_seed)