@icon("res://behaviours/sampler.svg") extends Node class_name Sampler ## Abstract base class for sampling a certain reference among multiple. ## [Array] of [Node]s that can be [func sample]d by this [Sampler]. @export var possibilities: Array[Node] = [] ## If true, the [Sampler] will attempt to automatically [method sample_and_enable] on NOTIFICATION_READY. @export var autoenable_on_ready: bool = true var selected: Node = null ## Get a reference. func sample() -> Node: Log.e(self, "Not implemented.") return null ## Set the [field enabled] property to true on a [method sample]d node, and to false on all others. func sample_and_enable() -> void: set_enabled(sample()) func set_enabled(node: Node) -> void: if node == selected: return selected = node var selected_ref = get_ref(selected) for possibility in get_all_refs(): possibility.enabled = (selected_ref == possibility) func get_ref(node: Node) -> Node: return node ## Get all possible nodes referenced by [field possibilities]. ## ## Useful as it may be overridden by some other [Sampler]s, such as [SamplerPriority]. func get_all_refs() -> Array[Node]: return possibilities func _ready() -> void: if autoenable_on_ready: sample_and_enable.call_deferred()