Interface: IRenderer
Thin scene-graph + per-camera draw. Knows nothing about what's drawn at each node — drawables live behind capability interfaces (ISpriteRenderer etc.); render systems acquire the capabilities they need or no-op if absent. Engine calls RenderCamera once per active camera per frame; no cameras = nothing drawn.
Coordinate contract (Unity / Cocos convention) — every backend implements it as given and does any axis conversion internally; systems never flip anything:
- World and node-local space are +y UP. Positive rotation is counter-clockwise.
- Anchors (sprite / text / video) are fractions of the rect from its bottom-left: anchorY 0 = bottom edge, 1 = top edge. The node origin sits at the anchor point.
- Hit areas, mask shapes, graphics shapes and debug drawing use those same y-up coords.
- Screen-space values — canvas pixels, viewport rects, pointer events — stay top-left origin, +y down, like the DOM. A y-down backend (Pixi) flips its view once and counter-flips image-like drawables; a backend that is natively y-up has nothing to convert.
Methods
AttachResource()
ts
AttachResource(nodeId, handle): void;Parameters
| Parameter | Type |
|---|---|
nodeId | number |
handle | number |
Returns
void
BeginFrame()
ts
BeginFrame(): void;Returns
void
CreateNode()
ts
CreateNode(id): void;Parameters
| Parameter | Type |
|---|---|
id | number |
Returns
void
DestroyNode()
ts
DestroyNode(id): void;Parameters
| Parameter | Type |
|---|---|
id | number |
Returns
void
DetachResource()
ts
DetachResource(nodeId, handle): void;Parameters
| Parameter | Type |
|---|---|
nodeId | number |
handle | number |
Returns
void
EndFrame()
ts
EndFrame(): void;Returns
void
GetCanvas()
ts
GetCanvas(): HTMLCanvasElement;Returns
HTMLCanvasElement
GetCapability()
ts
GetCapability<T>(capability): T | null;Type Parameters
| Type Parameter |
|---|
T |
Parameters
| Parameter | Type |
|---|---|
capability | RendererCapability<T> |
Returns
T | null
HitTestNode()?
ts
optional HitTestNode(screenX, screenY): number | null;The topmost interactive node at a canvas pixel (as the last rendered frame drew it), or null. Optional — Game.input.IsPointerOverUI uses it.
Parameters
| Parameter | Type |
|---|---|
screenX | number |
screenY | number |
Returns
number | null
Init()
ts
Init(rendererData): Promise<boolean>;Parameters
| Parameter | Type |
|---|---|
rendererData | RendererData |
Returns
Promise<boolean>
IsInitialized()
ts
IsInitialized(): boolean;Returns
boolean
OnNodeInteraction()
ts
OnNodeInteraction(callback): () => void;Parameters
| Parameter | Type |
|---|---|
callback | (event) => void |
Returns
() => void
RenderCamera()
ts
RenderCamera(config): void;Per pass: viewport → clear → view+projection → layer culling → draw. Restore visibility so the next pass starts clean. With config.targetTexture the pass draws into that loaded render texture, leaving out drawables that show the same texture (no feedback loop).
Parameters
| Parameter | Type |
|---|---|
config | CameraConfig |
Returns
void
Resize()
ts
Resize(
width,
height,
resolution?
): void;Resize the underlying drawable surface. Cameras and Fit-mode canvas scaling pick up the new dimensions on the next frame. Resolution (devicePixelRatio for crispness) is optional.
Parameters
| Parameter | Type |
|---|---|
width | number |
height | number |
resolution? | number |
Returns
void
SetNodeAlpha()
ts
SetNodeAlpha(id, alpha): void;0..1, applied after visibility — alpha=0 is still hit-testable. Default 1.
Parameters
| Parameter | Type |
|---|---|
id | number |
alpha | number |
Returns
void
SetNodeHitArea()
ts
SetNodeHitArea(id, rect): void;node-local rect; null reverts to bounds-derived hit testing.
Parameters
| Parameter | Type |
|---|---|
id | number |
rect | | { height: number; width: number; x: number; y: number; } | null |
Returns
void
SetNodeInteractive()
ts
SetNodeInteractive(id, interactive): void;Default new nodes are non-interactive.
Parameters
| Parameter | Type |
|---|---|
id | number |
interactive | boolean |
Returns
void
SetNodeLayer()
ts
SetNodeLayer(id, layer): void;Parameters
| Parameter | Type |
|---|---|
id | number |
layer | number |
Returns
void
SetNodeMask()
ts
SetNodeMask(
targetNodeId,
maskSourceNodeId,
inverted?
): void;Clips targetNodeId by the FIRST resource on maskSourceNodeId. Graphics → stencil mask; Sprite → alpha mask. inverted flips interior/exterior. Pixi Canvas backend ignores inversion on stencil masks (warns).
Parameters
| Parameter | Type |
|---|---|
targetNodeId | number |
maskSourceNodeId | number | null |
inverted? | boolean |
Returns
void
SetNodeOrder()
ts
SetNodeOrder(id, order): void;Draw-order index within the renderer's flat stage. Lower draws first (behind). HierarchySystem assigns these from a DFS of the logical tree so children render above their parent's prior siblings. Only pushed when the hierarchy changes.
Parameters
| Parameter | Type |
|---|---|
id | number |
order | number |
Returns
void
SetNodeParent()
ts
SetNodeParent(id, parentId): void;Parameters
| Parameter | Type |
|---|---|
id | number |
parentId | number | null |
Returns
void
SetNodePivot()
ts
SetNodePivot(
id,
pivotX,
pivotY
): void;Pivot offset in node-local pixels. Backends without a node-pivot concept can no-op.
Parameters
| Parameter | Type |
|---|---|
id | number |
pivotX | number |
pivotY | number |
Returns
void
SetNodeTransform()
ts
SetNodeTransform(
id,
x,
y,
rotation,
scaleX,
scaleY
): void;Parameters
| Parameter | Type |
|---|---|
id | number |
x | number |
y | number |
rotation | number |
scaleX | number |
scaleY | number |
Returns
void
SetNodeVisibility()
ts
SetNodeVisibility(id, visible): void;Parameters
| Parameter | Type |
|---|---|
id | number |
visible | boolean |
Returns
void
SetResourceVisible()
ts
SetResourceVisible(handle, visible): void;Shows / hides one drawable without touching its node (the entity's other drawables, children and transform are unaffected). Render systems use it for disabled components.
Parameters
| Parameter | Type |
|---|---|
handle | number |
visible | boolean |
Returns
void
Shutdown()
ts
Shutdown(): Promise<void>;Returns
Promise<void>