Skip to content

Commit

Permalink
Merge pull request #733 from Jowan-Spooner/better-preview-panels-new
Browse files Browse the repository at this point in the history
Better Preview 2D Panel UI/UX
  • Loading branch information
RodZill4 authored Jan 8, 2025
2 parents f989727 + b9dd13d commit 40d26b3
Show file tree
Hide file tree
Showing 46 changed files with 5,726 additions and 4,685 deletions.
30 changes: 10 additions & 20 deletions addons/material_maker/engine/nodes/gen_base.gd
Original file line number Diff line number Diff line change
Expand Up @@ -201,10 +201,10 @@ func _ready() -> void:

static func get_default_generated_shader() -> ShaderCode:
var rv : ShaderCode = ShaderCode.new()
rv.output_type = "f"
rv.output_type = "rgba"
rv.output_values.f = "0.0"
rv.output_values.rgb = "vec3(0.0)"
rv.output_values.rgba = "vec4(0.0, 0.0, 0.0, 1.0)"
rv.output_values.rgba = "vec4(0.0, 0.0, 0.0, 0.0)"
return rv

func _post_load() -> void:
Expand Down Expand Up @@ -517,37 +517,27 @@ func generate_output_shader(output_index : int, preview : bool = false):
return { shader=shader, output_type=output_type }

func render(object: Object, output_index : int, size : int, preview : bool = false) -> Object:
print("This function is deprecated!")
var output_shader : Dictionary = generate_output_shader(output_index, preview)
var shader : String = output_shader.shader
var output_type : String = output_shader.output_type
var renderer = await mm_renderer.request(object)
renderer = await renderer.render_shader(object, shader, size, output_type != "rgba")
return renderer

func render_output_to_texture(output_index : int, size : int) -> MMTexture:
func render_output_to_texture(output_index : int, size : Vector2i) -> MMTexture:
var context : MMGenContext = MMGenContext.new()
var source : ShaderCode = get_shader_code("uv", output_index, context)
var shader_compute : MMShaderCompute = MMShaderCompute.new()
var shader_status : bool = await shader_compute.set_shader_from_shadercode(source, false)
var compute_shader : MMComputeShader = MMComputeShader.new()
var shader_status : bool = await compute_shader.set_shader_from_shadercode(source, false)
var texture : MMTexture = MMTexture.new()
if shader_status:
var status = await shader_compute.render(texture, size)
var status = await compute_shader.render_ext([texture], size)
return texture

func render_output(output_index : int, size : int) -> Image:
var context : MMGenContext = MMGenContext.new()
var source : ShaderCode = get_shader_code("uv", output_index, context)
var shader_compute : MMShaderCompute = MMShaderCompute.new()
var shader_status : bool = await shader_compute.set_shader_from_shadercode(source, false)
var image : Image
if shader_status:
var texture : MMTexture = MMTexture.new()
var status = await shader_compute.render(texture, size)
if status:
image = (await texture.get_texture()).get_image()
else:
image = Image.new()
return image
func render_output(output_index : int, size : Vector2i) -> Image:
var texture : MMTexture = await render_output_to_texture(output_index, size)
return (await texture.get_texture()).get_image()

func get_shader_code(uv : String, output_index : int, context : MMGenContext) -> ShaderCode:
var rv = _get_shader_code(uv, output_index, context)
Expand Down
2 changes: 1 addition & 1 deletion addons/material_maker/engine/nodes/gen_material.gd
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ func export_material(prefix : String, profile : String, size : int = 0) -> void:
saved_files += 1
progress_dialog.set_progress(float(saved_files)/float(total_files))
continue
var result : MMTexture = await render_output_to_texture(output_index, size)
var result : MMTexture = await render_output_to_texture(output_index, Vector2i(size, size))
await result.save_to_file(file_name)
saved_files += 1
progress_dialog.set_progress(float(saved_files)/float(total_files))
Expand Down
8 changes: 4 additions & 4 deletions export_presets.cfg

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions material_maker/globals.gd
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,26 @@ static func popup_menu(menu : PopupMenu, parent : Control):

func set_tip_text(tip : String, timeout : float = 0.0):
main_window.set_tip_text(tip, timeout)

static func do_propagate_shortcuts(control : Control, event : InputEvent):
for child in control.get_children():
if not child is Control:
continue
if child is Button:
if child.shortcut and child.shortcut.matches_event(event):
control.accept_event()
if child.toggle_mode:
child.button_pressed = not child.button_pressed
child.toggled.emit(child.button_pressed)
if child is MM_OptionEdit:
child.roll()
else:
child.pressed.emit()
do_propagate_shortcuts(child, event)

static func propagate_shortcuts(control : Control, event : InputEvent):
if not control.shortcut_context:
return
if not control.shortcut_context.get_global_rect().has_point(control.get_global_mouse_position()):
return
do_propagate_shortcuts(control, event)
1 change: 1 addition & 0 deletions material_maker/main_window.gd
Original file line number Diff line number Diff line change
Expand Up @@ -1014,6 +1014,7 @@ func update_preview_2d() -> void:
var generator : MMGenBase = null
var output_index : int = -1
if preview == null or not is_instance_valid(preview.generator):
previews[i].clear()
continue
generator = preview.generator
output_index = preview.output_index
Expand Down
7 changes: 3 additions & 4 deletions material_maker/main_window.tscn
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
[gd_scene load_steps=20 format=3 uid="uid://cgfeik04a5qqs"]

[ext_resource type="Script" uid="uid://cbfcjtm6e4t8h" path="res://material_maker/main_window.gd" id="1"]
[ext_resource type="Theme" uid="uid://b628lwfk6ig2c" path="res://material_maker/theme/default dark.tres" id="1_2qcba"]
[ext_resource type="Theme" uid="uid://b628lwfk6ig2c" path="res://material_maker/theme/default.tres" id="1_2qcba"]
[ext_resource type="Script" uid="uid://csdtiyrrw4pxg" path="res://material_maker/main_window_layout.gd" id="2"]
[ext_resource type="PackedScene" uid="uid://eiq3i53x72m2" path="res://addons/flexible_layout/flexible_layout.tscn" id="6_ygla4"]
[ext_resource type="PackedScene" uid="uid://clw8sb0p8webl" path="res://material_maker/windows/add_node_popup/add_node_popup.tscn" id="7"]
[ext_resource type="PackedScene" uid="uid://bnqq3vhwmudkw" path="res://material_maker/projects_panel.tscn" id="7_ih0ps"]
[ext_resource type="Texture2D" uid="uid://c0j4px4n72di5" path="res://material_maker/icons/icons.tres" id="8"]
[ext_resource type="Script" uid="uid://bqwu78me3ek4o" path="res://material_maker/console.gd" id="8_1tb00"]
[ext_resource type="Script" uid="uid://dhl8skl6fiyrn" path="res://material_maker/node_factory.gd" id="9"]
[ext_resource type="Script" uid="uid://c5v7r5h4nty5p" path="res://material_maker/console.gd" id="8_1tb00"]
[ext_resource type="Script" uid="uid://iagsj40rg7c1" path="res://material_maker/node_factory.gd" id="9"]
[ext_resource type="PackedScene" uid="uid://cp2mbbfmrv6sf" path="res://material_maker/widgets/render_counter/render_counter.tscn" id="11"]
[ext_resource type="PackedScene" uid="uid://dnttargjmhjh8" path="res://material_maker/tools/share/share_button.tscn" id="12"]
[ext_resource type="PackedScene" uid="uid://dmyq6xxfx88m0" path="res://material_maker/tools/environment_manager/environment_manager.tscn" id="13"]
[ext_resource type="Script" uid="uid://ds4jcblbferbu" path="res://material_maker/tools/library_manager/library_manager.gd" id="14"]
[ext_resource type="Texture2D" path="res://material_maker/icons/paste_none.tres" id="15"]


[sub_resource type="GDScript" id="6"]
script/source = "extends Label

Expand Down
8 changes: 4 additions & 4 deletions material_maker/main_window_layout.gd
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ extends HBoxContainer

const PANELS = [
{ name="Library", scene=preload("res://material_maker/panels/library/library.tscn"), position="TopLeft" },
{ name="Preview2D", scene=preload("res://material_maker/panels/preview_2d/preview_2d_panel.tscn"), position="TopRight" },
{ name="Preview2D", scene=preload("res://material_maker/panels/preview_2d/preview_2d_panel.tscn"), position="TopRight" , parameters={preview_mode=1} },
{ name="Preview3D", scene=preload("res://material_maker/panels/preview_3d/preview_3d_panel.tscn"), position="BottomLeft" },
{ name="Preview2D (2)", scene=preload("res://material_maker/panels/preview_2d/preview_2d_panel.tscn"), position="BottomRight", parameters={ config_var_suffix="_2" } },
{ name="Preview2D (2)", scene=preload("res://material_maker/panels/preview_2d/preview_2d_panel.tscn"), position="BottomRight", parameters={preview_mode=2} },
{ name="Histogram", scene=preload("res://material_maker/widgets/histogram/histogram.tscn"), position="BottomRight" },
{ name="Hierarchy", scene=preload("res://material_maker/panels/hierarchy/hierarchy_panel.tscn"), position="TopRight" },
{ name="Reference", scene=preload("res://material_maker/panels/reference/reference_panel.tscn"), position="BottomLeft" },
{ name="Hierarchy", scene=preload("res://material_maker/panels/hierarchy/hierarchy_panel.tscn"), position="TopRight"},
{ name="Reference", scene=preload("res://material_maker/panels/reference/reference_panel.tscn"), position="BottomLeft"},
{ name="Brushes", scene=preload("res://material_maker/panels/brushes/brushes.tscn"), position="TopLeft" },
{ name="Layers", scene=preload("res://material_maker/panels/layers/layers.tscn"), position="BottomRight" },
{ name="Parameters", scene=preload("res://material_maker/panels/parameters/parameters.tscn"), position="TopRight" },
Expand Down
2 changes: 1 addition & 1 deletion material_maker/nodes/generic/generic.gd
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,7 @@ func update_node() -> void:

func load_generator() -> void:
var dialog = preload("res://material_maker/windows/file_dialog/file_dialog.tscn").instantiate()
dialog.custom_minimum_size = Vector2(500, 500)
dialog.min_size = Vector2(500, 500)
dialog.access = FileDialog.ACCESS_FILESYSTEM
dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
dialog.add_filter("*.mmg;Material Maker Generator")
Expand Down
67 changes: 67 additions & 0 deletions material_maker/panels/common/menu_bar_button_with_panel.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
extends Button

@onready var panel := get_child(0)
@export var icon_name := ""

var pinned := false
var theme_arrow_icon: Texture2D


func _ready() -> void:
custom_minimum_size = Vector2(35, 25)
toggle_mode = true
button_mask = MOUSE_BUTTON_MASK_LEFT | MOUSE_BUTTON_MASK_RIGHT
toggled.connect(_on_toggled)
owner.resized.connect(position_panel)

panel.hide()

theme_arrow_icon = get_theme_icon("arrow", "OptionButton")
icon = get_theme_icon(icon_name, "MM_Icons")


func _draw() -> void:
if pinned:
draw_circle(Vector2(size.x-2, 2), 4, get_theme_color("icon_pressed_color"))
draw_texture(theme_arrow_icon, Vector2(18, 5), get_theme_color("icon_normal_color"))


func _on_toggled(pressed:bool) -> void:
panel.visible = pressed

if panel.visible:
position_panel()
if panel.has_method("_open"):
panel._open()
else:
pinned = false


func position_panel() -> void:
var at_position := global_position
at_position.x += size.x/2 - panel.size.x/2
at_position.x = max(at_position.x, get_parent().get_child(0).global_position.x)
at_position.y += size.y + 6
panel.global_position = at_position


func _input(event:InputEvent) -> void:
if event.is_pressed():
mm_globals.propagate_shortcuts(self, event)

if not panel.visible:
return

if event is InputEventMouseButton:
var node := get_viewport().gui_get_hovered_control()
if node != self and not is_ancestor_of(node) and (not pinned or (node and node.script == self.script)):
button_pressed = false


func _gui_input(event: InputEvent) -> void:
if event is InputEventMouseButton and not event.pressed:
if event.button_index == MOUSE_BUTTON_RIGHT:
if not pinned and button_pressed:
get_viewport().set_input_as_handled()
pinned = true
grab_focus()
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://c37lcka7r53wk
35 changes: 24 additions & 11 deletions material_maker/panels/graph_edit/graph_edit.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,20 @@ class_name MMGraphEdit
class Preview:
var generator
var output_index : int
var node : Node

func _init(g, i : int = 0):
func _init(g, i : int = 0, n = null):
generator = g
output_index = i
node = n


# warning-ignore:unused_class_variable
@export var shader_context_defs : String = "" # (String, MULTILINE)

var node_factory = null

var save_path = null: set = set_save_path
var save_path := "": set = set_save_path
var need_save : bool = false
var save_crash_recovery_path = ""
var need_save_crash_recovery : bool = false
Expand Down Expand Up @@ -362,7 +364,7 @@ func update_tab_title() -> void:
#print("no set_tab_title method")
return
var title = "[unnamed]"
if save_path != null:
if not save_path.is_empty():
title = save_path.right(-(save_path.rfind("/")+1))
if need_save:
title += " *"
Expand All @@ -375,7 +377,7 @@ func set_need_save(ns = true) -> void:
update_tab_title()
need_save_crash_recovery = true

func set_save_path(path) -> void:
func set_save_path(path: String) -> void:
if path != save_path:
remove_crash_recovery_file()
need_save_crash_recovery = false
Expand Down Expand Up @@ -483,7 +485,7 @@ func new_material(init_nodes = {nodes=[{name="Material", type="material",paramet
move_child(top_generator, 0)
update_view(top_generator)
center_view()
set_save_path(null)
set_save_path("")
set_need_save(false)

func get_free_name(type) -> String:
Expand Down Expand Up @@ -624,7 +626,7 @@ func save_as() -> bool:
return true
return false

func save_file(filename) -> bool:
func save_file(filename:String) -> bool:
mm_loader.current_project_path = filename.get_base_dir()
var data = top_generator.serialize()
mm_loader.current_project_path = ""
Expand Down Expand Up @@ -863,7 +865,11 @@ func _on_GraphEdit_node_selected(node : GraphElement) -> void:
for n in get_selected_nodes():
if n.generator == current_preview[0].generator:
return
set_current_preview(0, node)
if node.get_output_port_count():
if Input.is_key_pressed(KEY_SHIFT):
set_current_preview(1, node)
else:
set_current_preview(0, node)
undoredo_move_node_selection_changed = true
mm_globals.main_window.update_menus()

Expand All @@ -872,17 +878,19 @@ func _on_GraphEdit_node_unselected(_node):
undoredo_move_node_selection_changed = true
mm_globals.main_window.update_menus()

func get_current_preview(slot : int = 0):

func get_current_preview(slot : int = 0) -> Preview:
if locked_preview[slot] != null:
return locked_preview[slot]
return current_preview[slot]

func set_current_preview(slot : int, node, output_index : int = 0, locked = false) -> void:

func set_current_preview(slot: int, node: GraphNode, output_index: int = 0, locked := false, force_unlock := false) -> void:
var preview = null
var old_preview = null
var old_locked_preview = null
if is_instance_valid(node):
preview = Preview.new(node.generator, output_index)
preview = Preview.new(node.generator, output_index, node)
if locked:
if is_instance_valid(node) and locked_preview[slot] != null and locked_preview[slot].generator != node.generator:
old_locked_preview = locked_preview[slot].generator
Expand All @@ -893,15 +901,20 @@ func set_current_preview(slot : int, node, output_index : int = 0, locked = fals
else:
if is_instance_valid(node) and current_preview[slot] != null and current_preview[slot].generator != node.generator:
old_preview = current_preview[slot].generator
if force_unlock:
locked_preview[slot] = null
current_preview[slot] = preview
emit_signal("preview_changed", self)

preview_changed.emit(self)

if is_instance_valid(node):
node.queue_redraw()
if old_preview != null or old_locked_preview != null:
for c in get_children():
if c is GraphNode and (c.generator == old_preview or c.generator == old_locked_preview):
c.queue_redraw()


func request_popup(node_name : String , slot_index : int, _release_position : Vector2, connect_output : bool) -> void:
# Check if the connector was actually dragged
var node : GraphNode = get_node(node_name)
Expand Down
2 changes: 1 addition & 1 deletion material_maker/panels/library/library.gd
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ func _on_PopupMenu_index_pressed(index):
var current_node = main_window.get_current_node(main_window.get_current_graph_edit())
if current_node == null:
return
var image : Image = await current_node.generator.render_output(0, 64)
var image : Image = await current_node.generator.render_output(0, Vector2i(64, 64))
library_manager.update_item_icon_in_library(library_index, item_path, image)
2: # Delete item
library_manager.remove_item_from_library(library_index, item_path)
Expand Down
Loading

0 comments on commit 40d26b3

Please sign in to comment.