modern-canvas 0.4.7 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2237,14 +2237,12 @@ class MainLoop extends CoreObject {
2237
2237
  this.on("process", process);
2238
2238
  Ticker.on(this._onNextTick, { sort: 0 });
2239
2239
  }
2240
- return this;
2241
2240
  }
2242
2241
  stop() {
2243
2242
  if (this._starting) {
2244
2243
  this._starting = false;
2245
2244
  Ticker.off(this._onNextTick, { sort: 0 });
2246
2245
  }
2247
- return this;
2248
2246
  }
2249
2247
  _onNextTick() {
2250
2248
  const elapsed = Ticker.elapsed * this.speed;
@@ -5773,9 +5771,9 @@ exports.Node = class Node extends CoreObject {
5773
5771
  case "inherit":
5774
5772
  return this._parent?.canProcess() ?? true;
5775
5773
  case "pausable":
5776
- return !this._tree.paused;
5774
+ return !this._tree.processPaused;
5777
5775
  case "when_paused":
5778
- return this._tree.paused;
5776
+ return this._tree.processPaused;
5779
5777
  case "always":
5780
5778
  return true;
5781
5779
  case "disabled":
@@ -5898,6 +5896,17 @@ exports.Node = class Node extends CoreObject {
5898
5896
  this._parent.moveChild(sibling, this.getIndex(true) + 1);
5899
5897
  return this;
5900
5898
  }
5899
+ prepend(...nodes) {
5900
+ let _nodes;
5901
+ if (Array.isArray(nodes[0])) {
5902
+ _nodes = nodes[0];
5903
+ } else {
5904
+ _nodes = nodes;
5905
+ }
5906
+ _nodes.forEach((node) => {
5907
+ this.moveChild(node, 0);
5908
+ });
5909
+ }
5901
5910
  append(...nodes) {
5902
5911
  let _nodes;
5903
5912
  if (Array.isArray(nodes[0])) {
@@ -5909,6 +5918,35 @@ exports.Node = class Node extends CoreObject {
5909
5918
  this.appendChild(node);
5910
5919
  });
5911
5920
  }
5921
+ before(...nodes) {
5922
+ let _nodes;
5923
+ if (Array.isArray(nodes[0])) {
5924
+ _nodes = nodes[0];
5925
+ } else {
5926
+ _nodes = nodes;
5927
+ }
5928
+ _nodes.forEach((node) => {
5929
+ this._parent?.moveChild(node, this.getIndex(true));
5930
+ });
5931
+ }
5932
+ after(...nodes) {
5933
+ let _nodes;
5934
+ if (Array.isArray(nodes[0])) {
5935
+ _nodes = nodes[0];
5936
+ } else {
5937
+ _nodes = nodes;
5938
+ }
5939
+ _nodes.forEach((node) => {
5940
+ this._parent?.moveChild(node, this.getIndex(true) + 1);
5941
+ });
5942
+ }
5943
+ insertBefore(node, child) {
5944
+ if (!child.hasParent() || !this.is(child.parent)) {
5945
+ return node;
5946
+ }
5947
+ this.moveChild(node, child.getIndex(true));
5948
+ return node;
5949
+ }
5912
5950
  appendChild(node, internalMode = node.internalMode) {
5913
5951
  if (this.is(node) || node.hasParent()) {
5914
5952
  return node;
@@ -8107,6 +8145,16 @@ exports.CanvasItem = class CanvasItem extends exports.TimelineNode {
8107
8145
  };
8108
8146
  });
8109
8147
  }
8148
+ _process(delta) {
8149
+ super._process(delta);
8150
+ const parent = this.getParent();
8151
+ if (this._parentGlobalVisible !== parent?.globalVisible) {
8152
+ this.requestUpdate();
8153
+ }
8154
+ if (this._parentGlobalOpacity !== parent?.globalOpacity) {
8155
+ this.requestUpdate();
8156
+ }
8157
+ }
8110
8158
  _update() {
8111
8159
  const parent = this.getParent();
8112
8160
  if (this._parentGlobalVisible !== parent?.globalVisible) {
@@ -8302,15 +8350,16 @@ class SceneTree extends MainLoop {
8302
8350
  console.log(`[modern-canvas]`, ...args);
8303
8351
  }
8304
8352
  }
8305
- _render(renderer, delta = 0) {
8353
+ _process(delta = 0) {
8306
8354
  this.timeline.addTime(delta);
8307
8355
  this.emit("processing");
8308
8356
  this.root.emit("process", delta);
8309
8357
  this.emit("processed");
8358
+ }
8359
+ _render(renderer) {
8310
8360
  renderer.program.uniforms.projectionMatrix = this.root.toProjectionArray(true);
8311
8361
  this.renderStack.render(renderer);
8312
8362
  this._renderScreen(renderer);
8313
- return this;
8314
8363
  }
8315
8364
  _renderScreen(renderer) {
8316
8365
  renderer.state.reset();
@@ -8343,7 +8392,7 @@ class SceneTree extends MainLoop {
8343
8392
  }
8344
8393
  __decorateClass$r([
8345
8394
  property({ default: false })
8346
- ], SceneTree.prototype, "paused");
8395
+ ], SceneTree.prototype, "processPaused");
8347
8396
  __decorateClass$r([
8348
8397
  property()
8349
8398
  ], SceneTree.prototype, "backgroundColor");
@@ -8693,11 +8742,11 @@ exports.Node2D = class Node2D extends exports.CanvasItem {
8693
8742
  });
8694
8743
  }
8695
8744
  _process(delta) {
8745
+ super._process(delta);
8696
8746
  const parent = this.getParent();
8697
8747
  if (this._parentTransformDirtyId !== parent?.globalTransform?.dirtyId) {
8698
8748
  this.requestRelayout();
8699
8749
  }
8700
- super._process(delta);
8701
8750
  }
8702
8751
  };
8703
8752
  exports.Node2D = __decorateClass$n([
@@ -13141,13 +13190,20 @@ class Engine extends SceneTree {
13141
13190
  await assets.waitUntilLoad();
13142
13191
  await this.nextTick();
13143
13192
  }
13193
+ async waitAndRender(delta = 0) {
13194
+ this._process(delta);
13195
+ await this.waitUntilLoad();
13196
+ this._render(this.renderer);
13197
+ }
13144
13198
  render(delta = 0) {
13145
- return this._render(this.renderer, delta);
13199
+ this._process(delta);
13200
+ this._render(this.renderer);
13146
13201
  }
13147
- start() {
13148
- this.render();
13149
- return super.start((delta) => {
13150
- this.render(delta);
13202
+ async start() {
13203
+ await this.waitAndRender();
13204
+ super.start((delta) => {
13205
+ this._process(delta);
13206
+ this._render(this.renderer);
13151
13207
  });
13152
13208
  }
13153
13209
  free() {
@@ -13156,7 +13212,6 @@ class Engine extends SceneTree {
13156
13212
  this.renderer.free();
13157
13213
  }
13158
13214
  toPixels() {
13159
- this.render();
13160
13215
  return this.renderer.toPixels();
13161
13216
  }
13162
13217
  toImageData() {
@@ -13187,10 +13242,14 @@ class Engine extends SceneTree {
13187
13242
  }
13188
13243
 
13189
13244
  let engine;
13190
- let renderLoop;
13191
13245
  const queue = [];
13192
- async function startRenderLoop(sleep = 100) {
13193
- while (true) {
13246
+ let starting = false;
13247
+ async function start(sleep = 100) {
13248
+ if (starting) {
13249
+ return;
13250
+ }
13251
+ starting = true;
13252
+ while (queue.length) {
13194
13253
  const cb = queue.shift();
13195
13254
  if (cb) {
13196
13255
  try {
@@ -13202,28 +13261,29 @@ async function startRenderLoop(sleep = 100) {
13202
13261
  await new Promise((r) => setTimeout(r, sleep));
13203
13262
  }
13204
13263
  }
13264
+ starting = false;
13205
13265
  }
13206
- async function performRender(options) {
13266
+ async function task(options) {
13267
+ const { data, width, height, time = 0 } = options;
13207
13268
  engine ??= new Engine({ width: 1, height: 1 });
13208
- const root = engine.root;
13209
- root.removeChildren();
13210
- const { data, width, height } = options;
13269
+ engine.root.removeChildren();
13270
+ engine.timeline.currentTime = time;
13211
13271
  engine.resize(width, height);
13212
13272
  (Array.isArray(data) ? data : [data]).forEach((v) => {
13213
13273
  if (v instanceof exports.Node) {
13214
- root.appendChild(v);
13274
+ engine.root.appendChild(v);
13215
13275
  } else {
13216
- root.appendChild(exports.Node.parse(v));
13276
+ engine.root.appendChild(exports.Node.parse(v));
13217
13277
  }
13218
13278
  });
13219
- await engine.waitUntilLoad();
13220
13279
  await options.onBeforeRender?.(engine);
13280
+ await engine.waitAndRender();
13221
13281
  return engine.toCanvas2D();
13222
13282
  }
13223
13283
  async function render(options) {
13224
- renderLoop ??= startRenderLoop();
13225
13284
  return new Promise((r) => {
13226
- queue.push(async () => r(await performRender(options)));
13285
+ queue.push(async () => r(await task(options)));
13286
+ start();
13227
13287
  });
13228
13288
  }
13229
13289
 
package/dist/index.d.cts CHANGED
@@ -595,8 +595,8 @@ declare class MainLoop extends CoreObject {
595
595
  get starting(): boolean;
596
596
  get spf(): number;
597
597
  constructor();
598
- start(process: (delta: number) => void): this;
599
- stop(): this;
598
+ start(process: (delta: number) => void): void;
599
+ stop(): void;
600
600
  protected _onNextTick(): void;
601
601
  free(): void;
602
602
  }
@@ -1569,7 +1569,7 @@ interface SceneTree {
1569
1569
  emit: (<K extends keyof SceneTreeEventMap>(type: K, ...args: Parameters<SceneTreeEventMap[K]>) => boolean) & ((type: string, ...args: any[]) => boolean);
1570
1570
  }
1571
1571
  declare class SceneTree extends MainLoop {
1572
- paused: boolean;
1572
+ processPaused: boolean;
1573
1573
  backgroundColor?: ColorValue;
1574
1574
  debug: boolean;
1575
1575
  readonly input: Input;
@@ -1583,7 +1583,8 @@ declare class SceneTree extends MainLoop {
1583
1583
  constructor(timeline?: Timeline);
1584
1584
  protected _updateProperty(key: PropertyKey, value: any, oldValue: any, declaration?: PropertyDeclaration): void;
1585
1585
  log(...args: any[]): void;
1586
- protected _render(renderer: WebGLRenderer, delta?: number): this;
1586
+ protected _process(delta?: number): void;
1587
+ protected _render(renderer: WebGLRenderer): void;
1587
1588
  protected _renderScreen(renderer: WebGLRenderer): void;
1588
1589
  free(): void;
1589
1590
  }
@@ -1683,8 +1684,15 @@ declare class Node extends CoreObject {
1683
1684
  getNode<T extends Node>(path: string): T | undefined;
1684
1685
  removeNode(path: string): void;
1685
1686
  addSibling(sibling: Node): this;
1686
- append(nodes: Node[]): void;
1687
- append(...nodes: Node[]): void;
1687
+ prepend<T extends Node>(nodes: T[]): void;
1688
+ prepend<T extends Node>(...nodes: T[]): void;
1689
+ append<T extends Node>(nodes: T[]): void;
1690
+ append<T extends Node>(...nodes: T[]): void;
1691
+ before<T extends Node>(nodes: T[]): void;
1692
+ before<T extends Node>(...nodes: T[]): void;
1693
+ after<T extends Node>(nodes: T[]): void;
1694
+ after<T extends Node>(...nodes: T[]): void;
1695
+ insertBefore<T extends Node>(node: T, child: Node): T;
1688
1696
  appendChild<T extends Node>(node: T, internalMode?: InternalMode): T;
1689
1697
  moveChild(child: Node, toIndex: number, internalMode?: InternalMode): this;
1690
1698
  removeChild<T extends Node>(child: T): T;
@@ -1793,6 +1801,7 @@ declare class CanvasItem extends TimelineNode {
1793
1801
  protected _redraw(): CanvasBatchable[];
1794
1802
  protected _relayout(batchables: CanvasBatchable[]): CanvasBatchable[];
1795
1803
  protected _repaint(batchables: CanvasBatchable[]): CanvasBatchable[];
1804
+ protected _process(delta: number): void;
1796
1805
  protected _update(): void;
1797
1806
  protected _render(renderer: WebGLRenderer): void;
1798
1807
  }
@@ -3034,8 +3043,9 @@ declare class Engine extends SceneTree {
3034
3043
  resize(width: number, height: number, updateCss?: boolean): this;
3035
3044
  nextTick(): Promise<void>;
3036
3045
  waitUntilLoad(): Promise<void>;
3037
- render(delta?: number): this;
3038
- start(): this;
3046
+ waitAndRender(delta?: number): Promise<void>;
3047
+ render(delta?: number): void;
3048
+ start(): Promise<void>;
3039
3049
  free(): void;
3040
3050
  toPixels(): Uint8ClampedArray;
3041
3051
  toImageData(): ImageData;
@@ -3046,6 +3056,7 @@ interface RenderOptions {
3046
3056
  data: Record<string, any> | Node | (Node | Record<string, any>)[];
3047
3057
  width: number;
3048
3058
  height: number;
3059
+ time?: number;
3049
3060
  onBeforeRender?: (engine: Engine) => void | Promise<void>;
3050
3061
  }
3051
3062
  declare function render(options: RenderOptions): Promise<HTMLCanvasElement>;
package/dist/index.d.mts CHANGED
@@ -595,8 +595,8 @@ declare class MainLoop extends CoreObject {
595
595
  get starting(): boolean;
596
596
  get spf(): number;
597
597
  constructor();
598
- start(process: (delta: number) => void): this;
599
- stop(): this;
598
+ start(process: (delta: number) => void): void;
599
+ stop(): void;
600
600
  protected _onNextTick(): void;
601
601
  free(): void;
602
602
  }
@@ -1569,7 +1569,7 @@ interface SceneTree {
1569
1569
  emit: (<K extends keyof SceneTreeEventMap>(type: K, ...args: Parameters<SceneTreeEventMap[K]>) => boolean) & ((type: string, ...args: any[]) => boolean);
1570
1570
  }
1571
1571
  declare class SceneTree extends MainLoop {
1572
- paused: boolean;
1572
+ processPaused: boolean;
1573
1573
  backgroundColor?: ColorValue;
1574
1574
  debug: boolean;
1575
1575
  readonly input: Input;
@@ -1583,7 +1583,8 @@ declare class SceneTree extends MainLoop {
1583
1583
  constructor(timeline?: Timeline);
1584
1584
  protected _updateProperty(key: PropertyKey, value: any, oldValue: any, declaration?: PropertyDeclaration): void;
1585
1585
  log(...args: any[]): void;
1586
- protected _render(renderer: WebGLRenderer, delta?: number): this;
1586
+ protected _process(delta?: number): void;
1587
+ protected _render(renderer: WebGLRenderer): void;
1587
1588
  protected _renderScreen(renderer: WebGLRenderer): void;
1588
1589
  free(): void;
1589
1590
  }
@@ -1683,8 +1684,15 @@ declare class Node extends CoreObject {
1683
1684
  getNode<T extends Node>(path: string): T | undefined;
1684
1685
  removeNode(path: string): void;
1685
1686
  addSibling(sibling: Node): this;
1686
- append(nodes: Node[]): void;
1687
- append(...nodes: Node[]): void;
1687
+ prepend<T extends Node>(nodes: T[]): void;
1688
+ prepend<T extends Node>(...nodes: T[]): void;
1689
+ append<T extends Node>(nodes: T[]): void;
1690
+ append<T extends Node>(...nodes: T[]): void;
1691
+ before<T extends Node>(nodes: T[]): void;
1692
+ before<T extends Node>(...nodes: T[]): void;
1693
+ after<T extends Node>(nodes: T[]): void;
1694
+ after<T extends Node>(...nodes: T[]): void;
1695
+ insertBefore<T extends Node>(node: T, child: Node): T;
1688
1696
  appendChild<T extends Node>(node: T, internalMode?: InternalMode): T;
1689
1697
  moveChild(child: Node, toIndex: number, internalMode?: InternalMode): this;
1690
1698
  removeChild<T extends Node>(child: T): T;
@@ -1793,6 +1801,7 @@ declare class CanvasItem extends TimelineNode {
1793
1801
  protected _redraw(): CanvasBatchable[];
1794
1802
  protected _relayout(batchables: CanvasBatchable[]): CanvasBatchable[];
1795
1803
  protected _repaint(batchables: CanvasBatchable[]): CanvasBatchable[];
1804
+ protected _process(delta: number): void;
1796
1805
  protected _update(): void;
1797
1806
  protected _render(renderer: WebGLRenderer): void;
1798
1807
  }
@@ -3034,8 +3043,9 @@ declare class Engine extends SceneTree {
3034
3043
  resize(width: number, height: number, updateCss?: boolean): this;
3035
3044
  nextTick(): Promise<void>;
3036
3045
  waitUntilLoad(): Promise<void>;
3037
- render(delta?: number): this;
3038
- start(): this;
3046
+ waitAndRender(delta?: number): Promise<void>;
3047
+ render(delta?: number): void;
3048
+ start(): Promise<void>;
3039
3049
  free(): void;
3040
3050
  toPixels(): Uint8ClampedArray;
3041
3051
  toImageData(): ImageData;
@@ -3046,6 +3056,7 @@ interface RenderOptions {
3046
3056
  data: Record<string, any> | Node | (Node | Record<string, any>)[];
3047
3057
  width: number;
3048
3058
  height: number;
3059
+ time?: number;
3049
3060
  onBeforeRender?: (engine: Engine) => void | Promise<void>;
3050
3061
  }
3051
3062
  declare function render(options: RenderOptions): Promise<HTMLCanvasElement>;
package/dist/index.d.ts CHANGED
@@ -595,8 +595,8 @@ declare class MainLoop extends CoreObject {
595
595
  get starting(): boolean;
596
596
  get spf(): number;
597
597
  constructor();
598
- start(process: (delta: number) => void): this;
599
- stop(): this;
598
+ start(process: (delta: number) => void): void;
599
+ stop(): void;
600
600
  protected _onNextTick(): void;
601
601
  free(): void;
602
602
  }
@@ -1569,7 +1569,7 @@ interface SceneTree {
1569
1569
  emit: (<K extends keyof SceneTreeEventMap>(type: K, ...args: Parameters<SceneTreeEventMap[K]>) => boolean) & ((type: string, ...args: any[]) => boolean);
1570
1570
  }
1571
1571
  declare class SceneTree extends MainLoop {
1572
- paused: boolean;
1572
+ processPaused: boolean;
1573
1573
  backgroundColor?: ColorValue;
1574
1574
  debug: boolean;
1575
1575
  readonly input: Input;
@@ -1583,7 +1583,8 @@ declare class SceneTree extends MainLoop {
1583
1583
  constructor(timeline?: Timeline);
1584
1584
  protected _updateProperty(key: PropertyKey, value: any, oldValue: any, declaration?: PropertyDeclaration): void;
1585
1585
  log(...args: any[]): void;
1586
- protected _render(renderer: WebGLRenderer, delta?: number): this;
1586
+ protected _process(delta?: number): void;
1587
+ protected _render(renderer: WebGLRenderer): void;
1587
1588
  protected _renderScreen(renderer: WebGLRenderer): void;
1588
1589
  free(): void;
1589
1590
  }
@@ -1683,8 +1684,15 @@ declare class Node extends CoreObject {
1683
1684
  getNode<T extends Node>(path: string): T | undefined;
1684
1685
  removeNode(path: string): void;
1685
1686
  addSibling(sibling: Node): this;
1686
- append(nodes: Node[]): void;
1687
- append(...nodes: Node[]): void;
1687
+ prepend<T extends Node>(nodes: T[]): void;
1688
+ prepend<T extends Node>(...nodes: T[]): void;
1689
+ append<T extends Node>(nodes: T[]): void;
1690
+ append<T extends Node>(...nodes: T[]): void;
1691
+ before<T extends Node>(nodes: T[]): void;
1692
+ before<T extends Node>(...nodes: T[]): void;
1693
+ after<T extends Node>(nodes: T[]): void;
1694
+ after<T extends Node>(...nodes: T[]): void;
1695
+ insertBefore<T extends Node>(node: T, child: Node): T;
1688
1696
  appendChild<T extends Node>(node: T, internalMode?: InternalMode): T;
1689
1697
  moveChild(child: Node, toIndex: number, internalMode?: InternalMode): this;
1690
1698
  removeChild<T extends Node>(child: T): T;
@@ -1793,6 +1801,7 @@ declare class CanvasItem extends TimelineNode {
1793
1801
  protected _redraw(): CanvasBatchable[];
1794
1802
  protected _relayout(batchables: CanvasBatchable[]): CanvasBatchable[];
1795
1803
  protected _repaint(batchables: CanvasBatchable[]): CanvasBatchable[];
1804
+ protected _process(delta: number): void;
1796
1805
  protected _update(): void;
1797
1806
  protected _render(renderer: WebGLRenderer): void;
1798
1807
  }
@@ -3034,8 +3043,9 @@ declare class Engine extends SceneTree {
3034
3043
  resize(width: number, height: number, updateCss?: boolean): this;
3035
3044
  nextTick(): Promise<void>;
3036
3045
  waitUntilLoad(): Promise<void>;
3037
- render(delta?: number): this;
3038
- start(): this;
3046
+ waitAndRender(delta?: number): Promise<void>;
3047
+ render(delta?: number): void;
3048
+ start(): Promise<void>;
3039
3049
  free(): void;
3040
3050
  toPixels(): Uint8ClampedArray;
3041
3051
  toImageData(): ImageData;
@@ -3046,6 +3056,7 @@ interface RenderOptions {
3046
3056
  data: Record<string, any> | Node | (Node | Record<string, any>)[];
3047
3057
  width: number;
3048
3058
  height: number;
3059
+ time?: number;
3049
3060
  onBeforeRender?: (engine: Engine) => void | Promise<void>;
3050
3061
  }
3051
3062
  declare function render(options: RenderOptions): Promise<HTMLCanvasElement>;