Skip to content

Instantly share code, notes, and snippets.

@belzecue
Forked from levidavidmurray/material_selector.gd
Created February 24, 2025 00:43
Show Gist options
  • Save belzecue/5a4ed71e30ea9b0edad103ff6abc0d29 to your computer and use it in GitHub Desktop.
Save belzecue/5a4ed71e30ea9b0edad103ff6abc0d29 to your computer and use it in GitHub Desktop.
_get_property_list example usage to populate an enum dropdown in the inspector based on dynamic array values
@tool
class_name MaterialSelector
extends Node3D
##############################
## EXPORT VARIABLES
##############################
@export var mesh: MeshInstance3D
@export var materials: Array[Material] = []:
set(value):
materials = value
_validate_material(get("material_index"))
notify_property_list_changed()
##############################
## VARIABLES
##############################
var material: Material:
set(value):
material = value
if mesh:
mesh.set_surface_override_material(0, material)
##############################
## BUILT-IN METHODS
##############################
func _get_property_list():
if materials.size() == 0:
return []
var material_names: Array[String] = []
for mat in materials:
if not mat:
continue
var mat_name = mat.resource_path.split("/")[-1].split(".")[0]
material_names.append(mat_name)
return [
{
"name": "material_index",
"type": TYPE_INT,
"hint": PROPERTY_HINT_ENUM,
"hint_string": ",".join(PackedStringArray(material_names))
}
]
func _get(property):
if property == "material_index":
if not material:
return 0
return materials.find(material)
func _set(property, value):
if property == "material_index" and value >= 0:
_validate_material(value)
return true
return false
##############################
## PRIVATE METHODS
##############################
func _validate_material(material_index: int):
if materials.size() == 0:
material = null
return
if material_index >= materials.size():
material = materials[0]
return
material = materials[material_index]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment