From c78022b88e0a52ba40f7b6d1cf7651fa6ef59671 Mon Sep 17 00:00:00 2001 From: Rodz Labs Date: Tue, 14 Sep 2021 22:21:21 +0200 Subject: [PATCH] Updated randomness handling in nodes (click dice to change seed, right click to show menu) --- addons/material_maker/engine/gen_base.gd | 42 ++++++++++------- addons/material_maker/engine/gen_shader.gd | 2 +- material_maker/nodes/base.gd | 55 ++++++++++++++++------ 3 files changed, 66 insertions(+), 33 deletions(-) diff --git a/addons/material_maker/engine/gen_base.gd b/addons/material_maker/engine/gen_base.gd index ba3ccd11..63d8614e 100644 --- a/addons/material_maker/engine/gen_base.gd +++ b/addons/material_maker/engine/gen_base.gd @@ -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() diff --git a/addons/material_maker/engine/gen_shader.gd b/addons/material_maker/engine/gen_shader.gd index a83489cd..af5bdaa2 100644 --- a/addons/material_maker/engine/gen_shader.gd +++ b/addons/material_maker/engine/gen_shader.gd @@ -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] ] diff --git a/material_maker/nodes/base.gd b/material_maker/nodes/base.gd index 5c40b219..4061bf2f 100644 --- a/material_maker/nodes/base.gd +++ b/material_maker/nodes/base.gd @@ -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 = ""