mirror of
https://github.com/godotengine/godot-demo-projects.git
synced 2026-01-04 23:10:08 +01:00
* Remove unnecessary use of `self`
* Connect to signals directly over `connect("name")`
* Use `call_deferred` on callables over `call_deferred("name"))`
* Emit signals directly over `emit_signal("name"...)`
96 lines
3.4 KiB
GDScript
96 lines
3.4 KiB
GDScript
@tool
|
|
extends Panel
|
|
# In this file, the word "silly" is used to make it obvious that the name is arbitrary.
|
|
|
|
var silly_material_resource = preload("res://addons/material_creator/material_resource.gd")
|
|
var editor_interface
|
|
|
|
func _ready():
|
|
# Connect all of the signals we'll need to save and load silly materials.
|
|
get_node(^"VBoxContainer/ApplyButton").pressed.connect(apply_pressed)
|
|
get_node(^"VBoxContainer/SaveButton").pressed.connect(save_pressed)
|
|
get_node(^"VBoxContainer/LoadButton").pressed.connect(load_pressed)
|
|
get_node(^"SaveMaterialDialog").file_selected.connect(save_file_selected)
|
|
get_node(^"LoadMaterialDialog").file_selected.connect(load_file_selected)
|
|
RenderingServer.canvas_item_set_clip(get_canvas_item(), true)
|
|
|
|
|
|
func save_pressed():
|
|
get_node(^"SaveMaterialDialog").popup_centered()
|
|
|
|
|
|
func load_pressed():
|
|
get_node(^"LoadMaterialDialog").popup_centered()
|
|
|
|
|
|
func apply_pressed():
|
|
# Using the passed in editor interface, get the selected nodes in the editor.
|
|
var editor_selection = editor_interface.get_selection()
|
|
var selected_nodes = editor_selection.get_selected_nodes()
|
|
if selected_nodes.size() == 0:
|
|
printerr("Material Creator: Can't apply the material, because there are no nodes selected!")
|
|
|
|
var material = _silly_resource_from_values().make_material()
|
|
# Go through the selected nodes and see if they have the "set_surface_material"
|
|
# function (which only MeshInstance3D has by default). If they do, then set the material
|
|
# to the silly material.
|
|
for node in selected_nodes:
|
|
if node.has_method("set_surface_material"):
|
|
node.set_surface_material(0, material)
|
|
|
|
|
|
func save_file_selected(path):
|
|
var silly_resource = _silly_resource_from_values()
|
|
# Make a file, store the silly material as a JSON string.
|
|
var file = FileAccess.open(path, FileAccess.WRITE)
|
|
file.store_string(silly_resource.make_json())
|
|
|
|
return true
|
|
|
|
|
|
func load_file_selected(path):
|
|
var SpatialMaterial_Silly = null
|
|
|
|
# Make a new silly resource (which in this case actually is a node)
|
|
# and initialize it.
|
|
var silly_resource = silly_material_resource.new()
|
|
silly_resource.init()
|
|
|
|
# If the file exists, then open it.
|
|
if FileAccess.file_exists(path):
|
|
var file = FileAccess.open(path, FileAccess.READ)
|
|
|
|
# Get the JSON string and convert it into a silly material.
|
|
var json_dict_as_string = file.get_line()
|
|
if json_dict_as_string != null:
|
|
silly_resource.from_json(json_dict_as_string)
|
|
else:
|
|
return false
|
|
|
|
get_node(^"VBoxContainer/AlbedoColorPicker").color = silly_resource.albedo_color
|
|
get_node(^"VBoxContainer/MetallicSlider").value = silly_resource.metallic_strength
|
|
get_node(^"VBoxContainer/RoughnessSlider").value = silly_resource.roughness_strength
|
|
|
|
# Return `true` to indicate success.
|
|
return true
|
|
|
|
# If the file does not exist, then return `false` to indicate failure.
|
|
return false
|
|
|
|
|
|
func _silly_resource_from_values():
|
|
# Get the values from the sliders and color picker.
|
|
var color = get_node(^"VBoxContainer/AlbedoColorPicker").color
|
|
var metallic = get_node(^"VBoxContainer/MetallicSlider").value
|
|
var roughness = get_node(^"VBoxContainer/RoughnessSlider").value
|
|
# Make a new silly resource (which in this case actually is a node) and initialize it.
|
|
var silly_resource = silly_material_resource.new()
|
|
silly_resource.init()
|
|
|
|
# Assign the values.
|
|
silly_resource.albedo_color = color
|
|
silly_resource.metallic_strength = metallic
|
|
silly_resource.roughness_strength = roughness
|
|
|
|
return silly_resource
|