48 lines
1.4 KiB
GDScript
48 lines
1.4 KiB
GDScript
@tool
|
|
extends MultiMeshInstance3D
|
|
|
|
@export var mesh_volume: MeshInstance3D : # Trascina qui il tuo volume low poly
|
|
set(val):
|
|
mesh_volume = val
|
|
generate_leaves()
|
|
|
|
@export var scale_multiplier: float = 1.5 # Per rendere i piani grandi come in foto
|
|
|
|
func generate_leaves():
|
|
if not mesh_volume or not mesh_volume.mesh:
|
|
return
|
|
|
|
var mdt = MeshDataTool.new()
|
|
mdt.create_from_surface(mesh_volume.mesh, 0)
|
|
|
|
var face_count = mdt.get_face_count()
|
|
|
|
# Inizializza il MultiMesh
|
|
multimesh.instance_count = face_count
|
|
|
|
for i in range(face_count):
|
|
# 1. Trova il centro della 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))
|
|
var center = (v1 + v2 + v3) / 3.0
|
|
|
|
# 2. Ottieni la normale della faccia per orientare il piano
|
|
var normal = mdt.get_face_normal(i)
|
|
|
|
# 3. Crea la trasformazione
|
|
# Usiamo 'look_at' per far sì che il piano sia parallelo alla faccia
|
|
var pos = center
|
|
var target = pos + normal
|
|
var xform = Transform3D().looking_at(normal, Vector3.UP)
|
|
|
|
# Applichiamo posizione e scala
|
|
xform.origin = pos
|
|
xform = xform.scaled(Vector3.ONE * scale_multiplier)
|
|
|
|
# 4. Applica al MultiMesh
|
|
multimesh.set_instance_transform(i, xform)
|
|
|
|
# Opzionale: nascondi il volume originale se vuoi vedere solo i piani
|
|
# mesh_volume.visible = false
|