Updated randomness handling in nodes (click dice to change seed, right click to show menu)
This commit is contained in:
parent
cab8e1b5a6
commit
c78022b88e
|
@ -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()
|
||||
|
|
|
@ -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] ]
|
||||
|
|
|
@ -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 = ""
|
||||
|
||||
|
|
Loading…
Reference in New Issue