63 lines
2.1 KiB
GDScript
63 lines
2.1 KiB
GDScript
@tool
|
|
extends MultiMeshInstance3D
|
|
|
|
# Trascina qui la MeshInstance3D che rappresenta il volume della tua chioma
|
|
@export var mesh_volume: MeshInstance3D
|
|
|
|
# Clicca su questa casella nell'Inspector per generare le foglie
|
|
@export var genera_foglie: bool = false:
|
|
set(val):
|
|
if val:
|
|
popola_chioma()
|
|
genera_foglie = false # Resetta il pulsante
|
|
|
|
# Scala delle singole foglie
|
|
@export var scala_foglie: Vector3 = Vector3(1, 1, 1)
|
|
|
|
func popola_chioma():
|
|
if not mesh_volume or not mesh_volume.mesh:
|
|
print("Errore: Assegna una MeshInstance3D valida a 'Mesh Volume'.")
|
|
return
|
|
|
|
if not multimesh:
|
|
print("Errore: Il nodo MultiMeshInstance3D non ha una risorsa MultiMesh assegnata.")
|
|
return
|
|
|
|
# Assicurati che il formato sia 3D per posizioni, rotazioni e scale
|
|
multimesh.transform_format = MultiMesh.TRANSFORM_3D
|
|
|
|
var mdt = MeshDataTool.new()
|
|
# Crea i dati dalla prima superficie della mesh (indice 0)
|
|
mdt.create_from_surface(mesh_volume.mesh, 0)
|
|
|
|
var numero_facce = mdt.get_face_count()
|
|
multimesh.instance_count = numero_facce
|
|
|
|
print("Generazione di ", numero_facce, " foglie...")
|
|
|
|
for i in range(numero_facce):
|
|
# Ottieni i tre vertici che formano la faccia
|
|
var v1 = mdt.get_vertex(mdt.get_face_vertex(i, 0))
|
|
var v2 = mdt.get_vertex(mdt.get_face_vertex(i, 1))
|
|
var v3 = mdt.get_vertex(mdt.get_face_vertex(i, 2))
|
|
|
|
# Calcola il centro della faccia
|
|
var centro_faccia = (v1 + v2 + v3) / 3.0
|
|
|
|
# Crea una trasformazione con posizione, rotazione casuale e scala
|
|
var transform = Transform3D()
|
|
transform.origin = centro_faccia
|
|
|
|
# Rotazione casuale per un look naturale
|
|
transform = transform.rotated(Vector3.UP, randf() * TAU) # Rotazione attorno all'asse Y
|
|
transform = transform.rotated(Vector3.RIGHT, randf() * TAU) # Rotazione attorno all'asse X
|
|
transform = transform.rotated(Vector3.FORWARD, randf() * TAU) # Rotazione attorno all'asse Z
|
|
|
|
# Applica la scala
|
|
transform = transform.scaled(scala_foglie)
|
|
|
|
# Imposta la trasformazione per questa istanza nel MultiMesh
|
|
multimesh.set_instance_transform(i, transform)
|
|
|
|
print("Foglie generate con successo!")
|