38 lines
1.1 KiB
GDScript
38 lines
1.1 KiB
GDScript
|
|
extends Node3D
|
|
|
|
@export var light_array: Array[Vector3]:
|
|
set(points):
|
|
light_array = points
|
|
if is_inside_tree():
|
|
rebuild()
|
|
|
|
@onready var wires:LineRenderer3D = $wires
|
|
@onready var diodes:MultiMeshInstance3D = $diodes
|
|
@export var rng_seed:int = 42
|
|
var rng = RandomNumberGenerator.new()
|
|
@export var size:float = 0.1:
|
|
set(new_size):
|
|
size = new_size
|
|
rebuild()
|
|
if is_inside_tree():
|
|
wires.end_thickness = size*0.1
|
|
wires.start_thickness = size*0.1
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
rebuild()
|
|
|
|
func rebuild():
|
|
rng.seed = rng_seed
|
|
rng.state = 0
|
|
for child in wires.get_children(): child.free()
|
|
wires.points = light_array
|
|
diodes.multimesh.instance_count = light_array.size()
|
|
var meshBuffer:PackedFloat32Array
|
|
for point in light_array:
|
|
var base:Basis = Basis(Vector3(rng.randf_range(-1, 1), rng.randf_range(-1, 1), rng.randf_range(-1, 1)).normalized(), rng.randf_range(0, PI*2))
|
|
base = base.scaled(Vector3(size, size, size))
|
|
meshBuffer.append_array([base.x.x, base.x.y, base.x.z, point.x, base.y.x, base.y.y, base.y.z, point.y, base.z.x, base.z.y, base.z.z, point.z])
|
|
diodes.multimesh.buffer = meshBuffer
|