Cómo controlar múltiples luces V-Ray con spinners en MaxScript

El dilema del spinner rebelde en MaxScript 🎚️💡
¡Vaya lío de luces y spinners te has montado! Parece que tus controles están jugando al "último que entra gana". Vamos a solucionar este problema de identidad de spinners como buenos detectives del código.
El problema conceptual
Lo que ocurre es que:
- Todos tus handlers apuntan a la misma variable nomobj
- Al final del bucle, nomobj contiene solo la última luz
- Los handlers "recuerdan" la referencia, no el valor
"Un handler sin contexto es como un interruptor sin cableado: hace click pero no enciende nada útil"
Solución técnica
Necesitas crear closures para capturar el contexto correcto. Prueba este enfoque:
for i = 1 to mat_sel.count do (
local currentLight = mat_sel[i] -- Captura la luz actual
local spinnerName = ("spin_" + (i as string)) as name
local lightName = (currentLight.name + ": ") as string
-- Crea el spinner con el valor actual
samp.addControl #spinner spinnerName lightName paramStr type:#integer range:[0,100, currentLight.subdivisiones] fieldWidth:40 align:#center
-- Handler con closure que captura la luz correcta
on spinnerName changed val do (
currentLight.subdivisiones = val
)
)
Explicación clave
- Captura el contexto con una variable local en cada iteración
- Usa closures para que el handler "recuerde" qué luz modificar
- Evita referencias globales que se sobrescriben
Si esto no funciona (a veces el sistema de handlers de MaxScript es especial), otra opción es:
- Crear un array global de referencias a las luces
- Asignar a cada spinner un índice único
- En el handler, usar ese índice para acceder al array
Recuerda: en MaxScript, como en la vida, el contexto lo es todo. ¡Que tus spinners iluminen el camino correcto! 💡 Y si todo falla, siempre puedes hacer como en las películas: "¡Más luces!" (aunque luego el render tarde una eternidad).