Updated randomness handling in nodes (click dice to change seed, right click to show menu)

This commit is contained in:
Rodz Labs 2021-09-14 22:21:21 +02:00
parent cab8e1b5a6
commit c78022b88e
3 changed files with 66 additions and 33 deletions

View File

@ -38,7 +38,7 @@ var model = null
var parameters = {}
var seed_locked : bool = false
var seed_value : int = 0
var seed_value : float = 0
var preview : int = -1
var minimized : bool = false
@ -53,11 +53,9 @@ func get_hier_name() -> String:
var type = load("res://addons/material_maker/engine/gen_base.gd")
var rv = name
var object = get_parent()
print(object.get_script().resource_path)
while object is type:
rv = object.name+"/"+rv
object = object.get_parent()
print(object.get_script().resource_path)
return rv
func accept_float_expressions() -> bool:
@ -84,18 +82,26 @@ func get_description() -> String:
func has_randomness() -> bool:
return false
func get_seed() -> int:
if !seed_locked:
var s : int = ((int(position.x) * 0x1f1f1f1f) ^ int(position.y)) % 65536
if get_parent().get("transmits_seed") != null and get_parent().transmits_seed:
s += get_parent().get_seed()
return s
else:
return seed_value
func set_seed(s : float):
if !has_randomness() or is_seed_locked():
return
seed_value = s
if is_inside_tree():
get_tree().call_group("preview", "on_float_parameters_changed", { "seed_o"+str(get_instance_id()): get_seed() })
func reroll_seed():
set_seed(randf())
func get_seed_from_position(p) -> int:
return ((int(p.x) * 0x1f1f1f1f) ^ int(p.y)) % 65536
func get_seed() -> float:
var s : float = seed_value
if !seed_locked and get_parent().get("transmits_seed") != null and get_parent().transmits_seed:
s += get_parent().get_seed()
return s
func toggle_lock_seed() -> bool:
if !seed_locked:
seed_value = get_seed()
seed_locked = !seed_locked
return seed_locked
@ -116,8 +122,6 @@ func set_position(p, force_recalc_seed = false) -> void:
if !force_recalc_seed && position == p:
return
position = p
if has_randomness() and !is_seed_locked() and is_inside_tree():
get_tree().call_group("preview", "on_float_parameters_changed", { "seed_o"+str(get_instance_id()): get_seed() })
func get_type() -> String:
return "generic"
@ -313,8 +317,8 @@ func serialize() -> Dictionary:
rv.parameters[p.name] = MMType.serialize_value(parameters[p.name])
elif p.has("default"):
rv.parameters[p.name] = p.default
if seed_locked:
rv.seed_value = seed_value
rv.seed = seed_value
rv.seed_locked = seed_locked
if preview >= 0:
rv.preview = preview
if minimized:
@ -346,8 +350,12 @@ func deserialize(data : Dictionary) -> void:
if data.has("seed_value"):
seed_locked = true
seed_value = data.seed_value
elif data.has("seed"):
seed_value = data.seed
seed_locked = data.seed_locked
else:
seed_locked = false
seed_value = get_seed_from_position(position)
preview = data.preview if data.has("preview") else -1
minimized = data.has("minimized") and data.minimized
_post_load()

View File

@ -435,7 +435,7 @@ func subst(string : String, context : MMGenContext, uv : String = "") -> Diction
func generate_parameter_declarations(rv : Dictionary):
var genname = "o"+str(get_instance_id())
if has_randomness():
rv.defs += "uniform float seed_%s = %d.0;\n" % [ genname, get_seed() ]
rv.defs += "uniform float seed_%s = %.9f;\n" % [ genname, get_seed() ]
for p in shader_model.parameters:
if p.type == "float" and parameters[p.name] is float:
rv.defs += "uniform float p_%s_%s = %.9f;\n" % [ genname, p.name, parameters[p.name] ]

View File

@ -111,23 +111,51 @@ func set_generator(g) -> void:
func update_rendering_time(t : int) -> void:
rendering_time = t
func _on_offset_changed() -> void:
generator.set_position(offset)
func reroll_generator_seed() -> void:
generator.reroll_seed()
func _on_gui_input(event) -> void:
if event is InputEventMouseButton and event.pressed and event.button_index == BUTTON_LEFT:
if Rect2(rect_size.x-40, 4, 16, 16).has_point(event.position):
generator.minimized = !generator.minimized
update_node()
accept_event();
elif Rect2(rect_size.x-48, 4, 16, 16).has_point(event.position):
func _on_seed_menu(id):
match id:
0:
generator.toggle_lock_seed()
update()
get_parent().send_changed_signal()
accept_event();
1:
OS.clipboard = "seed=%.9f" % generator.seed_value
2:
if OS.clipboard.left(5) == "seed=":
generator.set_seed(OS.clipboard.right(5).to_float())
func _on_offset_changed() -> void:
generator.set_position(offset)
reroll_generator_seed()
func _on_gui_input(event) -> void:
if event is InputEventMouseButton and event.pressed:
if Rect2(rect_size.x-40, 4, 16, 16).has_point(event.position):
if event.button_index == BUTTON_LEFT:
generator.minimized = !generator.minimized
update_node()
accept_event();
elif Rect2(rect_size.x-56, 4, 16, 16).has_point(event.position):
match event.button_index:
BUTTON_LEFT:
reroll_generator_seed()
BUTTON_RIGHT:
var menu : PopupMenu = PopupMenu.new()
menu.add_item(tr("Unlock seed") if generator.is_seed_locked() else tr("Lock seed"), 0)
menu.add_separator()
menu.add_item(tr("Copy seed"), 1)
if ! generator.is_seed_locked() and OS.clipboard.left(5) == "seed=":
menu.add_item(tr("Paste seed"), 2)
add_child(menu)
menu.popup(Rect2(get_global_mouse_position(), menu.get_minimum_size()))
menu.connect("popup_hide", menu, "queue_free")
menu.connect("id_pressed", self, "_on_seed_menu")
accept_event()
elif event is InputEventMouseMotion:
var epos = event.position
if Rect2(0, 0, rect_size.x-48, 16).has_point(epos):
if Rect2(0, 0, rect_size.x-56, 16).has_point(epos):
var description = generator.get_description()
if description != "":
hint_tooltip = wrap_string(description)
@ -135,10 +163,7 @@ func _on_gui_input(event) -> void:
hint_tooltip = generator.model
return
elif Rect2(rect_size.x-56, 4, 16, 16).has_point(epos) and generator.has_randomness():
if generator.is_seed_locked():
hint_tooltip = "Unlock the random seed, so it can be modified by moving the node"
else:
hint_tooltip = "Lock the random seed to its current value"
hint_tooltip = tr("Change seed (left mouse button) / Show seed menu (right mouse button)")
return
hint_tooltip = ""