OverviewFilesCommitsIssuesDocsReleasesPeers

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

61 lines · gd ref:
tool
extends "base_point_modifier.gd"


export(String, "Curve") var falloff
export var ignore_height := true
export var override_global_seed := false
export var custom_seed := 0

var _rng: RandomNumberGenerator


func _init() -> void:
	display_name = "Remove Around Point"
	category = "Remove"
	enabled = true

	if falloff.empty():
		var curve = Curve.new()
		curve.add_point(Vector2(0, 0))
		curve.add_point(Vector2(1, 0))
		curve.bake()
		falloff = Scatter.Util.curve_to_string(curve)


func _process_transforms(transforms, global_seed) -> void:
	._process_transforms(transforms, global_seed)

	var global_transform = transforms.path.global_transform
	var pos: Vector3
	var i := 0

	_rng = RandomNumberGenerator.new()
	if override_global_seed:
		_rng.set_seed(custom_seed)
	else:
		_rng.set_seed(global_seed)

	var curve: Curve = Scatter.Util.string_to_curve(falloff)

	while i < transforms.list.size():
		pos = global_transform.xform(transforms.list[i].origin)
		for p in points:
			var exclude_pos = p.get_global_transform().origin
			if ignore_height:
				pos.y = 0.0
				exclude_pos.y = 0.0

			var distance_to_point := pos.distance_to(exclude_pos)
			var max_distance = (radius * p.radius)

			if distance_to_point < max_distance:
				var falloff_value := curve.interpolate_baked(distance_to_point / max_distance)
				var random_value := _rng.randf()

				if random_value > falloff_value:
					transforms.list.remove(i)
					i -= 1
					break
		i += 1