@yali-engine/render 0.0.0-stage → 0.4.0

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.
Files changed (131) hide show
  1. package/dist/bvh.d.ts +66 -0
  2. package/dist/bvh.js +493 -0
  3. package/dist/bvh.js.map +1 -0
  4. package/dist/camera.d.ts +34 -0
  5. package/dist/camera.js +66 -0
  6. package/dist/camera.js.map +1 -0
  7. package/dist/cluster-build.d.ts +46 -0
  8. package/dist/cluster-build.js +179 -0
  9. package/dist/cluster-build.js.map +1 -0
  10. package/dist/cluster-pages.d.ts +70 -0
  11. package/dist/cluster-pages.js +203 -0
  12. package/dist/cluster-pages.js.map +1 -0
  13. package/dist/cluster-stream.d.ts +83 -0
  14. package/dist/cluster-stream.js +226 -0
  15. package/dist/cluster-stream.js.map +1 -0
  16. package/dist/culled-draws.d.ts +30 -0
  17. package/dist/culled-draws.js +103 -0
  18. package/dist/culled-draws.js.map +1 -0
  19. package/dist/debug-lines.d.ts +51 -0
  20. package/dist/debug-lines.js +158 -0
  21. package/dist/debug-lines.js.map +1 -0
  22. package/dist/device-profile.d.ts +100 -0
  23. package/dist/device-profile.js +131 -0
  24. package/dist/device-profile.js.map +1 -0
  25. package/dist/device.d.ts +39 -0
  26. package/dist/device.js +79 -0
  27. package/dist/device.js.map +1 -0
  28. package/dist/environment.d.ts +60 -0
  29. package/dist/environment.js +204 -0
  30. package/dist/environment.js.map +1 -0
  31. package/dist/extract.d.ts +74 -0
  32. package/dist/extract.js +194 -0
  33. package/dist/extract.js.map +1 -0
  34. package/dist/frame-graph.d.ts +112 -0
  35. package/dist/frame-graph.js +226 -0
  36. package/dist/frame-graph.js.map +1 -0
  37. package/dist/gpu-health.d.ts +74 -0
  38. package/dist/gpu-health.js +106 -0
  39. package/dist/gpu-health.js.map +1 -0
  40. package/dist/gpu-timer.d.ts +26 -0
  41. package/dist/gpu-timer.js +93 -0
  42. package/dist/gpu-timer.js.map +1 -0
  43. package/dist/headless.d.ts +28 -0
  44. package/dist/headless.js +91 -0
  45. package/dist/headless.js.map +1 -0
  46. package/dist/index.d.ts +34 -0
  47. package/dist/index.js +36 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/lights.d.ts +81 -0
  50. package/dist/lights.js +247 -0
  51. package/dist/lights.js.map +1 -0
  52. package/dist/matrix.d.ts +6 -0
  53. package/dist/matrix.js +59 -0
  54. package/dist/matrix.js.map +1 -0
  55. package/dist/meshes.d.ts +411 -0
  56. package/dist/meshes.js +545 -0
  57. package/dist/meshes.js.map +1 -0
  58. package/dist/meshlets-decoder.d.ts +20 -0
  59. package/dist/meshlets-decoder.js +47 -0
  60. package/dist/meshlets-decoder.js.map +1 -0
  61. package/dist/meshlets.d.ts +186 -0
  62. package/dist/meshlets.js +1040 -0
  63. package/dist/meshlets.js.map +1 -0
  64. package/dist/occlusion.d.ts +51 -0
  65. package/dist/occlusion.js +188 -0
  66. package/dist/occlusion.js.map +1 -0
  67. package/dist/pick-decoder.d.ts +19 -0
  68. package/dist/pick-decoder.js +45 -0
  69. package/dist/pick-decoder.js.map +1 -0
  70. package/dist/pick.d.ts +86 -0
  71. package/dist/pick.js +452 -0
  72. package/dist/pick.js.map +1 -0
  73. package/dist/pipeline-cache.d.ts +53 -0
  74. package/dist/pipeline-cache.js +96 -0
  75. package/dist/pipeline-cache.js.map +1 -0
  76. package/dist/post-options.d.ts +109 -0
  77. package/dist/post-options.js +23 -0
  78. package/dist/post-options.js.map +1 -0
  79. package/dist/post-shaders.gen.d.ts +40 -0
  80. package/dist/post-shaders.gen.js +43 -0
  81. package/dist/post-shaders.gen.js.map +1 -0
  82. package/dist/post.d.ts +101 -0
  83. package/dist/post.js +555 -0
  84. package/dist/post.js.map +1 -0
  85. package/dist/render-plugin.d.ts +239 -0
  86. package/dist/render-plugin.js +633 -0
  87. package/dist/render-plugin.js.map +1 -0
  88. package/dist/scene.d.ts +406 -0
  89. package/dist/scene.js +2005 -0
  90. package/dist/scene.js.map +1 -0
  91. package/dist/shaders.gen.d.ts +40 -0
  92. package/dist/shaders.gen.js +43 -0
  93. package/dist/shaders.gen.js.map +1 -0
  94. package/dist/shadows.d.ts +104 -0
  95. package/dist/shadows.js +227 -0
  96. package/dist/shadows.js.map +1 -0
  97. package/dist/staging-ring.d.ts +41 -0
  98. package/dist/staging-ring.js +125 -0
  99. package/dist/staging-ring.js.map +1 -0
  100. package/dist/textures.d.ts +165 -0
  101. package/dist/textures.js +361 -0
  102. package/dist/textures.js.map +1 -0
  103. package/dist/tonemap.d.ts +45 -0
  104. package/dist/tonemap.js +141 -0
  105. package/dist/tonemap.js.map +1 -0
  106. package/dist/viewport.d.ts +78 -0
  107. package/dist/viewport.js +130 -0
  108. package/dist/viewport.js.map +1 -0
  109. package/dist/webgl2/plugin.d.ts +40 -0
  110. package/dist/webgl2/plugin.js +190 -0
  111. package/dist/webgl2/plugin.js.map +1 -0
  112. package/dist/webgl2/program.d.ts +27 -0
  113. package/dist/webgl2/program.js +74 -0
  114. package/dist/webgl2/program.js.map +1 -0
  115. package/dist/webgl2/renderer.d.ts +128 -0
  116. package/dist/webgl2/renderer.js +976 -0
  117. package/dist/webgl2/renderer.js.map +1 -0
  118. package/dist/webgl2/shaders.glsl.gen.d.ts +27 -0
  119. package/dist/webgl2/shaders.glsl.gen.js +20 -0
  120. package/dist/webgl2/shaders.glsl.gen.js.map +1 -0
  121. package/dist/webgl2/textures.d.ts +11 -0
  122. package/dist/webgl2/textures.js +82 -0
  123. package/dist/webgl2/textures.js.map +1 -0
  124. package/dist/webgl2/webgl2.d.ts +1 -0
  125. package/dist/webgl2/webgl2.js +4 -0
  126. package/dist/webgl2/webgl2.js.map +1 -0
  127. package/dist/worker-mode.d.ts +85 -0
  128. package/dist/worker-mode.js +204 -0
  129. package/dist/worker-mode.js.map +1 -0
  130. package/package.json +47 -3
  131. package/README.md +0 -3
@@ -0,0 +1,82 @@
1
+ import { YaliError } from '@yali-engine/core';
2
+ /** The GL internal formats per family (and the extension each compressed one needs). */
3
+ const FORMATS = {
4
+ rgba8: { ext: null, srgb: 0x8c43 /* SRGB8_ALPHA8 */, linear: 0x8058 /* RGBA8 */ },
5
+ bc7: { ext: 'EXT_texture_compression_bptc', srgb: 'COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT', linear: 'COMPRESSED_RGBA_BPTC_UNORM_EXT' },
6
+ astc: { ext: 'WEBGL_compressed_texture_astc', srgb: 'COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR', linear: 'COMPRESSED_RGBA_ASTC_4x4_KHR' },
7
+ etc2: { ext: 'WEBGL_compressed_texture_etc', srgb: 'COMPRESSED_SRGB8_ALPHA8_ETC2_EAC', linear: 'COMPRESSED_RGBA8_ETC2_EAC' },
8
+ };
9
+ /** The texture families this context samples (the GL equivalent of `texture-compression-*` features). */
10
+ export function glFamilies(gl) {
11
+ const out = new Set();
12
+ for (const [family, f] of Object.entries(FORMATS)) {
13
+ if (f.ext && gl.getExtension(f.ext))
14
+ out.add(family === 'bc7' ? 'texture-compression-bc' : `texture-compression-${family}`);
15
+ }
16
+ return out;
17
+ }
18
+ function internalFormat(gl, family, space) {
19
+ const f = FORMATS[family];
20
+ const v = f[space];
21
+ if (typeof v === 'number')
22
+ return v;
23
+ const ext = gl.getExtension(f.ext);
24
+ const n = ext?.[v];
25
+ if (n === undefined)
26
+ throw new YaliError('GL_TEXTURE_FORMAT', `This WebGL2 context cannot sample ${family} textures (${f.ext}).`, 'Load the RGBA8 variant (the texture family follows the context).');
27
+ return n;
28
+ }
29
+ /**
30
+ * The WebGL2 texture backend of `TextureStore` (ADR-0070): immutable `TEXTURE_2D_ARRAY`s
31
+ * (`texStorage3D`), levels written with `texSubImage3D` or, compressed, with
32
+ * `compressedTexSubImage3D`. WebGL2 has no texture-to-texture copy, so an array that grows
33
+ * is copied through a read framebuffer, layer by layer and level by level (uncompressed
34
+ * arrays; a compressed array's layers are uploaded again from the store's data instead).
35
+ */
36
+ export function glTextureBackend(gl) {
37
+ const read = gl.createFramebuffer();
38
+ return {
39
+ maxLayers: gl.getParameter(gl.MAX_ARRAY_TEXTURE_LAYERS),
40
+ create(_label, family, space, size, mips, layers) {
41
+ const t = gl.createTexture();
42
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, t);
43
+ gl.texStorage3D(gl.TEXTURE_2D_ARRAY, mips, internalFormat(gl, family, space), size, size, layers);
44
+ return t;
45
+ },
46
+ destroy(t) {
47
+ gl.deleteTexture(t);
48
+ },
49
+ write(t, family, space, mip, layer, data, size) {
50
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, t);
51
+ gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
52
+ // GL ES takes a compressed level under 4×4 at its true size (the data is still one block).
53
+ if (family === 'rgba8')
54
+ gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, mip, 0, 0, layer, size, size, 1, gl.RGBA, gl.UNSIGNED_BYTE, data);
55
+ else
56
+ gl.compressedTexSubImage3D(gl.TEXTURE_2D_ARRAY, mip, 0, 0, layer, size, size, 1, internalFormat(gl, family, space), data);
57
+ },
58
+ copy(from, to, family, size, mips, layers) {
59
+ // Compressed formats are not colour-renderable: the store uploads their data again.
60
+ if (family !== 'rgba8')
61
+ return false;
62
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, read);
63
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, to);
64
+ for (let m = 0; m < mips; m++) {
65
+ const s = Math.max(1, size >> m);
66
+ for (let l = 0; l < layers; l++) {
67
+ gl.framebufferTextureLayer(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, from, m, l);
68
+ gl.copyTexSubImage3D(gl.TEXTURE_2D_ARRAY, m, 0, 0, l, 0, 0, s, s);
69
+ }
70
+ }
71
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);
72
+ return true;
73
+ },
74
+ placeholder() {
75
+ const t = gl.createTexture();
76
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, t);
77
+ gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.RGBA8, 4, 4, 1);
78
+ return t;
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=textures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textures.js","sourceRoot":"","sources":["../../src/webgl2/textures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { startWebGL2 } from './plugin.ts';
@@ -0,0 +1,4 @@
1
+ // The WebGL2 backend's entry (ADR-0070): a module of this name so the bundler names its chunk
2
+ // `webgl2-*.js`, which the size gate counts as a capability fallback apart from the page (ADR-0106).
3
+ export { startWebGL2 } from "./plugin.js";
4
+ //# sourceMappingURL=webgl2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl2.js","sourceRoot":"","sources":["../../src/webgl2/webgl2.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,qGAAqG;AACrG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,85 @@
1
+ import type { App } from '@yali-engine/core';
2
+ import type { ViewportSize } from './viewport.ts';
3
+ /** Input the page forwards to a render worker (plain data: it crosses `postMessage`). */
4
+ export type ForwardedInput = {
5
+ readonly kind: 'pointerdown' | 'pointermove' | 'pointerup';
6
+ readonly x: number;
7
+ readonly y: number;
8
+ readonly movementX: number;
9
+ readonly movementY: number;
10
+ readonly buttons: number;
11
+ readonly pointerId: number;
12
+ } | {
13
+ readonly kind: 'wheel';
14
+ readonly deltaX: number;
15
+ readonly deltaY: number;
16
+ } | {
17
+ readonly kind: 'keydown' | 'keyup';
18
+ readonly key: string;
19
+ readonly code: string;
20
+ };
21
+ /** The page side of worker render mode. */
22
+ export interface RenderWorkerHost {
23
+ /** Calls a handler the worker registered with `link.handle(name, fn)`. */
24
+ call<T = unknown>(name: string, args?: unknown): Promise<T>;
25
+ /**
26
+ * The worker app's tool registry, reached through the link (available once the worker
27
+ * has called `link.bind(app)`). Put it on the page's probe as `__yali.tools`, and
28
+ * `yali-mcp` drives a worker-mode app as it does a main-thread one.
29
+ */
30
+ readonly tools: {
31
+ list(): Promise<unknown[]>;
32
+ call(name: string, args: Record<string, unknown>): Promise<unknown>;
33
+ };
34
+ /** The worker app's profiler trace (Chrome trace JSON). */
35
+ trace(): Promise<unknown>;
36
+ /** Stops forwarding, terminates the worker. */
37
+ dispose(): void;
38
+ }
39
+ /**
40
+ * Worker render mode, page side (DESIGN.md §22, §25 Q1; ADR-0034). Hands `canvas` to
41
+ * `worker` as an OffscreenCanvas, then forwards what only the page can see: the canvas's
42
+ * size in exact device pixels, visibility, and pointer, wheel and key input. The whole app
43
+ * runs in the worker; the main thread is left with this forwarding (and the page's own UI).
44
+ *
45
+ * @example
46
+ * const worker = new Worker(new URL('./app.worker.ts', import.meta.url), { type: 'module' });
47
+ * const host = hostRenderWorker(canvas, worker, { data: { n: 50_000 }, onPost: (stats) => hud(stats) });
48
+ * await host.call('loseDevice');
49
+ */
50
+ export declare function hostRenderWorker(canvas: HTMLCanvasElement, worker: Worker, options?: {
51
+ data?: unknown;
52
+ onPost?: (data: unknown) => void;
53
+ }): RenderWorkerHost;
54
+ /** The worker side of worker render mode. */
55
+ export interface RenderWorkerLink {
56
+ /** The canvas the page transferred: pass it to `renderPlugin({ canvas })`. */
57
+ readonly canvas: OffscreenCanvas;
58
+ /** The canvas's size when the page handed it over. */
59
+ readonly size: ViewportSize;
60
+ /** What the page passed as `data` (options, its URL…). */
61
+ readonly data: unknown;
62
+ /** Receives forwarded input. Returns the unsubscribe function. */
63
+ onInput(fn: (input: ForwardedInput) => void): () => void;
64
+ /** Answers `host.call(name, args)`; a throw becomes the call's rejection. */
65
+ handle(name: string, fn: (args: unknown) => unknown): void;
66
+ /** Sends data to the page's `onPost`. */
67
+ post(data: unknown, transfer?: Transferable[]): void;
68
+ /**
69
+ * Wires an initialized app to the page: the render viewport follows the page's size
70
+ * (applied now and on every resize), and visibility pauses and resumes the app.
71
+ */
72
+ bind(app: App): void;
73
+ }
74
+ /**
75
+ * Worker render mode, worker side: resolves when the page's `hostRenderWorker` hands over
76
+ * the canvas.
77
+ *
78
+ * @example
79
+ * const link = await connectRenderWorker();
80
+ * const app = App.create({ core, plugins: [renderPlugin({ canvas: link.canvas }), game] });
81
+ * await app.init();
82
+ * link.bind(app);
83
+ * app.start();
84
+ */
85
+ export declare function connectRenderWorker(): Promise<RenderWorkerLink>;
@@ -0,0 +1,204 @@
1
+ import { YaliError } from '@yali-engine/core';
2
+ const measure = (canvas) => ({
3
+ css: { width: canvas.clientWidth, height: canvas.clientHeight },
4
+ dpr: devicePixelRatio,
5
+ device: null,
6
+ });
7
+ /**
8
+ * Worker render mode, page side (DESIGN.md §22, §25 Q1; ADR-0034). Hands `canvas` to
9
+ * `worker` as an OffscreenCanvas, then forwards what only the page can see: the canvas's
10
+ * size in exact device pixels, visibility, and pointer, wheel and key input. The whole app
11
+ * runs in the worker; the main thread is left with this forwarding (and the page's own UI).
12
+ *
13
+ * @example
14
+ * const worker = new Worker(new URL('./app.worker.ts', import.meta.url), { type: 'module' });
15
+ * const host = hostRenderWorker(canvas, worker, { data: { n: 50_000 }, onPost: (stats) => hud(stats) });
16
+ * await host.call('loseDevice');
17
+ */
18
+ export function hostRenderWorker(canvas, worker, options = {}) {
19
+ const offscreen = canvas.transferControlToOffscreen();
20
+ const send = (m, transfer = []) => worker.postMessage(m, transfer);
21
+ send({ type: 'yali:init', canvas: offscreen, size: measure(canvas), data: options.data ?? null }, [offscreen]);
22
+ const off = [];
23
+ const listen = (target, type, fn, opts) => {
24
+ target.addEventListener(type, fn, opts);
25
+ off.push(() => target.removeEventListener(type, fn, opts));
26
+ };
27
+ const observer = new ResizeObserver((entries) => {
28
+ const e = entries[entries.length - 1];
29
+ const box = e.contentBoxSize?.[0];
30
+ const dev = e.devicePixelContentBoxSize?.[0];
31
+ send({
32
+ type: 'yali:resize',
33
+ size: {
34
+ css: box ? { width: box.inlineSize, height: box.blockSize } : { width: e.contentRect.width, height: e.contentRect.height },
35
+ dpr: devicePixelRatio,
36
+ device: dev ? { width: dev.inlineSize, height: dev.blockSize } : null,
37
+ },
38
+ });
39
+ });
40
+ try {
41
+ observer.observe(canvas, { box: 'device-pixel-content-box' });
42
+ }
43
+ catch {
44
+ observer.observe(canvas);
45
+ }
46
+ off.push(() => observer.disconnect());
47
+ listen(document, 'visibilitychange', () => send({ type: 'yali:visibility', hidden: document.hidden }));
48
+ // Touch and pen movement comes from the change in position: Chrome on Android reports
49
+ // touch movementX in other units (rounded, about 1/devicePixelRatio of the CSS move).
50
+ let lastId = -1;
51
+ let lastX = 0;
52
+ let lastY = 0;
53
+ const pointer = (kind) => (e) => {
54
+ if (kind === 'pointerdown')
55
+ canvas.setPointerCapture(e.pointerId);
56
+ let mx = e.movementX;
57
+ let my = e.movementY;
58
+ if (e.pointerType !== 'mouse') {
59
+ const same = kind !== 'pointerdown' && e.pointerId === lastId;
60
+ mx = same ? e.offsetX - lastX : 0;
61
+ my = same ? e.offsetY - lastY : 0;
62
+ lastId = e.pointerId;
63
+ lastX = e.offsetX;
64
+ lastY = e.offsetY;
65
+ }
66
+ send({ type: 'yali:input', input: { kind, x: e.offsetX, y: e.offsetY, movementX: mx, movementY: my, buttons: e.buttons, pointerId: e.pointerId } });
67
+ };
68
+ listen(canvas, 'pointerdown', pointer('pointerdown'));
69
+ listen(canvas, 'pointermove', pointer('pointermove'));
70
+ listen(canvas, 'pointerup', pointer('pointerup'));
71
+ listen(canvas, 'wheel', (e) => {
72
+ e.preventDefault();
73
+ send({ type: 'yali:input', input: { kind: 'wheel', deltaX: e.deltaX, deltaY: e.deltaY } });
74
+ }, { passive: false });
75
+ listen(window, 'keydown', (e) => send({ type: 'yali:input', input: { kind: 'keydown', key: e.key, code: e.code } }));
76
+ listen(window, 'keyup', (e) => send({ type: 'yali:input', input: { kind: 'keyup', key: e.key, code: e.code } }));
77
+ let nextId = 1;
78
+ const pending = new Map();
79
+ const onMessage = (e) => {
80
+ const m = e.data;
81
+ if (m.type === 'yali:post')
82
+ options.onPost?.(m.data);
83
+ else if (m.type === 'yali:result') {
84
+ const p = pending.get(m.id);
85
+ pending.delete(m.id);
86
+ if (!p)
87
+ return;
88
+ if (m.ok)
89
+ p.resolve(m.value);
90
+ else
91
+ p.reject(Object.assign(new YaliError(m.error.code, m.error.message, m.error.fix), m.error.path ? { path: m.error.path } : {}));
92
+ }
93
+ };
94
+ worker.addEventListener('message', onMessage);
95
+ off.push(() => worker.removeEventListener('message', onMessage));
96
+ const call = (name, args) => {
97
+ const id = nextId++;
98
+ return new Promise((resolve, reject) => {
99
+ pending.set(id, { resolve: resolve, reject });
100
+ send({ type: 'yali:call', id, name, args: args ?? null });
101
+ });
102
+ };
103
+ return {
104
+ call,
105
+ tools: {
106
+ list: () => call('yali.tools.list'),
107
+ call: (name, args) => call('yali.tools.call', { name, args }),
108
+ },
109
+ trace: () => call('yali.trace'),
110
+ dispose() {
111
+ for (const f of off.splice(0))
112
+ f();
113
+ worker.terminate();
114
+ },
115
+ };
116
+ }
117
+ /**
118
+ * Worker render mode, worker side: resolves when the page's `hostRenderWorker` hands over
119
+ * the canvas.
120
+ *
121
+ * @example
122
+ * const link = await connectRenderWorker();
123
+ * const app = App.create({ core, plugins: [renderPlugin({ canvas: link.canvas }), game] });
124
+ * await app.init();
125
+ * link.bind(app);
126
+ * app.start();
127
+ */
128
+ export function connectRenderWorker() {
129
+ const scope = globalThis;
130
+ if (!('WorkerGlobalScope' in globalThis)) {
131
+ return Promise.reject(new YaliError('NOT_A_WORKER', 'connectRenderWorker runs inside a worker.', 'Call it from the worker the page passed to hostRenderWorker.'));
132
+ }
133
+ return new Promise((resolve) => {
134
+ const inputs = new Set();
135
+ const handlers = new Map();
136
+ let size;
137
+ let onResize = () => { };
138
+ let onVisibility = () => { };
139
+ scope.addEventListener('message', (e) => {
140
+ const m = e.data;
141
+ switch (m?.type) {
142
+ case 'yali:init':
143
+ size = m.size;
144
+ resolve({
145
+ canvas: m.canvas,
146
+ size: m.size,
147
+ data: m.data,
148
+ onInput(fn) {
149
+ inputs.add(fn);
150
+ return () => inputs.delete(fn);
151
+ },
152
+ handle(name, fn) {
153
+ handlers.set(name, fn);
154
+ },
155
+ post(data, transfer = []) {
156
+ scope.postMessage({ type: 'yali:post', data }, transfer);
157
+ },
158
+ bind(app) {
159
+ const render = app.resource('render');
160
+ onResize = (s) => render.viewport.setSize(s);
161
+ onResize(size);
162
+ onVisibility = (hidden) => (hidden ? app.pause('hidden') : app.resume());
163
+ // The app's tools and trace, for the page's probe (and so for yali-mcp).
164
+ handlers.set('yali.tools.list', () => app.tools.list());
165
+ handlers.set('yali.tools.call', (a) => {
166
+ const { name, args } = a;
167
+ return app.tools.call(name, args ?? {});
168
+ });
169
+ handlers.set('yali.trace', () => app.profiler.trace());
170
+ },
171
+ });
172
+ break;
173
+ case 'yali:resize':
174
+ size = m.size;
175
+ onResize(m.size);
176
+ break;
177
+ case 'yali:visibility':
178
+ onVisibility(m.hidden);
179
+ break;
180
+ case 'yali:input':
181
+ for (const fn of inputs)
182
+ fn(m.input);
183
+ break;
184
+ case 'yali:call': {
185
+ const fn = handlers.get(m.name);
186
+ void (async () => {
187
+ try {
188
+ if (!fn)
189
+ throw new YaliError('UNKNOWN_CALL', `The render worker has no handler for ${m.name}.`, `Register it with link.handle(${JSON.stringify(m.name)}, fn).`);
190
+ scope.postMessage({ type: 'yali:result', id: m.id, ok: true, value: await fn(m.args) });
191
+ }
192
+ catch (err) {
193
+ const e2 = err instanceof YaliError ? err : new YaliError('CALL_FAILED', String(err), 'See the worker console.');
194
+ const path = err.path;
195
+ scope.postMessage({ type: 'yali:result', id: m.id, ok: false, error: { code: e2.code, message: e2.detail, fix: e2.fix, ...(typeof path === 'string' ? { path } : {}) } });
196
+ }
197
+ })();
198
+ break;
199
+ }
200
+ }
201
+ });
202
+ });
203
+ }
204
+ //# sourceMappingURL=worker-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-mode.js","sourceRoot":"","sources":["../src/worker-mode.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,50 @@
1
1
  {
2
2
  "name": "@yali-engine/render",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.4.0",
4
+ "description": "Yali's WebGPU render backend: device acquisition, the frame graph, and GPU-driven instanced drawing.",
5
+ "license": "MIT OR Apache-2.0",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./post": {
14
+ "types": "./dist/post.d.ts",
15
+ "default": "./dist/post.js"
16
+ },
17
+ "./meshlets": {
18
+ "types": "./dist/meshlets.d.ts",
19
+ "default": "./dist/meshlets.js"
20
+ },
21
+ "./meshlets-decoder": {
22
+ "types": "./dist/meshlets-decoder.d.ts",
23
+ "default": "./dist/meshlets-decoder.js"
24
+ },
25
+ "./pick-decoder": {
26
+ "types": "./dist/pick-decoder.d.ts",
27
+ "default": "./dist/pick-decoder.js"
28
+ },
29
+ "./occlusion": {
30
+ "types": "./dist/occlusion.d.ts",
31
+ "default": "./dist/occlusion.js"
32
+ }
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "files": [
38
+ "dist"
39
+ ],
40
+ "dependencies": {
41
+ "meshoptimizer": "1.3.0",
42
+ "@webgpu/types": "^0.1.60",
43
+ "@yali-engine/core": "0.4.0",
44
+ "@yali-engine/math": "0.4.0"
45
+ },
46
+ "scripts": {
47
+ "typecheck": "tsc -p tsconfig.json",
48
+ "test": "node --experimental-strip-types --no-warnings --test \"test/*.test.ts\""
49
+ }
6
50
  }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.