Skip to content

visual

Eine 2D-Rendermaschine nach Art von PixiJS. Bau einen Szenengraph aus Formen und lass ihn über eines von drei Backends zeichnen (Canvas2D, WebGL oder WebGPU), zur Laufzeit gewählt.

Die Maschine ist geschichtet: Application (Lebenszyklus und Zeichenschleife), darunter Renderer (das Backend), darunter ein Szenengraph von Container (einer Gruppe) bis Graphics (etwas Zeichenbarem). Du hängst Knoten an app.stage, und der Renderer zeichnet sie.

Nur für den Browser. ranuts/visual braucht ein echtes HTMLCanvasElement und einen GPU- oder Canvas-Kontext. In Node läuft es nicht.

Import

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

Schnellstart

Eine Anwendung erzeugen, ein gefülltes und umrandetes Rechteck sowie einen Kreis zeichnen und die Zeichenschleife starten.

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

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

// Application.create ist asynchron: Das WebGPU-Backend richtet sein Gerät
// asynchron ein, und das muss vor dem ersten Zeichnen fertig sein.
const app = await Application.create({
  view,
  prefer: RENDERER_TYPE.CANVAS, // CANVAS | WEB_GL | WEB_GPU
  backgroundColor: '#1e1e1e',
});

// Ein Rechteck: rote Füllung und eine 4px breite blaue Kontur.
const rect = new Graphics();
rect.beginFill('#ff0000');
rect.lineStyle(4, '#0000ff');
rect.drawRect(20, 20, 160, 100);
rect.endFill();

// Ein Kreis.
const circle = new Graphics();
circle.beginFill('#00cc88', 0.8);
circle.drawCircle(300, 120, 60);
circle.endFill();

// Zeichenbares an die stage hängen – den Vorfahren von allem, was gezeichnet wird.
app.stage.addChild(rect);
app.stage.addChild(circle);

// Die requestAnimationFrame-Schleife starten (oder app.render() für ein einzelnes Bild aufrufen).
app.start();

API

Application

Der Einstiegspunkt der Maschine. Ihm gehören das Canvas, der Renderer und die Wurzel des Szenengraphs (stage).

Nimm lieber die asynchrone Fabrik Application.create(...) als new Application(...): Das WebGPU-Backend richtet sein Gerät asynchron ein, und das muss vor dem ersten Zeichnen fertig sein. Canvas und WebGL lösen sofort auf, die Fabrik ist also für alle Backends sicher und einheitlich.

Application.create(options)

static async. Baut eine Application und wartet die asynchrone Einrichtung des Renderers ab.

Parameter
ParameterBeschreibungTypStandard
optionsEinstellungen für die AnwendungIApplicationOptionsErforderlich
Rückgabe
WertBeschreibungTyp
Promise<Application>Die fertig eingerichtete AnwendungPromise<Application>

Properties

EigenschaftBeschreibungTyp
stageDie Wurzel des Szenengraphs. Häng hier jeden Knoten an, der gezeichnet werden soll.Container
viewDas Canvas-Element, in das gezeichnet wird.HTMLCanvasElement
eventSystemDie Verteilung von Zeiger- und anderen Ereignissen, gebunden an Canvas und stage.EventSystem

Methods

MethodeBeschreibungRückgabe
render()Zeichnet ein einzelnes Bild von stage.void
start()Startet die Zeichenschleife über requestAnimationFrame.void
stop()Beendet die Zeichenschleife, die start() begonnen hat.void

IApplicationOptions

FeldBeschreibungTypStandard
preferWelches Backend genommen wird. Ohne Angabe fällt es auf Canvas zurück.RENDERER_TYPERENDERER_TYPE.CANVAS
viewDas Ziel-Canvas. Ohne Angabe wird ein loses <canvas> erzeugt.HTMLCanvasElementein neues Canvas
backgroundColorDer Hintergrund des Canvas. Nimmt jede CSS-Farbzeichenkette an.string
backgroundAlphaDeckkraft des Hintergrunds, 0 bis 1.number
debugSchreibt das gewählte Zeichen-Backend in die Konsole.booleanfalse

Container

Ein Gruppenknoten – der Begriff „Gruppe“ des Szenengraphs. Er hält Kinder und den Zustand der Transformation, zeichnet selbst aber nichts; Zeichenbares wie Graphics erweitert ihn. Nimm einen Container, um Teilbäume zu bauen, die sich gemeinsam bewegen, skalieren und drehen.

Methods

MethodeBeschreibungRückgabe
addChild(child)Hängt ein Kind (Container) hinten an. Hatte es schon einen Elternknoten, wird es umgehängt.void
removeChild(child)Nimmt ein Kind aus children heraus.void
sortChildren()Sortiert children neu nach zIndex (nur wenn nötig).void
containsPoint(p)Prüft, ob ein Point in die hitArea dieses Knotens fällt.boolean

Eigenschaften für Transformation und Darstellung

Sie sitzen am gemeinsamen Basisknoten (Vertex) und stehen an jedem Container und jeder Graphics zur Verfügung.

EigenschaftBeschreibungTyp
childrenDie Kindknoten (nur lesbares Array).Container[]
parentDer Elternknoten, sofern angehängt.Container | undefined
x / yDie Position, im Koordinatenraum des Elternknotens.number
positionDer Punkt der Position ({ x, y }).ObservablePoint
scaleDer Punkt der Skalierung ({ x, y }).ObservablePoint
pivotDer Drehpunkt für Drehung und Skalierung.ObservablePoint
skewDer Punkt der Scherung.ObservablePoint
rotationDrehung im Bogenmaß.number
angleDrehung in Grad (läuft mit rotation mit).number
alphaDeckkraft des Knotens, 0 bis 1 (multipliziert sich den Baum hinab).number
visibleBei false werden der Knoten und sein Teilbaum übersprungen.boolean
zIndexDie Zeichenreihenfolge unter Geschwistern.number
hitAreaEine wahlweise Form für die Trefferprüfung.Shape | null
cursorDie Gestalt des Zeigers, wenn er auf den Knoten zeigt.Cursor
structureVersionVersion der Szenenstruktur (nur an der Wurzel); steuert das Verfolgen von Änderungen.number

Graphics

Etwas Zeichenbares, das Container erweitert. Setz eine Füllung, einen Linienstil oder beides und ruf dann eine Formmethode auf. Die meisten Methoden geben this zurück, Aufrufe lassen sich also verketten.

Stil

MethodeBeschreibungRückgabe
beginFill(color?, alpha?)Beginnt die Füllung mit color (CSS-Zeichenkette, voreingestellt '#000000') und alpha (voreingestellt 1).Graphics
endFill()Beendet die Füllung.Graphics
lineStyle(width, color?, alpha?)Legt die Kontur fest: width px, color (voreingestellt '#000000'), alpha (voreingestellt 1).Graphics
lineStyle(options)Legt die Kontur anhand eines ILineStyleOptions-Objekts fest.Graphics
resetLineStyle()Setzt die aktuelle Kontur auf die Voreinstellungen zurück.void

Formen

MethodeBeschreibungRückgabe
drawRect(x, y, width, height)Rechteck.Graphics
drawRoundedRect(x, y, width, height, radius)Rechteck mit runden Ecken.Graphics
drawCircle(x, y, radius)Kreis mit Mittelpunkt (x, y).Graphics
drawEllipse(x, y, radiusX, radiusY)Ellipse mit Mittelpunkt (x, y).Graphics
drawPolygon(points)Geschlossenes Vieleck aus einem flachen Array [x0, y0, x1, y1, …].Graphics

Pfade

MethodeBeschreibungRückgabe
moveTo(x, y)Beginnt bei (x, y) einen neuen Teilpfad.Graphics
lineTo(x, y)Gerade Linie bis (x, y).Graphics
quadraticCurveTo(cpX, cpY, toX, toY)Quadratische Bézierkurve (in Abschnitte zerlegt).Graphics
bezierCurveTo(cpX, cpY, cpX2, cpY2, toX, toY)Kubische Bézierkurve (in Abschnitte zerlegt).Graphics
arc(cx, cy, radius, startAngle, endAngle, anticlockwise?)Kreisbogen.Graphics
arcTo(x1, y1, x2, y2, radius)Bogen, der die beiden Geraden durch die Kontrollpunkte berührt.Graphics
closePath()Schließt den aktuellen Teilpfad.Graphics
clear()Verwirft die gesamte Geometrie und setzt die Stile zurück.Graphics
containsPoint(p)Prüft, ob ein Point in die gezeichnete Geometrie fällt.boolean

IFillStyleOptions

FeldBeschreibungTypStandard
colorFarbe der Füllung (jede CSS-Farbe).string'#ffffff'
alphaDeckkraft der Füllung, 0 bis 1.number1
visibleOb die Füllung gezeichnet wird.booleanfalse

ILineStyleOptions

Erweitert IFillStyleOptions und fügt hinzu:

FeldBeschreibungTypStandard
widthBreite der Kontur in px.number0
capDie Form der Linienenden.LINE_CAPLINE_CAP.BUTT
joinDie Form der Linienverbindungen.LINE_JOINLINE_JOIN.MITER

Aufzählungen

RENDERER_TYPE

Wählt über IApplicationOptions.prefer das Backend zum Zeichnen.

ElementWertBeschreibung
CANVAS'canvas'Canvas2D-Backend (voreingestellt).
WEB_GL'webgl'WebGL-Backend.
WEB_GPU'webgpu'WebGPU-Backend.

SHAPE_TYPE

Die Formarten, die die Zeichenmethoden von Graphics hervorbringen.

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

LINE_CAP

ElementWert
BUTT'butt'
ROUND'round'
SQUARE'square'

LINE_JOIN

ElementWert
MITER'miter'
BEVEL'bevel'
ROUND'round'

Konstanten

KonstanteWertBeschreibung
MAX_VERTEX_COUNT65536Höchstzahl der Vertices je Stapelpuffer.
BYTES_PER_VERTEX12Bytes je Vertex (2 Float32 für die Position und 4 Uint8 für die Farbe).

Backends

Das Backend wird über IApplicationOptions.prefer gewählt (ein RENDERER_TYPE); lässt du es weg, wird Canvas genommen.

  • CANVAS zeichnet unmittelbar über die Canvas2D-API (fillRect, arc, ctx.stroke(), …).
  • WEB_GL und WEB_GPU teilen sich eine BatchRenderer-Strecke: Formen werden in Dreiecke zerlegt, in einen einzigen verschränkten Vertexpuffer gepackt und mit einem Aufruf gezeichnet.

Alle drei nehmen jede CSS-Farbe an: hexadezimal (#rgb oder #rrggbb), benannte Farben, rgb() und hsl() werden gleichermaßen aufgelöst.

Die Geometrie der Kontur unterscheidet sich je nach Backend – mit Absicht. Linienenden und -verbindungen zeichnet auf dem Canvas-Backend das native ctx.stroke() des Browsers, auf WebGL und WebGPU dagegen eine eigene Zerlegung in Dreiecke. Pixelgleich sind die beiden nicht.

Veröffentlicht unter der MIT-Lizenz.