Files
fps_project_1/addons/proton_scatter/src/stack/modifier_stack.gd

97 lines
2.0 KiB
GDScript

@tool
extends Resource
signal stack_changed
signal value_changed
signal transforms_ready
const ProtonScatter := preload("../scatter.gd")
const TransformList := preload("../common/transform_list.gd")
@export var stack: Array[ScatterBaseModifier] = []
var just_created := false
func start_update(scatter_node: ProtonScatter, domain):
var transforms = TransformList.new()
for modifier in stack:
await modifier.process_transforms(transforms, domain, scatter_node.global_seed)
transforms_ready.emit(transforms)
return transforms
func stop_update() -> void:
for modifier in stack:
modifier.interrupt()
func add(modifier: ScatterBaseModifier) -> void:
stack.push_back(modifier)
modifier.modifier_changed.connect(_on_modifier_changed)
stack_changed.emit()
func move(old_index: int, new_index: int) -> void:
var modifier = stack.pop_at(old_index)
stack.insert(new_index, modifier)
stack_changed.emit()
func remove(modifier: ScatterBaseModifier) -> void:
if stack.has(modifier):
stack.erase(modifier)
stack_changed.emit()
func remove_at(index: int) -> void:
if stack.size() > index:
stack.remove_at(index)
stack_changed.emit()
func duplicate_modifier(modifier: ScatterBaseModifier) -> void:
var index: int = stack.find(modifier)
if index != -1:
var copy = modifier.get_copy()
add(copy)
move(stack.size() - 1, index + 1)
func get_copy():
var copy = get_script().new()
for modifier in stack:
copy.add(modifier.duplicate())
return copy
func get_index(modifier: ScatterBaseModifier) -> int:
return stack.find(modifier)
func is_using_edge_data() -> bool:
for modifier in stack:
if modifier.use_edge_data:
return true
return false
# Returns true if at least one modifier does not require shapes in order to work.
# (This is the case for the "Add single item" modifier for example)
func does_not_require_shapes() -> bool:
for modifier in stack:
if modifier.warning_ignore_no_shape:
return true
return false
func _on_modifier_changed() -> void:
stack_changed.emit()