La librería shape es una de las más poderosas y extensas del Kara Effector. Proporciona un control total sobre las figuras vectoriales de ASS (\p1, \p<num>). Con estas funciones, puedes crear figuras desde cero, manipular sus puntos, transformarlas geométricamente, animarlas a lo largo de trayectorias complejas, convertirlas en píxeles y mucho más. Es la base para todos los efectos visuales que van más allá de la manipulación de texto simple.
Estas funciones se utilizan para obtener información sobre una shape o para realizar conversiones y normalizaciones fundamentales.
shape.ASSDraw3( Shape, Round )Descripción: Normaliza y limpia una cadena de texto de una shape. Convierte \clip rectangulares a su equivalente en shape, elimina espacios extra, redondea coordenadas y convierte segmentos de línea o curva largos en múltiples segmentos más cortos para asegurar la compatibilidad. Es una función de pre-procesamiento fundamental.
Argumentos:
Shape (string | table): La shape o tabla de shapes a procesar.Round (number, opcional): El número de decimales al que se redondearán las coordenadas. Por defecto es 2.shape.round( Shape, Round )Descripción: Redondea todas las coordenadas numéricas dentro de una shape a un número específico de decimales.
Argumentos:
Shape (string | table): La shape a redondear.Round (number, opcional): El número de decimales. Por defecto es 0 (redondeo al entero más cercano).shape.info( Shape )Descripción: No devuelve un valor directamente, sino que calcula y almacena en variables globales temporales las propiedades geométricas de una shape. Estas variables son cruciales para ser usadas en otras funciones, especialmente en filtros.
Variables que establece:
minx, maxx, miny, maxy: Coordenadas de la caja contenedora (bounding box).w_shape, h_shape: Ancho y alto de la shape.c_shape, m_shape: Coordenadas del centro de la shape.n_points: Número total de puntos en la shape.Argumentos:
Shape (string): La shape a analizar.Uso: Se llama internamente antes de funciones como shape.filter para que las variables estén disponibles.
shape.length( Shape, parts )Descripción: Calcula la longitud total del perímetro de una shape, incluyendo sus segmentos curvos.
Argumentos:
Shape (string | table): La shape a medir.parts (opcional): Si se proporciona cualquier valor en este argumento, la función devuelve una tabla con la longitud de cada segmento individual en lugar de la suma total.shape.width( Shape, Height ) y shape.height( Shape )Descripción: Calculan el ancho (width) o el alto (height) de la caja contenedora de la shape. shape.height es simplemente un atajo para llamar a shape.width con el segundo argumento.
Argumentos:
Shape (string | table): La shape a medir.Height (string, opcional): Si se proporciona el string "height", la función shape.width devuelve la altura.shape.fxline( P1, P2, Radius )Descripción: Crea una shape de línea recta.
Argumentos:
P1 (table): El punto de inicio {x, y}.P2 (table | number): El punto final. Si es una tabla {x, y}, crea una línea entre P1 y P2. Si es un número, se interpreta como un ángulo (en grados).Radius (number): Si P2 es un ángulo, este es el largo (radio) de la línea.shape.fxcircle( Shape )Descripción: Genera una shape de círculo a partir de los tres primeros puntos de una shape o clip rectangular. Calcula el círculo que pasa por esos tres puntos (circuncentro).
Argumentos:
Shape (string | table): La shape o tabla de 3 puntos {cx, cy, radio} de la cual se derivará el círculo.shape.from_clip( )Descripción: Extrae el trazado vectorial de un \iclip de la línea de karaoke actual y lo convierte en una nueva línea de diálogo completamente dibujable (con \an7\pos(0,0)\p1). Es útil para visualizar o manipular directamente la trayectoria de un clip.
Argumentos: Ninguno.
Uso:
-- En una línea que ya tiene un \iclip(m...):
return shape.from_clip()
shape.inclip( Tags )Descripción: Similar a from_clip, pero en lugar de generar una línea nueva, devuelve únicamente el código de la shape extraído del \iclip de la línea actual. Si no se encuentra un \iclip, devuelve una shape rectangular del tamaño del objeto karaoke.
Argumentos:
Tags (string, opcional): Tags que se añadirán al principio del string devuelto (ej. {\pos(100,100)}).Ejemplo de Uso:
-- En "Variables [fx]:", para guardar la trayectoria para uso posterior
mi_trayectoria = shape.inclip()
shape.to_shape( Table_points )Descripción: Realiza la operación inversa a shape.divide. Toma una tabla de segmentos de shape y los une en un único string de shape.
Argumentos:
Table_points (table): Una tabla donde cada elemento es un string de un segmento de shape (ej. {"m 0 0 l 10 10", "l 20 0"}).Ejemplo de Uso: return shape.to_shape(mis_segmentos)
shape.intersect( Shape1, Shape2 )Descripción: Encuentra todos los puntos de intersección geométrica entre dos shapes. Antes de calcular, convierte todas las curvas Bézier en segmentos de línea.
Argumentos:
Shape1, Shape2 (string): Las dos shapes a comparar.Devuelve: Una tabla de tablas, donde cada tabla interna contiene las coordenadas de un punto de intersección: {{x1, y1}, {x2, y2}, ...}.
Ejemplo de Uso:
-- En "Variables [fx]:":
puntos = shape.intersect(shape.rectangle, "m -10 50 l 110 50")
-- 'puntos' contendrá {{0, 50}, {100, 50}}
shape.parametric( Shape, Pixel )Descripción: Permite obtener las coordenadas de puntos a lo largo de la trayectoria de una shape, un punto por cada iteración del bucle (j). La función establece automáticamente maxloop al número total de puntos generados.
Argumentos:
Shape (string): La shape que servirá como trayectoria.Pixel (number, opcional): La distancia aproximada entre cada punto a lo largo de la trayectoria. Un valor más bajo genera más puntos.Devuelve: Una tabla {x=..., y=...} con las coordenadas del punto j en la trayectoria.
Ejemplo de Uso:
-- En un Template [Shape]
-- En "Variables [fx]:"
mi_punto = shape.parametric(shape.circle, 5)
-- En "Return [fx]:":
-- Coloca una estrella en cada punto de la circunferencia.
return "{\\pos("..mi_punto.x..","..mi_punto.y..")}" .. shape.star
shape.displace( Shape, Dx, Dy, Mode )Descripción: Es la función principal para mover (desplazar) una shape. Puede mover la figura a coordenadas absolutas o de forma relativa a su centro, origen o primer/último punto.
Argumentos:
Shape (string): La shape a mover.Dx, Dy (number | string): El desplazamiento en los ejes X e Y. Si se omite, es 0. También acepta atajos en string como "incenter" o "origin".Mode (string, opcional): Define el punto de anclaje para el desplazamiento.
nil (por defecto): Desplazamiento absoluto."origin": Mueve la esquina superior izquierda de la shape a las coordenadas (Dx, Dy)."center": Mueve el centro de la shape a (Dx, Dy)."first": Mueve el primer punto de la shape a (Dx, Dy)."last": Mueve el último punto de la shape a (Dx, Dy).Ejemplo de Uso:
-- Mueve el centro del círculo a las coordenadas (100, 200)
return shape.displace(shape.circle, 100, 200, "center")
shape.ratio( Shape, Ratiox, Ratioy, Mode )Descripción: Escala una shape basándose en un factor de proporción. A diferencia de shape.size, no define un tamaño final en píxeles, sino que multiplica sus dimensiones actuales por el factor dado.
Argumentos:
Shape (string): La shape a escalar.Ratiox (number | table): Factor de escala horizontal (ej. 1.5 para 150%). Si se omite, usa el valor de Ratioy.Ratioy (number | table): Factor de escala vertical. Si se omite, usa el valor de Ratiox.Mode (number, opcional): Un número del 1 al 9 que define el punto de anclaje para la escala (como \an). Por defecto es 0 (origen 0,0).Ejemplo de Uso:
-- Hace una shape el doble de ancha y la mitad de alta, anclada en su centro
return shape.ratio(shape.rectangle, 2, 0.5, 5)
shape.size( Shape, SizeX, SizeY, Mode )Descripción: Escala una shape para que tenga un ancho y alto específicos en píxeles.
Argumentos:
Shape (string): La shape a redimensionar.SizeX (number | table): El ancho final en píxeles. Si es una tabla {valor}, se suma al ancho actual. 0 para escalar proporcionalmente a SizeY.SizeY (number | table): El alto final en píxeles. Si es una tabla {valor}, se suma al alto actual. 0 para escalar proporcionalmente a SizeX.Mode (number, opcional): Punto de anclaje (1-9). Por defecto es 0 (origen 0,0).Ejemplo de Uso:
-- Redimensiona un círculo para que mida 100x100 píxeles, anclado en su centro.
return shape.size(shape.circle, 100, 100, 5)
shape.reflect( Shape, Axis, Relative )Descripción: Crea un reflejo especular de una shape a través de un eje o una línea.
Argumentos:
Shape (string): La shape a reflejar.Axis (string, opcional): El eje de reflexión. "x" (horizontal), "y" (vertical, por defecto), o cualquier otro valor para reflejar a través del origen.Relative (number, opcional): Coordenada de la línea de reflexión. Por defecto es 0 (el eje).Ejemplo de Uso:
-- Refleja un banner horizontalmente a través de la línea x=150
return shape.reflect(mi_banner, "y", 150)
shape.oblique( Shape, Pixel, Axis )Descripción: Aplica un efecto de cizallado o inclinación (skew) a una shape, similar al estilo de letra cursiva.
Argumentos:
Shape (string): La shape a inclinar.Pixel (number | table): La cantidad de desplazamiento en píxeles. Si es una tabla {valor}, la inclinación es angular en lugar de lineal.Axis (string, opcional): El eje de inclinación: "x", "y", o "xy" (ambos).Ejemplo de Uso:
-- Inclina un rectángulo 20 píxeles en el eje X.
return shape.oblique(shape.rectangle, 20, "x")
shape.pointpos( Shape, P1, P2 )Descripción: Desplaza una shape entera de tal manera que uno de sus puntos (P1) se mueva para coincidir exactamente con una nueva coordenada de destino (P2).
Argumentos:
Shape (string): La shape a mover.P1 (number | string | table): El punto de origen en la shape. Puede ser el índice del punto (2), una shape de punto ("m 10 10"), o una tabla de coordenadas ({10, 10}).P2 (string | table): La coordenada de destino, como shape de punto o tabla.Ejemplo de Uso:
-- Mueve un círculo para que su segundo punto de control quede en la posición (0,0).
return shape.pointpos(shape.circle, 2, {0, 0})
shape.pos( Shape )Descripción: Cuando se aplica a una shape compuesta, esta función activa un bucle (loop) y devuelve la posición (\pos(...)) y la shape de cada sub-figura individual en cada iteración (j).
Argumentos:
Shape (string): La shape compuesta.Ejemplo de Uso:
-- En un Template [Shape]
-- 'mis_estrellas' es una shape compuesta de 5 estrellas. Esto creará 5 líneas,
-- cada una con una estrella en su posición correcta.
return shape.pos(mis_estrellas)
shape.matrix( Shape, ... )Descripción: Aplica una o más matrices de transformación 3x3 a cada punto de una shape. Es la herramienta de transformación más avanzada, permitiendo cualquier combinación de rotación, escala, desplazamiento y cizallado en una sola operación.
Argumentos:
Shape (string): La shape a transformar.... (table): Una o más matrices 3x3. Se multiplican en secuencia. Se pueden usar las funciones math.matrix_... para generarlas.Ejemplo de Uso:
-- Rota una shape 45 grados y luego la desplaza 100px a la derecha.
local matriz_rot = math.matrix_rot(45)
local matriz_des = math.matrix_dis(100, 0)
return shape.matrix(shape.rectangle, matriz_rot, matriz_des)
Estas funciones alteran la estructura o los puntos de una shape.
shape.redraw( Shape, tract, Section, Continued )Descripción: Redibuja una shape convirtiendo sus segmentos en una serie de líneas rectas más pequeñas de una longitud aproximada. Es fundamental para aplicar efectos que necesitan una mayor densidad de vértices.
Argumentos:
Shape (string): La shape a redibujar.tract (number): La longitud aproximada de cada nuevo segmento de línea.Section (string, opcional): Define qué tipo de segmentos se redibujarán. "line", "bezier", o "all" (por defecto).Continued (boolean, opcional): Si es true, trata una shape con múltiples figuras (m ...) como una sola figura continua.shape.filter( Shape, Split, ... )Descripción: Una de las funciones más potentes. Aplica una o más funciones de filtro a cada punto de una shape. La función de filtro recibe las coordenadas (x, y) del punto y debe devolver las nuevas coordenadas. Dentro del filtro, se tienen acceso a variables especiales como Dc (distancia al centro), Ac (ángulo desde el centro), Mp (progreso a lo largo de la shape), etc.
Argumentos:
Shape (string): La shape a la que se aplicará el filtro.Split (number): La shape se redibuja primero con este tamaño de segmento para tener más puntos a los que aplicar el filtro.... (function): Una o más funciones de filtro a aplicar secuencialmente.shape.to_line( Shape, Tract )Descripción: Convierte todos los segmentos de curva Bézier (b) de una shape en segmentos de línea (l). Es un atajo para shape.redraw con la sección "bezier".
Argumentos:
Shape (string): La shape a convertir.Tract (number, opcional): La longitud de los nuevos segmentos de línea.shape.to_bezier( Shape )Descripción: Convierte todos los segmentos de línea (l) de una shape en segmentos de curva Bézier (b).
Argumentos:
Shape (string): La shape a convertir.shape.reverse( Shape )Descripción: Invierte el orden de los puntos de una shape, cambiando la dirección en la que fue dibujada.
Argumentos:
Shape (string): La shape a invertir.shape.reduce( Shape )Descripción: Optimiza una shape eliminando puntos colineales redundantes. Por ejemplo, si un punto se encuentra exactamente en la línea recta formada por sus dos puntos vecinos, es eliminado.
Argumentos:
Shape (string): La shape a reducir.shape.to_outline( Shape, Bord )Descripción: Crea el contorno (borde) de una shape, generando una nueva shape que representa el borde con un grosor determinado. Utiliza la librería Yutils.
Argumentos:
Shape (string): La shape de la que se creará el contorno.Bord (number, opcional): El grosor del contorno. Por defecto es 1.02.shape.bord( Shape, Bord, Size )Descripción: Crea un borde para una shape generando dos figuras: la shape original escalada a un tamaño (Size) y una versión invertida y más pequeña en su interior, simulando un borde con grosor (Bord).
Argumentos:
Shape (string): La shape a la que se le creará el borde.Bord (number): El grosor del borde.Size (number | table, opcional): El tamaño final de la shape exterior {ancho, alto}.shape.retire( Shape, Index_1, Index_2 )Descripción: Elimina (retira) uno o más segmentos de una shape. Un segmento es cada comando de dibujo (m, l o b) y sus coordenadas correspondientes.
Argumentos:
Shape (string): La shape a modificar.Index_1 (number): El índice del primer segmento a eliminar.Index_2 (number, opcional): Si se proporciona, se elimina el rango de segmentos desde Index_1 hasta Index_2.shape.delete( Shape, Deletes )Descripción: Elimina figuras completas (cada figura empieza con m) de una shape compuesta.
Argumentos:
Shape (string): La shape compuesta.Deletes (number | table | string): Especifica qué figuras eliminar.
number: 2 elimina 1 de cada 2 figuras al azar.table: {1, 3, 5} elimina las figuras 1, 3 y 5. {{2, 4}} elimina el rango de la 2 a la 4."Rand" (por defecto): Elimina 1 de cada 2 figuras al azar.shape.insert( Shape1, Shape2 )Descripción: Función de utilidad avanzada que prepara dos shapes para poder ser interpoladas correctamente, incluso si tienen un número diferente de figuras o segmentos de curva. Añade puntos y segmentos "dummy" a la shape más simple para que ambas tengan una estructura compatible.
Argumentos:
Shape1, Shape2 (string): Las dos shapes a compatibilizar.Devuelve: Dos nuevas shapes (Shape1_modificada, Shape2_modificada) listas para ser usadas en funciones como table.ipol.
shape.point( Shape, Pixel )Descripción: Devuelve una tabla que contiene las coordenadas de todos los puntos que componen una shape. Es fundamental para analizar una figura o aplicar efectos a sus vértices.
Argumentos:
Shape (string): La shape de la cual se extraerán los puntos.Pixel (number, opcional): Si se proporciona, la shape se redibuja primero con este tamaño de segmento para generar más puntos.Devuelve: Una tabla de tablas, donde cada sub-tabla es un punto: {{x=..., y=...}, {x=..., y=...}, ...}.
shape.cut( Shape, t, AddPoint )Descripción: Corta o divide una shape en un punto específico a lo largo de su trayectoria.
Argumentos:
Shape (string): La shape a cortar.t (number | table):
number: El porcentaje (de 0 a 1) a lo largo de la shape donde se hará el corte. Devuelve {shape_inicial, shape_final}.table: {n} divide la shape en n partes iguales y devuelve una tabla con todas las partes.AddPoint (table, opcional): Si se usa el modo tabla, añade un punto central {x, y} a cada segmento para crear un efecto de "explosión".shape.do_shape( Shape1, Shape2, Mode, Split )Descripción: Deforma Shape1 para que siga la trayectoria de Shape2. Es conceptualmente similar a text.do_shape, pero opera entre dos shapes.
Argumentos:
Shape1 (string): La shape que será deformada (el "contenido").Shape2 (string): La shape que define la nueva trayectoria (el "molde").Mode (number): Modo de alineación (1: centrado, 2: de inicio a fin, etc.).Split (number): La precisión de la deformación.Estas funciones están diseñadas para crear movimiento a lo largo de caminos definidos por shapes o funciones paramétricas, y para generar shapes complejas que sirvan como trayectorias.
shape.lmove( Coor, Times, Times2, Accel )Descripción: Lineal Move. Genera un movimiento complejo a lo largo de una serie de puntos, creando una trayectoria con segmentos rectos. La función devuelve un conjunto de tags de posicionamiento (\fscx, \fscy) y \t para animar un objeto a lo largo de esa trayectoria.
Argumentos:
Coor (table): Una tabla de coordenadas {x1, y1, x2, y2, ...}.Times (table, opcional): Una tabla con los tiempos de llegada a cada punto {t1, t2, ...}. Si se omite, los tiempos se calculan proporcionalmente a la distancia entre puntos.Times2 (number | table, opcional): Permite especificar una duración total o un intervalo {t_inicio, t_final}.Accel (number, opcional): La aceleración para las transiciones \t.shape.pmove( F_x, F_y, domainF, t1, t2, Accel, offset_t )Descripción: Parametric Move. Similar a lmove, pero la trayectoria se define mediante funciones paramétricas en lugar de puntos fijos. Esto permite crear movimientos curvos y complejos (círculos, espirales, sinusoides, etc.).
Argumentos:
F_x, F_y (string): Las funciones paramétricas para X e Y en función de una variable s. (ej. "100 * cos(s)").domainF (number | table): El dominio para la variable s. Puede ser un número max_s (el dominio será [0, max_s]) o una tabla {min_s, max_s}.t1, t2 (number): Tiempos de inicio y fin del movimiento.Accel (number, opcional): Aceleración.offset_t (number, opcional): Duración de cada "paso" en la animación.shape.smove( Shape, t1, t2, offset_t, Relative )Descripción: Shape Move. Genera un movimiento que sigue exactamente el contorno de una shape dada.
Argumentos:
Shape (string | table): La shape que define la trayectoria.t1, t2 (number): Tiempos de inicio y fin del movimiento.offset_t (number, opcional): Duración de cada paso.Relative (boolean, opcional): Si es true, la trayectoria es relativa a la posición original del objeto; si no, es absoluta.shape.rmove( Rx, Ry, t1, t2, Accel, offset_t, Counter2 )Descripción: Random Move. Genera un movimiento aleatorio tipo "shake" o vibración.
Argumentos:
Rx, Ry (number | table): La amplitud máxima del movimiento aleatorio en cada eje.t1, t2 (number): Tiempos de inicio y fin.Accel (number, opcional): Aceleración.offset_t (number | table, opcional): Duración de cada "paso" del movimiento.Counter2 (opcional): Un contador adicional para variar la semilla aleatoria.shape.rmove2( Rx, Ry, t, Accel )Descripción: Una variante de rmove que genera un movimiento aleatorio con pausas también aleatorias entre los "shakes".
Argumentos:
Rx, Ry (number): Amplitud del movimiento.t (table, opcional): Una tabla de configuración de tiempos {t_inicio, t_final, dur_paso, dur_shake, dur_pausa}.Accel (number, opcional): Aceleración.shape.rmove3( Rx, Ry, t, Accel, offset_t )Descripción: Aplica rmove en múltiples segmentos de tiempo definidos en una tabla.
Argumentos:
Rx, Ry (number): Amplitud del movimiento.t (table): Una tabla de tiempos {t1_ini, t1_fin, t2_ini, t2_fin, ...}.Accel (number, opcional): Aceleración.offset_t (number, opcional): Duración de cada paso.shape.rmove4( Rx, Ry, t1, t2, Accel, offset_t, move4 )Descripción: Genera un movimiento aleatorio con un "doble shake", superponiendo una vibración secundaria sobre el movimiento principal.
Argumentos:
rmove, más:move4 (table): Una tabla que configura el segundo shake: {dur_paso, amplitud, accel}.shape.omove( P, t1, t2, Dur, Accel )Descripción: Oscillating Move. Genera un movimiento oscilante entre una serie de puntos.
Argumentos:
P (string | table): Los puntos entre los que se oscilará.t1, t2 (number): Tiempos de inicio y fin.Dur (number): La duración de cada ciclo de oscilación.Accel (number, opcional): Aceleración.shape.lineclip( Mode, Dur, Ini )Descripción: Simula un "salto de escena", moviendo un objeto instantáneamente a diferentes posiciones definidas por los puntos de una shape extraída de un \iclip en la línea actual. Crea una serie de líneas de efecto, cada una con una posición diferente.
Argumentos:
Mode (number, opcional): Si se omite, genera tags de movimiento (\fscx\fscy) en una sola línea. Si se proporciona un valor, genera múltiples líneas de efecto (maxloop se ajusta automáticamente), cada una con un \pos.Dur (number, opcional): La duración que el objeto permanecerá en cada posición. Por defecto es frame_dur.Ini (number, opcional): Tiempo de inicio para la primera posición.Estas funciones no mueven un objeto, sino que devuelven una shape que puede ser usada como trayectoria para otras funciones (como shape.smove o text.do_shape).
shape.trajectory( Loop_t, distance_min, distance_max )Descripción: Genera una shape aleatoria con un trazo suave y fluido, compuesta por curvas Bézier.
Argumentos:
Loop_t (number): Número de segmentos de curva a generar.distance_min, distance_max (number): La longitud mínima y máxima de cada segmento.shape.Ltrajectory( length_total, length_curve, height_curve )Descripción: Line Trajectory. Genera una trayectoria de curva suave a lo largo de una línea principalmente horizontal.
Argumentos:
length_total (number): La longitud total de la trayectoria.length_curve (number): La longitud de cada "onda".height_curve (number): La amplitud (altura) de cada "onda".shape.Ctrajectory( Loop_Ct, radius_min, radius_max )Descripción: Circle Trajectory. Genera una trayectoria aleatoria que se mantiene contenida dentro de un área circular.
Argumentos:
Loop_Ct (number): Número de segmentos.radius_min, radius_max (number): El radio mínimo y máximo que puede alcanzar la trayectoria desde su origen.shape.Rtrajectory( Loop_Rt, radius_min, radius_max )Descripción: Random Trajectory. Similar a Ctrajectory pero con un comportamiento más caótico y menos contenido.
Argumentos: Los mismos que Ctrajectory.
shape.Strajectory( Loops_St, Radius )Descripción: Segment Trajectory. Genera una shape aleatoria compuesta únicamente por segmentos de línea recta.
Argumentos:
Loops_St (number): Número de segmentos de línea.Radius (number): La longitud máxima de cada segmento.Estas funciones generan shapes complejas compuestas por múltiples figuras más simples, ideales para fondos, patrones y efectos visuales elaborados.
shape.multi1( Size_shape, Px )Descripción: Crea una serie de cuadrados concéntricos.
Argumentos:
Size_shape (number): El tamaño del cuadrado exterior.Px (number | table): El grosor de cada "anillo" cuadrado. Si es una tabla, se cicla a través de sus valores.shape.multi2( Width, Height, Pixel )Descripción: Rellena un área rectangular con un patrón de diagonales.
Argumentos:
Width, Height (number): Las dimensiones del área a rellenar.Pixel (number | table): El ancho de cada línea diagonal.shape.multi3( Size, Bord, Shape )Descripción: Crea figuras concéntricas a partir de una shape base, similar a multi1 pero para cualquier figura.
Argumentos:
Size (number): El tamaño de la figura exterior.Bord (number | table): El grosor de cada "anillo".Shape (string, opcional): La shape base. Por defecto es shape.circle.shape.multi4( Size, Loop1, Loop2, n )Descripción: Crea un polígono regular (Loop1 lados) y luego crea un arreglo de (Loop2) polígonos más pequeños dentro de cada lado, repitiendo el proceso (n) veces hacia el centro. Genera patrones tipo "mandala" o geométricos complejos.
Argumentos:
Size (number): El tamaño del polígono exterior.Loop1 (number): Número de lados del polígono principal.Loop2 (number): Número de sub-polígonos por lado.n (number): Número de "capas" concéntricas a generar.shape.multi5( Shapes, Width, Height, Dxy )Descripción: Crea un arreglo matricial (cuadrícula) rellenando un área rectangular con una o más shapes.
Argumentos:
Shapes (string | table): La shape o tabla de shapes a usar para rellenar.Width, Height (number): El tamaño del área a rellenar.Dxy (table, opcional): El espaciado {x, y} entre cada figura.shape.multi6( Size, Bord, Part )Descripción: Crea el perímetro de un cuadrado dividido en rectángulos individuales.
Argumentos:
Size (number): El tamaño del cuadrado.Bord (number): El grosor del perímetro.Part (number): El número de rectángulos que compondrán el perímetro.shape.multi7( Part, Radius )Descripción: Crea un círculo o un anillo circular compuesto por segmentos individuales.
Argumentos:
Part (number): El número de segmentos en los que se dividirá el círculo.Radius (number | table): El radio del círculo. Si es una tabla {r1, r2, ...}, crea anillos concéntricos.shape.multi8( Shape, Size_ini, Size_fin, Loop )Descripción: Crea una serie de shapes concéntricas interpolando su tamaño desde un valor inicial a uno final.
Argumentos:
Shape (string): La shape base.Size_ini, Size_fin (number): Tamaño inicial y final.Loop (number): El número de pasos (figuras) en la interpolación.shape.multi9( Shape, Loop, Tags, Vertical )Descripción: Repite una shape varias veces en una sola línea de efecto, aplicando un conjunto de tags diferente a cada repetición. Es extremadamente útil para crear "trails" (estelas) o conjuntos de objetos con propiedades distintas.
Argumentos:
Shape (string | function): La shape a repetir. Si es una función, se llama para cada repetición.Loop (number): El número de repeticiones.Tags (table): Una tabla de strings de tags que se aplicarán cíclicamente a cada repetición.Vertical (boolean, opcional): Si es true, inserta un \N para apilar las shapes verticalmente.shape.array( Shape, loops, Angle_or_mode, Dxy )Descripción: Una función general para crear arreglos de shapes. Puede generar arreglos lineales, radiales, rectangulares o a lo largo de otra shape.
Argumentos:
Shape (string | table): La shape o shapes base para el arreglo.loops (number | table): Número de repeticiones. {filas, columnas} para arreglos rectangulares.Angle_or_mode (number | string | table):
number: Ángulo para un arreglo lineal.string: Modo. "radial", "radial2" (alternado), "radial3", "array" (rectangular), "shape", "shape2" (alternado).table: {angulo_array, angulo_shape}.Dxy (number | string | table): Distancia/espaciado.
number: Distancia lineal o radio.string: shape para el modo "shape".table: {dist_x, dist_y} o {radio_ini, radio_fin, arco, angulo_ini}.shape.from_audio( Audio_wav, Width, Height_scale, Thickness, Offset_time )Descripción: Genera un espectrograma (la forma de onda) de un archivo de audio .wav y lo devuelve como una shape. Crea una serie de líneas de efecto, cada una representando un pequeño segmento de tiempo del audio.
Argumentos:
Audio_wav (string): El nombre del archivo .wav (debe estar en la misma carpeta que el script).Width (number): El ancho del espectrograma.Height_scale (number): Un factor para escalar la amplitud (altura) de la onda.Thickness (number): El grosor de la línea de la onda.Offset_time (number): Un desfase de tiempo en milisegundos.shape.fusion( Shapes, Tags )Descripción: Fusiona una tabla de shapes individuales en una sola shape compuesta, ajustando sus posiciones para que no se superpongan y aplicando opcionalmente tags a cada una.
Argumentos:
Shapes (table): La tabla de shapes a fusionar.Tags (table, opcional): Tags a aplicar a cada shape.Estas funciones operan a un nivel más fundamental, ya sea convirtiendo shapes en sus representaciones de píxeles o realizando manipulaciones de bajo nivel sobre su estructura.
shape.to_pixels( Shape, Shape2, Seed, Filter, Table )Descripción: Convierte el relleno de una shape en una serie de píxeles individuales, cada uno como un objeto en un bucle (loop).
Argumentos:
Shape (string): La shape a pixelar.Shape2 (string, opcional): La shape que se usará para cada píxel (por defecto, un cuadrado de 1x1).Seed (number, opcional): Un valor para aleatorizar la aparición de píxeles. Seed=5 significa que solo aparecerá 1 de cada 5 píxeles, al azar.Filter (function, opcional): Una función para aplicar transformaciones a cada píxel individualmente.Table (boolean, opcional): Si es true, devuelve una tabla con los datos de los píxeles en lugar de generar las líneas de efecto.shape.bord_to_pixels( Shape, Shape2, Pixel, Seed, Filter )Descripción: Similar a to_pixels, pero en lugar del relleno, convierte el borde de la shape en píxeles.
Argumentos:
Shape, Shape2, Seed, Filter: Mismos que en to_pixels.Pixel (number, opcional): El tamaño de los segmentos de línea a usar para generar los puntos del borde.shape.morphism( Size, Shape1, Shape2, Accel )Descripción: Crea una animación de "morphing" (metamorfosis) entre dos shapes. Devuelve una tabla de shapes que representan los pasos intermedios de la transformación.
Argumentos:
Size (number): El número de pasos (frames) de la animación.Shape1, Shape2 (string): Las shapes de inicio y fin.Accel (number | string, opcional): La aceleración de la interpolación.shape.trim( Shape, Lines, Mark, Ratio )Descripción: Recorta una shape usando una o más líneas de corte. Devuelve una tabla con las shapes resultantes de la división.
Argumentos:
Shape (string): La shape a cortar.Lines (table): Una tabla de shapes de línea que actuarán como cuchillas de corte.Mark (number | string | table, opcional): Una shape o marcador para visualizar los límites.Ratio (number, opcional): Escala aplicada a las coordenadas antes de cortar.shape.gridr( Width, Height, Mode, Filter, Align, Lines )Descripción: Grid Rectangle. Genera una shape de píxeles que representa un rectángulo. A diferencia de shape.grid, no se basa en una shape de entrada, sino que crea un rectángulo desde cero. Es ideal para crear fondos pixelados o efectos de matriz.
Argumentos:
Width, Height (number): Ancho y alto del rectángulo en píxeles.Mode (string, opcional): Modo de renderizado: "h" (barras horizontales), "v" (barras verticales), o nil (cuadrícula).Filter (function | string): Función para colorear cada píxel o nombre de un archivo de imagen .bmp.Align (number, opcional): Alineación de la imagen si se usa como filtro.Lines (number | table, opcional): Si se proporciona, divide la salida en múltiples líneas de efecto.shape.setclip( Set_clips, Set_tagfx, Indx_line )Descripción: Un efecto avanzado que aplica diferentes conjuntos de tags (Set_tagfx) a los objetos que se encuentren dentro de diferentes áreas de recorte (Set_clips). La función genera automáticamente el bucle y las líneas de efecto necesarias.
Argumentos:
Set_clips (table): Una tabla de \clip strings (vectoriales o rectangulares).Set_tagfx (table): Una tabla de strings de tags, una para cada clip.Indx_line (table, opcional): Índices de las líneas a las que se aplica el efecto.shape.animated( dur, frame_duration, Shapes, Pscale, Random )Descripción: Crea una animación "frame a frame" ciclando a través de una tabla de shapes.
Argumentos:
dur (number): Duración total de la animación.frame_duration (number): Duración de cada "frame" (cada shape).Shapes (table): La tabla de shapes a ciclar.Pscale (string | number): El tag de escala a usar (ej. \p1).Random (boolean): Si es true, muestra las shapes en orden aleatorio en lugar de secuencial.shape.divide( Shape, Mark )Descripción: Toma una shape compuesta (con múltiples comandos m) y la divide en una tabla de shapes individuales.
Argumentos:
Shape (string): La shape a dividir.Mark (string | number | table, opcional): Si se proporciona, añade una shape de "marco" a cada una de las figuras resultantes para definir sus límites.shape.deformed( Shape, Deformed, Pixel, Axis )Descripción: Aplica una deformación de onda sinusoidal a los puntos de una shape.
Argumentos:
Shape (string): La shape a deformar.Deformed (number): La frecuencia de la onda.Pixel (number): La amplitud de la onda en píxeles.Axis (string): El eje de la deformación: 'x', 'y', o 'xy'.shape.deformed2( Shape, Defor_x, Defor_y )Descripción: Aplica una deformación aleatoria a los puntos internos de una shape compuesta, creando un efecto de "ruido", irregularidad o distorsión. No afecta a los puntos del contorno exterior.
Argumentos:
Shape (string): La shape a deformar.Defor_x, Defor_y (number): La amplitud máxima de la deformación aleatoria en cada eje.Descripción: Aplica una o más funciones de filtro a cada sub-figura (cada m ...) de una shape compuesta. A diferencia de shape.filter que opera en puntos, esta función opera sobre shapes enteras, permitiendo modificar cada parte de forma individual dentro de un bucle.
shape.filtershape( Shape, ... )Argumentos:
Shape (string): La shape compuesta.... (function): Una o más funciones de filtro. Cada función recibe la shape de la sub-figura actual (shp) y debe devolver la shape modificada. Dentro del filtro, se tiene acceso a la variable Si (el índice de la sub-figura).Ejemplo de Uso:
-- En un Template [Shape]
-- 'mi_mosaico' es una shape compuesta de muchos cuadrados.
-- Esta función rota cada cuadrado según su índice.
local filtro_rotacion = function(shp)
return shape.rotate(shp, Si * 10, "center")
end
return shape.filtershape(mi_mosaico, filtro_rotacion)