mirror of
https://github.com/Relintai/material-maker.git
synced 2024-12-27 23:17:14 +01:00
99 lines
3.1 KiB
GDScript
99 lines
3.1 KiB
GDScript
tool
|
|
extends MMGenBase
|
|
class_name MMGenSwitch
|
|
|
|
"""
|
|
Texture generator switch
|
|
"""
|
|
|
|
var editable = false
|
|
|
|
func get_type() -> String:
|
|
return "switch"
|
|
|
|
func get_type_name() -> String:
|
|
return "Switch"
|
|
|
|
func toggle_editable() -> bool:
|
|
editable = !editable
|
|
return true
|
|
|
|
func is_editable() -> bool:
|
|
return editable
|
|
|
|
func get_parameter_defs() -> Array:
|
|
var choices = parameters.choices if parameters.has("choices") else 2
|
|
return [
|
|
{ name="outputs", label="Outputs", type="float", min=1, max=5, step=1, default=2 },
|
|
{ name="choices", label="Choices", type="float", min=2, max=5, step=1, default=2 },
|
|
{ name="source", label="Source", type="float", min=0, max=choices-1, step=1, default=0 },
|
|
]
|
|
|
|
func get_input_defs() -> Array:
|
|
var rv : Array = []
|
|
for c in range(parameters.choices):
|
|
for o in range(parameters.outputs):
|
|
var n = PoolByteArray([65+o]).get_string_from_ascii()+str(c)
|
|
rv.push_back({ name=n, label=n, type="any" })
|
|
return rv
|
|
|
|
func get_output_defs() -> Array:
|
|
var rv : Array = []
|
|
for o in range(get_parameter("outputs")):
|
|
var n = PoolByteArray([65+o]).get_string_from_ascii()
|
|
rv.push_back({ name=n, type="any" })
|
|
return rv
|
|
|
|
func set_parameter(p, v) -> void:
|
|
if p == "outputs" or p == "choices":
|
|
var parent = get_parent()
|
|
if parent != null:
|
|
var connected_inputs : Array = parent.get_connected_inputs(self)
|
|
var connected_outputs : Array = parent.get_connected_outputs(self)
|
|
var inputs_changes : Dictionary = {}
|
|
var outputs_changes : Dictionary = {}
|
|
if p == "outputs":
|
|
for i in connected_inputs:
|
|
var input = int(i) % int(parameters.outputs)
|
|
var choice = int(i) / int(parameters.outputs)
|
|
if input >= v:
|
|
inputs_changes[i] = -1
|
|
else:
|
|
inputs_changes[i] = input + v * choice
|
|
for i in connected_outputs:
|
|
if i >= v:
|
|
outputs_changes[i] = -1
|
|
else:
|
|
for i in connected_inputs:
|
|
var input = int(i) % int(parameters.outputs)
|
|
var choice = int(i) / int(parameters.outputs)
|
|
if choice >= v:
|
|
inputs_changes[i] = -1
|
|
parent.reconnect_inputs(self, inputs_changes)
|
|
parent.reconnect_outputs(self, outputs_changes)
|
|
.set_parameter(p, v)
|
|
emit_signal("parameter_changed", "__update_all__", null)
|
|
if p == "source":
|
|
for i in range(int(parameters.outputs)):
|
|
notify_output_change(i)
|
|
|
|
# get the list of outputs that depend on the input whose index is passed as parameter
|
|
func follow_input(input_index : int) -> Array:
|
|
return [ OutputPort.new(self, input_index % int(parameters.outputs)) ]
|
|
|
|
func source_changed(input_index : int) -> void:
|
|
if parameters.has("outputs"):
|
|
notify_output_change(input_index % int(parameters.outputs))
|
|
|
|
func _get_shader_code(uv : String, output_index : int, context : MMGenContext) -> Dictionary:
|
|
var source = get_source(output_index+parameters.source*parameters.outputs)
|
|
if source != null:
|
|
var rv = source.generator._get_shader_code(uv, source.output_index, context)
|
|
while rv is GDScriptFunctionState:
|
|
rv = yield(rv, "completed")
|
|
return rv
|
|
return { globals=[], defs="", code="", textures={}, type="f", f="0.0" }
|
|
|
|
func _serialize(data: Dictionary) -> Dictionary:
|
|
return data
|