Skip to content

visual

Un motor de dibujo 2D al estilo de PixiJS. Construye un grafo de escena con formas y lo dibuja a través de uno de tres motores traseros (Canvas2D, WebGL o WebGPU), elegido en tiempo de ejecución.

El motor está por capas: Application (ciclo de vida y bucle de dibujado), debajo Renderer (el motor trasero), y luego un grafo de escena que va de Container (un grupo) a Graphics (algo dibujable). Tú añades nodos a app.stage y el renderizador los pinta.

Solo navegador. ranuts/visual necesita un HTMLCanvasElement real y un contexto de GPU o de Canvas. En Node no puede correr.

Importar

js
import { Application, Graphics, Container } from 'ranuts/visual';

Primeros pasos

Crea una aplicación, dibuja un rectángulo con relleno y contorno más un círculo, y arranca el bucle de dibujado.

js
import { Application, Graphics, RENDERER_TYPE } from 'ranuts/visual';

const view = document.querySelector('canvas');

// Application.create es asíncrona: el motor trasero de WebGPU inicializa su dispositivo
// de forma asíncrona y tiene que terminar antes del primer dibujado.
const app = await Application.create({
  view,
  prefer: RENDERER_TYPE.CANVAS, // CANVAS | WEB_GL | WEB_GPU
  backgroundColor: '#1e1e1e',
});

// Un rectángulo: relleno rojo y contorno azul de 4px.
const rect = new Graphics();
rect.beginFill('#ff0000');
rect.lineStyle(4, '#0000ff');
rect.drawRect(20, 20, 160, 100);
rect.endFill();

// Un círculo.
const circle = new Graphics();
circle.beginFill('#00cc88', 0.8);
circle.drawCircle(300, 120, 60);
circle.endFill();

// Añade los dibujables al stage, el antepasado de todo lo que se pinta.
app.stage.addChild(rect);
app.stage.addChild(circle);

// Arranca el bucle de requestAnimationFrame (o llama a app.render() para un solo fotograma).
app.start();

API

Application

El punto de entrada del motor. Es dueño del canvas, del renderizador y de la raíz del grafo de escena (stage).

Usa la fábrica asíncrona Application.create(...) antes que new Application(...): el motor trasero de WebGPU inicializa su dispositivo de forma asíncrona y eso tiene que terminar antes del primer dibujado. Canvas y WebGL resuelven al instante, así que la fábrica es segura y uniforme para los tres.

Application.create(options)

static async. Construye una Application y espera a que termine la inicialización asíncrona del renderizador.

Parámetros
ParámetroDescripciónTipoPor defecto
optionsOpciones de configuración de la aplicaciónIApplicationOptionsObligatorio
Devuelve
ValorDescripciónTipo
Promise<Application>La aplicación ya inicializadaPromise<Application>

Properties

PropiedadDescripciónTipo
stageLa raíz del grafo de escena. Añade aquí todo nodo que quieras ver pintado.Container
viewEl elemento canvas en el que se pinta.HTMLCanvasElement
eventSystemEl reparto de punteros y eventos, atado al canvas y al stage.EventSystem

Methods

MétodoDescripciónDevuelve
render()Pinta un solo fotograma de stage.void
start()Arranca el bucle de dibujado con requestAnimationFrame.void
stop()Detiene el bucle de dibujado que arrancó start().void

IApplicationOptions

CampoDescripciónTipoPor defecto
preferQué motor trasero usar. Si se omite, recae en Canvas.RENDERER_TYPERENDERER_TYPE.CANVAS
viewEl canvas de destino. Si se omite, se crea un <canvas> suelto.HTMLCanvasElementun canvas nuevo
backgroundColorEl fondo del canvas. Acepta cualquier cadena de color CSS.string
backgroundAlphaOpacidad del fondo, de 0 a 1.number
debugEscribe en la consola qué motor trasero se eligió.booleanfalse

Container

Un nodo de agrupación, la idea de «grupo» del grafo de escena. Guarda hijos y el estado de transformación, pero él mismo no pinta nada; los dibujables como Graphics lo extienden. Añade un Container para armar subárboles que se muevan, escalen y roten juntos.

Methods

MétodoDescripciónDevuelve
addChild(child)Añade un hijo (Container) al final. Si ya tenía padre, se lo cambia.void
removeChild(child)Quita un hijo de children.void
sortChildren()Reordena children por zIndex (solo cuando hace falta).void
containsPoint(p)Comprueba si un Point cae dentro del hitArea de este nodo.boolean

Propiedades de transformación y presentación

Viven en el nodo base común (Vertex) y están disponibles en cualquier Container o Graphics.

PropiedadDescripciónTipo
childrenLos nodos hijos (array de solo lectura).Container[]
parentEl nodo padre, si está enganchado.Container | undefined
x / yLa posición, en el sistema de coordenadas del padre.number
positionEl punto de posición ({ x, y }).ObservablePoint
scaleEl punto de escala ({ x, y }).ObservablePoint
pivotEl punto de pivote para giro y escala.ObservablePoint
skewEl punto de sesgo.ObservablePoint
rotationGiro en radianes.number
angleGiro en grados (va a la par de rotation).number
alphaOpacidad del nodo, de 0 a 1 (se multiplica al bajar por el árbol).number
visibleCon false, el nodo y su subárbol se saltan.boolean
zIndexEl orden de dibujado entre hermanos.number
hitAreaForma opcional para las comprobaciones de impacto.Shape | null
cursorEl aspecto del cursor al apuntar al nodo.Cursor
structureVersionVersión de la estructura de escena (solo en la raíz); guía el seguimiento de lo que cambió.number

Graphics

Un dibujable que extiende Container. Fija un relleno, un estilo de línea o ambos, y luego llama a un método de forma. Casi todos los métodos devuelven this, así que las llamadas se encadenan.

Estilo

MétodoDescripciónDevuelve
beginFill(color?, alpha?)Empieza a rellenar con color (cadena CSS, por defecto '#000000') y alpha (por defecto 1).Graphics
endFill()Deja de rellenar.Graphics
lineStyle(width, color?, alpha?)Fija el contorno: width px, color (por defecto '#000000'), alpha (por defecto 1).Graphics
lineStyle(options)Fija el contorno a partir de un objeto ILineStyleOptions.Graphics
resetLineStyle()Devuelve el contorno actual a sus valores por defecto.void

Formas

MétodoDescripciónDevuelve
drawRect(x, y, width, height)Rectángulo.Graphics
drawRoundedRect(x, y, width, height, radius)Rectángulo de esquinas redondeadas.Graphics
drawCircle(x, y, radius)Círculo centrado en (x, y).Graphics
drawEllipse(x, y, radiusX, radiusY)Elipse centrada en (x, y).Graphics
drawPolygon(points)Polígono cerrado a partir de un array llano [x0, y0, x1, y1, …].Graphics

Trazados

MétodoDescripciónDevuelve
moveTo(x, y)Empieza un subtrazado nuevo en (x, y).Graphics
lineTo(x, y)Línea recta hasta (x, y).Graphics
quadraticCurveTo(cpX, cpY, toX, toY)Curva de Bézier cuadrática (se trocea en segmentos).Graphics
bezierCurveTo(cpX, cpY, cpX2, cpY2, toX, toY)Curva de Bézier cúbica (se trocea en segmentos).Graphics
arc(cx, cy, radius, startAngle, endAngle, anticlockwise?)Arco de circunferencia.Graphics
arcTo(x1, y1, x2, y2, radius)Arco tangente a las dos rectas que pasan por los puntos de control.Graphics
closePath()Cierra el subtrazado actual.Graphics
clear()Borra toda la geometría y devuelve los estilos a su estado inicial.Graphics
containsPoint(p)Comprueba si un Point cae dentro de la geometría dibujada.boolean

IFillStyleOptions

CampoDescripciónTipoPor defecto
colorColor de relleno (cualquier color CSS).string'#ffffff'
alphaOpacidad del relleno, de 0 a 1.number1
visibleSi el relleno se dibuja o no.booleanfalse

ILineStyleOptions

Extiende IFillStyleOptions y añade:

CampoDescripciónTipoPor defecto
widthGrosor del contorno, en px.number0
capEl remate de las líneas.LINE_CAPLINE_CAP.BUTT
joinLa unión entre líneas.LINE_JOINLINE_JOIN.MITER

Enumeraciones

RENDERER_TYPE

Elige el motor trasero de dibujado a través de IApplicationOptions.prefer.

MiembroValorDescripción
CANVAS'canvas'Motor trasero Canvas2D (el de por defecto).
WEB_GL'webgl'Motor trasero WebGL.
WEB_GPU'webgpu'Motor trasero WebGPU.

SHAPE_TYPE

Las clases de forma que producen los métodos de dibujo de Graphics.

MiembroValor
RECTANGLE'rectangle'
POLYGON'polygon'
CIRCLE'circle'
ELLIPSE'ellipse'
ROUNDED_RECTANGLE'rounded rectangle'

LINE_CAP

MiembroValor
BUTT'butt'
ROUND'round'
SQUARE'square'

LINE_JOIN

MiembroValor
MITER'miter'
BEVEL'bevel'
ROUND'round'

Constantes

ConstanteValorDescripción
MAX_VERTEX_COUNT65536Número máximo de vértices que admite cada búfer de lote.
BYTES_PER_VERTEX12Bytes por vértice (2 Float32 de posición y 4 Uint8 de color).

Motores traseros

El motor trasero se elige con IApplicationOptions.prefer (un RENDERER_TYPE); si se omite, se usa Canvas.

  • CANVAS dibuja directamente con la API de Canvas2D (fillRect, arc, ctx.stroke(), …).
  • WEB_GL y WEB_GPU comparten una misma tubería BatchRenderer: las formas se trocean en triángulos, se empaquetan en un único búfer de vértices entrelazado y se dibujan de una sola llamada.

Los tres aceptan cualquier color CSS: hexadecimal (#rgb o #rrggbb), colores con nombre, rgb() y hsl() se resuelven todos igual.

La geometría del contorno cambia según el motor trasero, y es a propósito. En Canvas, los remates y las uniones de línea los dibuja el ctx.stroke() nativo del navegador; en WebGL y WebGPU, una triangulación propia. Los dos no coinciden píxel a píxel.

Publicado bajo la licencia MIT.