Skip to content

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 ​

ParameterType
nodeIdnumber
handlenumber

Returns ​

void


BeginFrame() ​

ts
BeginFrame(): void;

Returns ​

void


CreateNode() ​

ts
CreateNode(id): void;

Parameters ​

ParameterType
idnumber

Returns ​

void


DestroyNode() ​

ts
DestroyNode(id): void;

Parameters ​

ParameterType
idnumber

Returns ​

void


DetachResource() ​

ts
DetachResource(nodeId, handle): void;

Parameters ​

ParameterType
nodeIdnumber
handlenumber

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 ​

ParameterType
capabilityRendererCapability<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 ​

ParameterType
screenXnumber
screenYnumber

Returns ​

number | null


Init() ​

ts
Init(rendererData): Promise<boolean>;

Parameters ​

ParameterType
rendererDataRendererData

Returns ​

Promise<boolean>


IsInitialized() ​

ts
IsInitialized(): boolean;

Returns ​

boolean


OnNodeInteraction() ​

ts
OnNodeInteraction(callback): () => void;

Parameters ​

ParameterType
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 ​

ParameterType
configCameraConfig

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 ​

ParameterType
widthnumber
heightnumber
resolution?number

Returns ​

void


SetNodeAlpha() ​

ts
SetNodeAlpha(id, alpha): void;

0..1, applied after visibility — alpha=0 is still hit-testable. Default 1.

Parameters ​

ParameterType
idnumber
alphanumber

Returns ​

void


SetNodeHitArea() ​

ts
SetNodeHitArea(id, rect): void;

node-local rect; null reverts to bounds-derived hit testing.

Parameters ​

ParameterType
idnumber
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 ​

ParameterType
idnumber
interactiveboolean

Returns ​

void


SetNodeLayer() ​

ts
SetNodeLayer(id, layer): void;

Parameters ​

ParameterType
idnumber
layernumber

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 ​

ParameterType
targetNodeIdnumber
maskSourceNodeIdnumber | 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 ​

ParameterType
idnumber
ordernumber

Returns ​

void


SetNodeParent() ​

ts
SetNodeParent(id, parentId): void;

Parameters ​

ParameterType
idnumber
parentIdnumber | 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 ​

ParameterType
idnumber
pivotXnumber
pivotYnumber

Returns ​

void


SetNodeTransform() ​

ts
SetNodeTransform(
   id, 
   x, 
   y, 
   rotation, 
   scaleX, 
   scaleY
): void;

Parameters ​

ParameterType
idnumber
xnumber
ynumber
rotationnumber
scaleXnumber
scaleYnumber

Returns ​

void


SetNodeVisibility() ​

ts
SetNodeVisibility(id, visible): void;

Parameters ​

ParameterType
idnumber
visibleboolean

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 ​

ParameterType
handlenumber
visibleboolean

Returns ​

void


Shutdown() ​

ts
Shutdown(): Promise<void>;

Returns ​

Promise<void>

© 2026 PlayAdGentic