@nodetool-ai/game-renderer 0.8.1 → 0.8.3
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/README.md +46 -0
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/audio/mixer.d.ts +75 -0
- package/dist/audio/mixer.d.ts.map +1 -0
- package/dist/audio/mixer.js +345 -0
- package/dist/audio/mixer.js.map +1 -0
- package/dist/audio/player.d.ts +67 -0
- package/dist/audio/player.d.ts.map +1 -0
- package/dist/audio/player.js +337 -0
- package/dist/audio/player.js.map +1 -0
- package/dist/audio/spatial.d.ts +50 -0
- package/dist/audio/spatial.d.ts.map +1 -0
- package/dist/audio/spatial.js +166 -0
- package/dist/audio/spatial.js.map +1 -0
- package/dist/audio/voices.d.ts +11 -0
- package/dist/audio/voices.d.ts.map +1 -0
- package/dist/audio/voices.js +22 -0
- package/dist/audio/voices.js.map +1 -0
- package/dist/audio.d.ts +6 -38
- package/dist/audio.d.ts.map +1 -1
- package/dist/audio.js +3 -226
- package/dist/audio.js.map +1 -1
- package/dist/browser.d.ts +2 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -5
- package/dist/browser.js.map +1 -1
- package/dist/browser3d.d.ts +2 -0
- package/dist/browser3d.d.ts.map +1 -0
- package/dist/browser3d.js +2 -0
- package/dist/browser3d.js.map +1 -0
- package/dist/build-tauri.d.ts +69 -0
- package/dist/build-tauri.d.ts.map +1 -0
- package/dist/build-tauri.js +406 -0
- package/dist/build-tauri.js.map +1 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +29 -19
- package/dist/build.js.map +1 -1
- package/dist/build3d.d.ts +11 -0
- package/dist/build3d.d.ts.map +1 -0
- package/dist/build3d.js +126 -0
- package/dist/build3d.js.map +1 -0
- package/dist/canvas2d.d.ts +12 -3
- package/dist/canvas2d.d.ts.map +1 -1
- package/dist/canvas2d.js +59 -12
- package/dist/canvas2d.js.map +1 -1
- package/dist/fixed-tick-host.d.ts +10 -0
- package/dist/fixed-tick-host.d.ts.map +1 -0
- package/dist/fixed-tick-host.js +29 -0
- package/dist/fixed-tick-host.js.map +1 -0
- package/dist/frame-budget.d.ts +34 -0
- package/dist/frame-budget.d.ts.map +1 -0
- package/dist/frame-budget.js +52 -0
- package/dist/frame-budget.js.map +1 -0
- package/dist/frame.d.ts +20 -1
- package/dist/frame.d.ts.map +1 -1
- package/dist/frame.js +69 -1
- package/dist/frame.js.map +1 -1
- package/dist/game3d-capture-page.js +5834 -0
- package/dist/game3d-player.js +6001 -0
- package/dist/imageDiff.d.ts +9 -0
- package/dist/imageDiff.d.ts.map +1 -0
- package/dist/imageDiff.js +30 -0
- package/dist/imageDiff.js.map +1 -0
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/input-bindings.d.ts +76 -0
- package/dist/input-bindings.d.ts.map +1 -0
- package/dist/input-bindings.js +377 -0
- package/dist/input-bindings.js.map +1 -0
- package/dist/input.d.ts +1 -1
- package/dist/input.d.ts.map +1 -1
- package/dist/input.js +1 -14
- package/dist/input.js.map +1 -1
- package/dist/input3d.d.ts +3 -0
- package/dist/input3d.d.ts.map +1 -0
- package/dist/input3d.js +3 -0
- package/dist/input3d.js.map +1 -0
- package/dist/node.d.ts +5 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +28 -11
- package/dist/node.js.map +1 -1
- package/dist/node3d.d.ts +29 -0
- package/dist/node3d.d.ts.map +1 -0
- package/dist/node3d.js +160 -0
- package/dist/node3d.js.map +1 -0
- package/dist/particles/curves.d.ts +16 -0
- package/dist/particles/curves.d.ts.map +1 -0
- package/dist/particles/curves.js +49 -0
- package/dist/particles/curves.js.map +1 -0
- package/dist/particles/index.d.ts +6 -0
- package/dist/particles/index.d.ts.map +1 -0
- package/dist/particles/index.js +6 -0
- package/dist/particles/index.js.map +1 -0
- package/dist/particles/random.d.ts +10 -0
- package/dist/particles/random.d.ts.map +1 -0
- package/dist/particles/random.js +26 -0
- package/dist/particles/random.js.map +1 -0
- package/dist/particles/render2d.d.ts +40 -0
- package/dist/particles/render2d.d.ts.map +1 -0
- package/dist/particles/render2d.js +70 -0
- package/dist/particles/render2d.js.map +1 -0
- package/dist/particles/shapes.d.ts +18 -0
- package/dist/particles/shapes.d.ts.map +1 -0
- package/dist/particles/shapes.js +92 -0
- package/dist/particles/shapes.js.map +1 -0
- package/dist/particles/simulator.d.ts +88 -0
- package/dist/particles/simulator.d.ts.map +1 -0
- package/dist/particles/simulator.js +371 -0
- package/dist/particles/simulator.js.map +1 -0
- package/dist/player-v1.js +2502 -0
- package/dist/preparation3d.d.ts +3 -0
- package/dist/preparation3d.d.ts.map +1 -0
- package/dist/preparation3d.js +3 -0
- package/dist/preparation3d.js.map +1 -0
- package/dist/renderPipeline.d.ts +12 -0
- package/dist/renderPipeline.d.ts.map +1 -0
- package/dist/renderPipeline.js +17 -0
- package/dist/renderPipeline.js.map +1 -0
- package/dist/renderer3d/animation/index.d.ts +11 -0
- package/dist/renderer3d/animation/index.d.ts.map +1 -0
- package/dist/renderer3d/animation/index.js +212 -0
- package/dist/renderer3d/animation/index.js.map +1 -0
- package/dist/renderer3d/assets/cache.d.ts +14 -0
- package/dist/renderer3d/assets/cache.d.ts.map +1 -0
- package/dist/renderer3d/assets/cache.js +74 -0
- package/dist/renderer3d/assets/cache.js.map +1 -0
- package/dist/renderer3d/assets/dispose.d.ts +4 -0
- package/dist/renderer3d/assets/dispose.d.ts.map +1 -0
- package/dist/renderer3d/assets/dispose.js +41 -0
- package/dist/renderer3d/assets/dispose.js.map +1 -0
- package/dist/renderer3d/assets/hdri-contract.d.ts +23 -0
- package/dist/renderer3d/assets/hdri-contract.d.ts.map +1 -0
- package/dist/renderer3d/assets/hdri-contract.js +2 -0
- package/dist/renderer3d/assets/hdri-contract.js.map +1 -0
- package/dist/renderer3d/assets/instances.d.ts +5 -0
- package/dist/renderer3d/assets/instances.d.ts.map +1 -0
- package/dist/renderer3d/assets/instances.js +86 -0
- package/dist/renderer3d/assets/instances.js.map +1 -0
- package/dist/renderer3d/capture-driver-types.d.ts +42 -0
- package/dist/renderer3d/capture-driver-types.d.ts.map +1 -0
- package/dist/renderer3d/capture-driver-types.js +2 -0
- package/dist/renderer3d/capture-driver-types.js.map +1 -0
- package/dist/renderer3d/capture-page.d.ts +36 -0
- package/dist/renderer3d/capture-page.d.ts.map +1 -0
- package/dist/renderer3d/capture-page.js +68 -0
- package/dist/renderer3d/capture-page.js.map +1 -0
- package/dist/renderer3d/culling.d.ts +10 -0
- package/dist/renderer3d/culling.d.ts.map +1 -0
- package/dist/renderer3d/culling.js +27 -0
- package/dist/renderer3d/culling.js.map +1 -0
- package/dist/renderer3d/environment/index.d.ts +4 -0
- package/dist/renderer3d/environment/index.d.ts.map +1 -0
- package/dist/renderer3d/environment/index.js +9 -0
- package/dist/renderer3d/environment/index.js.map +1 -0
- package/dist/renderer3d/environment/sky.d.ts +45 -0
- package/dist/renderer3d/environment/sky.d.ts.map +1 -0
- package/dist/renderer3d/environment/sky.js +221 -0
- package/dist/renderer3d/environment/sky.js.map +1 -0
- package/dist/renderer3d/hud/fonts.d.ts +13 -0
- package/dist/renderer3d/hud/fonts.d.ts.map +1 -0
- package/dist/renderer3d/hud/fonts.js +69 -0
- package/dist/renderer3d/hud/fonts.js.map +1 -0
- package/dist/renderer3d/hud/paint.d.ts +4 -0
- package/dist/renderer3d/hud/paint.d.ts.map +1 -0
- package/dist/renderer3d/hud/paint.js +22 -0
- package/dist/renderer3d/hud/paint.js.map +1 -0
- package/dist/renderer3d/import.d.ts +34 -0
- package/dist/renderer3d/import.d.ts.map +1 -0
- package/dist/renderer3d/import.js +408 -0
- package/dist/renderer3d/import.js.map +1 -0
- package/dist/renderer3d/index.d.ts +74 -0
- package/dist/renderer3d/index.d.ts.map +1 -0
- package/dist/renderer3d/index.js +338 -0
- package/dist/renderer3d/index.js.map +1 -0
- package/dist/renderer3d/lights/index.d.ts +7 -0
- package/dist/renderer3d/lights/index.d.ts.map +1 -0
- package/dist/renderer3d/lights/index.js +67 -0
- package/dist/renderer3d/lights/index.js.map +1 -0
- package/dist/renderer3d/materials/index.d.ts +4 -0
- package/dist/renderer3d/materials/index.d.ts.map +1 -0
- package/dist/renderer3d/materials/index.js +8 -0
- package/dist/renderer3d/materials/index.js.map +1 -0
- package/dist/renderer3d/passes/post-processing.d.ts +44 -0
- package/dist/renderer3d/passes/post-processing.d.ts.map +1 -0
- package/dist/renderer3d/passes/post-processing.js +213 -0
- package/dist/renderer3d/passes/post-processing.js.map +1 -0
- package/dist/renderer3d/pipeline.d.ts +15 -0
- package/dist/renderer3d/pipeline.d.ts.map +1 -0
- package/dist/renderer3d/pipeline.js +10 -0
- package/dist/renderer3d/pipeline.js.map +1 -0
- package/dist/renderer3d/playwright-contract.d.ts +3 -0
- package/dist/renderer3d/playwright-contract.d.ts.map +1 -0
- package/dist/renderer3d/playwright-contract.js +4 -0
- package/dist/renderer3d/playwright-contract.js.map +1 -0
- package/dist/renderer3d/preparation.d.ts +79 -0
- package/dist/renderer3d/preparation.d.ts.map +1 -0
- package/dist/renderer3d/preparation.js +458 -0
- package/dist/renderer3d/preparation.js.map +1 -0
- package/dist/renderer3d/scene-sync.d.ts +8 -0
- package/dist/renderer3d/scene-sync.d.ts.map +1 -0
- package/dist/renderer3d/scene-sync.js +96 -0
- package/dist/renderer3d/scene-sync.js.map +1 -0
- package/dist/renderer3d/shadows/cascades.d.ts +40 -0
- package/dist/renderer3d/shadows/cascades.d.ts.map +1 -0
- package/dist/renderer3d/shadows/cascades.js +244 -0
- package/dist/renderer3d/shadows/cascades.js.map +1 -0
- package/dist/renderer3d/shadows/index.d.ts +44 -0
- package/dist/renderer3d/shadows/index.d.ts.map +1 -0
- package/dist/renderer3d/shadows/index.js +129 -0
- package/dist/renderer3d/shadows/index.js.map +1 -0
- package/dist/renderer3d/types.d.ts +18 -0
- package/dist/renderer3d/types.d.ts.map +1 -0
- package/dist/renderer3d/types.js +2 -0
- package/dist/renderer3d/types.js.map +1 -0
- package/dist/smoke.d.ts +15 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +138 -0
- package/dist/smoke.js.map +1 -0
- package/dist/standalone-player.d.ts +11 -1
- package/dist/standalone-player.d.ts.map +1 -1
- package/dist/standalone-player.js +67 -41
- package/dist/standalone-player.js.map +1 -1
- package/dist/standalone-player3d.d.ts +14 -0
- package/dist/standalone-player3d.d.ts.map +1 -0
- package/dist/standalone-player3d.js +255 -0
- package/dist/standalone-player3d.js.map +1 -0
- package/dist/touch-controls.d.ts +22 -8
- package/dist/touch-controls.d.ts.map +1 -1
- package/dist/touch-controls.js +88 -21
- package/dist/touch-controls.js.map +1 -1
- package/dist/ui/controller.d.ts +59 -0
- package/dist/ui/controller.d.ts.map +1 -0
- package/dist/ui/controller.js +201 -0
- package/dist/ui/controller.js.map +1 -0
- package/dist/ui/hud2d.d.ts +11 -0
- package/dist/ui/hud2d.d.ts.map +1 -0
- package/dist/ui/hud2d.js +25 -0
- package/dist/ui/hud2d.js.map +1 -0
- package/dist/ui/layout.d.ts +42 -0
- package/dist/ui/layout.d.ts.map +1 -0
- package/dist/ui/layout.js +182 -0
- package/dist/ui/layout.js.map +1 -0
- package/dist/ui/paint.d.ts +45 -0
- package/dist/ui/paint.d.ts.map +1 -0
- package/dist/ui/paint.js +121 -0
- package/dist/ui/paint.js.map +1 -0
- package/dist/webgpu/effects.d.ts +22 -0
- package/dist/webgpu/effects.d.ts.map +1 -0
- package/dist/webgpu/effects.js +69 -0
- package/dist/webgpu/effects.js.map +1 -0
- package/dist/webgpu/hud.d.ts +4 -0
- package/dist/webgpu/hud.d.ts.map +1 -0
- package/dist/webgpu/hud.js +27 -0
- package/dist/webgpu/hud.js.map +1 -0
- package/dist/webgpu/lighting.d.ts +4 -0
- package/dist/webgpu/lighting.d.ts.map +1 -0
- package/dist/webgpu/lighting.js +47 -0
- package/dist/webgpu/lighting.js.map +1 -0
- package/dist/webgpu/pipeline.d.ts +11 -0
- package/dist/webgpu/pipeline.d.ts.map +1 -0
- package/dist/webgpu/pipeline.js +11 -0
- package/dist/webgpu/pipeline.js.map +1 -0
- package/dist/webgpu/sprites.d.ts +6 -0
- package/dist/webgpu/sprites.d.ts.map +1 -0
- package/dist/webgpu/sprites.js +74 -0
- package/dist/webgpu/sprites.js.map +1 -0
- package/dist/webgpu/types.d.ts +14 -0
- package/dist/webgpu/types.d.ts.map +1 -0
- package/dist/webgpu/types.js +2 -0
- package/dist/webgpu/types.js.map +1 -0
- package/dist/webgpu.d.ts +4 -3
- package/dist/webgpu.d.ts.map +1 -1
- package/dist/webgpu.js +119 -279
- package/dist/webgpu.js.map +1 -1
- package/package.json +52 -10
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { access, constants, mkdir, mkdtemp, readdir, rename, rm, rmdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { delimiter, dirname, join, resolve } from "node:path";
|
|
5
|
+
import { createCanvas, loadImage } from "@napi-rs/canvas";
|
|
6
|
+
import { MissingRuntimePackageError } from "@nodetool-ai/protocol/missing-runtime-package";
|
|
7
|
+
/** Tauri releases the generated project pins. Bump the three together. */
|
|
8
|
+
export const TAURI_VERSIONS = { tauri: "2.12.1", tauriBuild: "2.7.1", cli: "2.12.1" };
|
|
9
|
+
const DEFAULT_PRODUCT_NAME = "NodeTool Game";
|
|
10
|
+
const DEFAULT_VERSION = "1.0.0";
|
|
11
|
+
const DEFAULT_WIDTH = 1280;
|
|
12
|
+
const DEFAULT_HEIGHT_2D = 800;
|
|
13
|
+
const MIN_WINDOW = { width: 480, height: 320 };
|
|
14
|
+
const MAX_WINDOW = 7680;
|
|
15
|
+
function slug(value) {
|
|
16
|
+
return value.normalize("NFKD").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48).replace(/-+$/, "");
|
|
17
|
+
}
|
|
18
|
+
function productName(value) {
|
|
19
|
+
// Installers use the name as a file name, so drop characters no platform allows there.
|
|
20
|
+
const cleaned = Array.from(value ?? "", (char) => {
|
|
21
|
+
const code = char.charCodeAt(0);
|
|
22
|
+
return code < 32 || code === 127 || '/\\:*?"<>|'.includes(char) ? " " : char;
|
|
23
|
+
}).join("").replace(/\s+/g, " ").trim().slice(0, 64).trim();
|
|
24
|
+
return cleaned || DEFAULT_PRODUCT_NAME;
|
|
25
|
+
}
|
|
26
|
+
function windowSize(value, fallback, minimum, label) {
|
|
27
|
+
if (value === undefined) {
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
30
|
+
if (!Number.isInteger(value) || value < minimum || value > MAX_WINDOW) {
|
|
31
|
+
throw new Error(`Window ${label} must be an integer from ${minimum} to ${MAX_WINDOW}`);
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
/** Resolves and validates the names, version and window size of an exported desktop app. */
|
|
36
|
+
export function tauriAppMetadata(document, app = {}) {
|
|
37
|
+
const name = productName(app.name);
|
|
38
|
+
const nameSlug = slug(name) || "game";
|
|
39
|
+
const identifier = app.identifier ?? `ai.nodetool.game.${/^[a-z]/.test(nameSlug) ? nameSlug : `game-${nameSlug}`}`;
|
|
40
|
+
if (!/^[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z0-9-]+)+$/.test(identifier) || identifier.length > 128 || /\.app$/i.test(identifier)) {
|
|
41
|
+
throw new Error("App identifier must be reverse-DNS, such as com.example.mygame, and must not end in .app");
|
|
42
|
+
}
|
|
43
|
+
const version = app.version ?? DEFAULT_VERSION;
|
|
44
|
+
const parts = /^(\d+)\.(\d+)\.(\d+)$/.exec(version);
|
|
45
|
+
// Windows MSI packages limit major and minor to 255 and patch to 65535.
|
|
46
|
+
if (!parts || Number(parts[1]) > 255 || Number(parts[2]) > 255 || Number(parts[3]) > 65535) {
|
|
47
|
+
throw new Error("App version must be MAJOR.MINOR.PATCH with major and minor at most 255 and patch at most 65535");
|
|
48
|
+
}
|
|
49
|
+
const width = windowSize(app.width, DEFAULT_WIDTH, MIN_WINDOW.width, "width");
|
|
50
|
+
const fallbackHeight = document.schemaVersion === 3
|
|
51
|
+
? Math.min(MAX_WINDOW, Math.max(MIN_WINDOW.height, Math.round(width / document.presentation.aspectRatio)))
|
|
52
|
+
: DEFAULT_HEIGHT_2D;
|
|
53
|
+
const height = windowSize(app.height, fallbackHeight, MIN_WINDOW.height, "height");
|
|
54
|
+
const crateName = /^[a-z]/.test(nameSlug) ? nameSlug : `game-${nameSlug}`;
|
|
55
|
+
return { productName: name, identifier, version, crateName, width, height, sourceRevision: document.revision,
|
|
56
|
+
dimension: document.schemaVersion === 3 ? "3d" : "2d" };
|
|
57
|
+
}
|
|
58
|
+
function drawDefaultIcon(context, size) {
|
|
59
|
+
const radius = size * 0.22;
|
|
60
|
+
const gradient = context.createLinearGradient(0, 0, size, size);
|
|
61
|
+
gradient.addColorStop(0, "#5b8cff");
|
|
62
|
+
gradient.addColorStop(1, "#7a3cff");
|
|
63
|
+
context.fillStyle = gradient;
|
|
64
|
+
context.beginPath();
|
|
65
|
+
context.roundRect(0, 0, size, size, radius);
|
|
66
|
+
context.fill();
|
|
67
|
+
context.fillStyle = "#ffffff";
|
|
68
|
+
context.beginPath();
|
|
69
|
+
context.moveTo(size * 0.38, size * 0.28);
|
|
70
|
+
context.lineTo(size * 0.76, size * 0.5);
|
|
71
|
+
context.lineTo(size * 0.38, size * 0.72);
|
|
72
|
+
context.closePath();
|
|
73
|
+
context.fill();
|
|
74
|
+
}
|
|
75
|
+
async function renderIcons(sizes, source) {
|
|
76
|
+
const image = source ? await loadImage(Buffer.from(source)) : null;
|
|
77
|
+
if (image && (image.width < 1 || image.height < 1)) {
|
|
78
|
+
throw new Error("App icon image is empty");
|
|
79
|
+
}
|
|
80
|
+
const icons = new Map();
|
|
81
|
+
for (const size of sizes) {
|
|
82
|
+
const canvas = createCanvas(size, size);
|
|
83
|
+
const context = canvas.getContext("2d");
|
|
84
|
+
if (image) {
|
|
85
|
+
// Cover the square so a non-square icon is cropped rather than letterboxed.
|
|
86
|
+
const scale = Math.max(size / image.width, size / image.height);
|
|
87
|
+
const width = image.width * scale;
|
|
88
|
+
const height = image.height * scale;
|
|
89
|
+
context.imageSmoothingQuality = "high";
|
|
90
|
+
context.drawImage(image, (size - width) / 2, (size - height) / 2, width, height);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
drawDefaultIcon(context, size);
|
|
94
|
+
}
|
|
95
|
+
icons.set(size, { size, png: new Uint8Array(await canvas.encode("png")), rgba: context.getImageData(0, 0, size, size).data });
|
|
96
|
+
}
|
|
97
|
+
return icons;
|
|
98
|
+
}
|
|
99
|
+
/** Windows icon: 32-bit BMP entries for small sizes, PNG for 256. */
|
|
100
|
+
function encodeIco(icons) {
|
|
101
|
+
const images = icons.map((icon) => {
|
|
102
|
+
if (icon.size >= 256) {
|
|
103
|
+
return icon.png;
|
|
104
|
+
}
|
|
105
|
+
const { size, rgba } = icon;
|
|
106
|
+
const maskStride = Math.ceil(size / 32) * 4;
|
|
107
|
+
const bytes = new Uint8Array(40 + size * size * 4 + maskStride * size);
|
|
108
|
+
const view = new DataView(bytes.buffer);
|
|
109
|
+
view.setUint32(0, 40, true);
|
|
110
|
+
view.setInt32(4, size, true);
|
|
111
|
+
view.setInt32(8, size * 2, true);
|
|
112
|
+
view.setUint16(12, 1, true);
|
|
113
|
+
view.setUint16(14, 32, true);
|
|
114
|
+
view.setUint32(20, size * size * 4 + maskStride * size, true);
|
|
115
|
+
for (let y = 0; y < size; y += 1) {
|
|
116
|
+
const row = size - 1 - y;
|
|
117
|
+
for (let x = 0; x < size; x += 1) {
|
|
118
|
+
const from = (row * size + x) * 4;
|
|
119
|
+
const to = 40 + (y * size + x) * 4;
|
|
120
|
+
bytes[to] = rgba[from + 2] ?? 0;
|
|
121
|
+
bytes[to + 1] = rgba[from + 1] ?? 0;
|
|
122
|
+
bytes[to + 2] = rgba[from] ?? 0;
|
|
123
|
+
bytes[to + 3] = rgba[from + 3] ?? 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// The AND mask stays zero: the alpha channel carries transparency.
|
|
127
|
+
return bytes;
|
|
128
|
+
});
|
|
129
|
+
const header = new Uint8Array(6 + 16 * icons.length);
|
|
130
|
+
const view = new DataView(header.buffer);
|
|
131
|
+
view.setUint16(2, 1, true);
|
|
132
|
+
view.setUint16(4, icons.length, true);
|
|
133
|
+
let offset = header.length;
|
|
134
|
+
icons.forEach((icon, index) => {
|
|
135
|
+
const entry = 6 + index * 16;
|
|
136
|
+
header[entry] = icon.size >= 256 ? 0 : icon.size;
|
|
137
|
+
header[entry + 1] = icon.size >= 256 ? 0 : icon.size;
|
|
138
|
+
view.setUint16(entry + 4, 1, true);
|
|
139
|
+
view.setUint16(entry + 6, 32, true);
|
|
140
|
+
view.setUint32(entry + 8, images[index]?.length ?? 0, true);
|
|
141
|
+
view.setUint32(entry + 12, offset, true);
|
|
142
|
+
offset += images[index]?.length ?? 0;
|
|
143
|
+
});
|
|
144
|
+
return Buffer.concat([header, ...images]);
|
|
145
|
+
}
|
|
146
|
+
/** macOS icon: PNG payloads under the ic07 to ic10 element types. */
|
|
147
|
+
function encodeIcns(entries) {
|
|
148
|
+
const chunks = entries.map(([type, png]) => {
|
|
149
|
+
const head = Buffer.alloc(8);
|
|
150
|
+
head.write(type, 0, "ascii");
|
|
151
|
+
head.writeUInt32BE(png.length + 8, 4);
|
|
152
|
+
return Buffer.concat([head, png]);
|
|
153
|
+
});
|
|
154
|
+
const head = Buffer.alloc(8);
|
|
155
|
+
head.write("icns", 0, "ascii");
|
|
156
|
+
head.writeUInt32BE(8 + chunks.reduce((total, chunk) => total + chunk.length, 0), 4);
|
|
157
|
+
return Buffer.concat([head, ...chunks]);
|
|
158
|
+
}
|
|
159
|
+
const ICON_FILES = ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.png", "icons/icon.icns", "icons/icon.ico"];
|
|
160
|
+
/** Every icon file the Tauri bundler and window need, keyed by path under `src-tauri/`. */
|
|
161
|
+
export async function tauriIconFiles(source) {
|
|
162
|
+
const icons = await renderIcons([16, 32, 48, 128, 256, 512, 1024], source);
|
|
163
|
+
const icon = (size) => {
|
|
164
|
+
const rendered = icons.get(size);
|
|
165
|
+
if (!rendered) {
|
|
166
|
+
throw new Error(`Icon size ${size} was not rendered`);
|
|
167
|
+
}
|
|
168
|
+
return rendered;
|
|
169
|
+
};
|
|
170
|
+
return {
|
|
171
|
+
"icons/32x32.png": icon(32).png,
|
|
172
|
+
"icons/128x128.png": icon(128).png,
|
|
173
|
+
"icons/128x128@2x.png": icon(256).png,
|
|
174
|
+
"icons/icon.png": icon(512).png,
|
|
175
|
+
"icons/icon.icns": encodeIcns([["ic07", icon(128).png], ["ic08", icon(256).png], ["ic09", icon(512).png], ["ic10", icon(1024).png]]),
|
|
176
|
+
"icons/icon.ico": encodeIco([icon(16), icon(32), icon(48), icon(256)])
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/** The text files of the Tauri project, keyed by path relative to the project root. */
|
|
180
|
+
export function tauriProjectFiles(metadata) {
|
|
181
|
+
const config = {
|
|
182
|
+
$schema: "https://schema.tauri.app/config/2",
|
|
183
|
+
productName: metadata.productName,
|
|
184
|
+
version: metadata.version,
|
|
185
|
+
identifier: metadata.identifier,
|
|
186
|
+
build: { frontendDist: "../dist" },
|
|
187
|
+
app: {
|
|
188
|
+
withGlobalTauri: false,
|
|
189
|
+
windows: [{
|
|
190
|
+
label: "main", title: metadata.productName, width: metadata.width, height: metadata.height,
|
|
191
|
+
minWidth: MIN_WINDOW.width, minHeight: MIN_WINDOW.height, center: true, resizable: true, focus: true,
|
|
192
|
+
// The player handles its own pointer and keyboard input, so file drops stay with the page.
|
|
193
|
+
dragDropEnabled: false
|
|
194
|
+
}],
|
|
195
|
+
// The player's index.html carries its own Content-Security-Policy meta tag.
|
|
196
|
+
security: { csp: null }
|
|
197
|
+
},
|
|
198
|
+
bundle: {
|
|
199
|
+
active: true,
|
|
200
|
+
targets: "all",
|
|
201
|
+
category: "Game",
|
|
202
|
+
shortDescription: metadata.productName,
|
|
203
|
+
icon: [...ICON_FILES]
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
const cargo = `[package]
|
|
207
|
+
name = ${JSON.stringify(metadata.crateName)}
|
|
208
|
+
version = ${JSON.stringify(metadata.version)}
|
|
209
|
+
description = ${JSON.stringify(`${metadata.productName}, exported from NodeTool`)}
|
|
210
|
+
edition = "2021"
|
|
211
|
+
publish = false
|
|
212
|
+
|
|
213
|
+
# Keeps the project standalone when it is unpacked inside another Cargo workspace.
|
|
214
|
+
[workspace]
|
|
215
|
+
|
|
216
|
+
[build-dependencies]
|
|
217
|
+
tauri-build = { version = "=${TAURI_VERSIONS.tauriBuild}", features = [] }
|
|
218
|
+
|
|
219
|
+
[dependencies]
|
|
220
|
+
tauri = { version = "=${TAURI_VERSIONS.tauri}", features = [] }
|
|
221
|
+
|
|
222
|
+
[features]
|
|
223
|
+
# Serve the bundled game from the app itself, so a plain \`cargo build --release\` runs standalone.
|
|
224
|
+
default = ["custom-protocol"]
|
|
225
|
+
custom-protocol = ["tauri/custom-protocol"]
|
|
226
|
+
|
|
227
|
+
[profile.release]
|
|
228
|
+
codegen-units = 1
|
|
229
|
+
lto = true
|
|
230
|
+
opt-level = "s"
|
|
231
|
+
panic = "abort"
|
|
232
|
+
strip = true
|
|
233
|
+
`;
|
|
234
|
+
const main = `// Hides the console window of a release build on Windows.
|
|
235
|
+
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
|
236
|
+
|
|
237
|
+
fn main() {
|
|
238
|
+
tauri::Builder::default()
|
|
239
|
+
.run(tauri::generate_context!())
|
|
240
|
+
.expect("error while running the game");
|
|
241
|
+
}
|
|
242
|
+
`;
|
|
243
|
+
const packageJson = {
|
|
244
|
+
name: metadata.crateName,
|
|
245
|
+
version: metadata.version,
|
|
246
|
+
private: true,
|
|
247
|
+
scripts: { tauri: "tauri", dev: "tauri dev", build: "tauri build" },
|
|
248
|
+
devDependencies: { "@tauri-apps/cli": TAURI_VERSIONS.cli }
|
|
249
|
+
};
|
|
250
|
+
const readme = `# ${metadata.productName}
|
|
251
|
+
|
|
252
|
+
A desktop build of a NodeTool ${metadata.dimension.toUpperCase()} game (revision \`${metadata.sourceRevision}\`), packaged with [Tauri](https://tauri.app) ${TAURI_VERSIONS.tauri}.
|
|
253
|
+
|
|
254
|
+
\`dist/\` holds the exported web player and its assets. \`src-tauri/\` is the native shell that opens it in a window.
|
|
255
|
+
|
|
256
|
+
## Build
|
|
257
|
+
|
|
258
|
+
Install Rust and the Tauri system dependencies for your platform: https://v2.tauri.app/start/prerequisites/
|
|
259
|
+
|
|
260
|
+
Installers (\`.msi\`/\`.exe\` on Windows, \`.app\`/\`.dmg\` on macOS, \`.deb\`/\`.rpm\`/\`.AppImage\` on Linux):
|
|
261
|
+
|
|
262
|
+
\`\`\`sh
|
|
263
|
+
npm install
|
|
264
|
+
npm run build
|
|
265
|
+
\`\`\`
|
|
266
|
+
|
|
267
|
+
They are written to \`src-tauri/target/release/bundle/\`.
|
|
268
|
+
|
|
269
|
+
A single executable without an installer:
|
|
270
|
+
|
|
271
|
+
\`\`\`sh
|
|
272
|
+
cd src-tauri
|
|
273
|
+
cargo build --release
|
|
274
|
+
\`\`\`
|
|
275
|
+
|
|
276
|
+
It is written to \`src-tauri/target/release/${metadata.crateName}\` (\`.exe\` on Windows).
|
|
277
|
+
|
|
278
|
+
## Change the app
|
|
279
|
+
|
|
280
|
+
The window size, title and identifier (\`${metadata.identifier}\`) are in \`src-tauri/tauri.conf.json\`. Replace the files in \`src-tauri/icons/\` to change the icon, or export again from NodeTool with a new icon.
|
|
281
|
+
`;
|
|
282
|
+
return {
|
|
283
|
+
"package.json": `${JSON.stringify(packageJson, null, 2)}\n`,
|
|
284
|
+
"README.md": readme,
|
|
285
|
+
".gitignore": "node_modules/\n",
|
|
286
|
+
"src-tauri/Cargo.toml": cargo,
|
|
287
|
+
"src-tauri/build.rs": "fn main() {\n tauri_build::build()\n}\n",
|
|
288
|
+
"src-tauri/src/main.rs": main,
|
|
289
|
+
"src-tauri/tauri.conf.json": `${JSON.stringify(config, null, 2)}\n`,
|
|
290
|
+
"src-tauri/.gitignore": "/target/\n/gen/schemas\n"
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/** Exports a game as a Tauri desktop project: the standalone web player plus a native shell around it. */
|
|
294
|
+
export async function buildTauriGameProject(options) {
|
|
295
|
+
options.signal?.throwIfAborted();
|
|
296
|
+
const metadata = tauriAppMetadata(options.document, options.app);
|
|
297
|
+
const icons = await tauriIconFiles(options.app?.icon);
|
|
298
|
+
const outputDir = resolve(options.outputDir);
|
|
299
|
+
await mkdir(dirname(outputDir), { recursive: true });
|
|
300
|
+
const staging = await mkdtemp(join(dirname(outputDir), ".nodetool-game-tauri-"));
|
|
301
|
+
try {
|
|
302
|
+
const webDir = join(staging, "dist");
|
|
303
|
+
if (options.document.schemaVersion === 3) {
|
|
304
|
+
const { buildStandaloneGame3D } = await import("./build3d.js");
|
|
305
|
+
await buildStandaloneGame3D({ document: options.document, outputDir: webDir, resolveAsset: options.resolveAsset, signal: options.signal });
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
const { buildStandaloneGame } = await import("./build.js");
|
|
309
|
+
await buildStandaloneGame({ document: options.document, outputDir: webDir, resolveAsset: (assetId) => options.resolveAsset(assetId, options.signal) });
|
|
310
|
+
}
|
|
311
|
+
options.signal?.throwIfAborted();
|
|
312
|
+
const files = { ...tauriProjectFiles(metadata) };
|
|
313
|
+
for (const [path, bytes] of Object.entries(icons)) {
|
|
314
|
+
files[`src-tauri/${path}`] = bytes;
|
|
315
|
+
}
|
|
316
|
+
for (const [path, content] of Object.entries(files)) {
|
|
317
|
+
await mkdir(dirname(join(staging, path)), { recursive: true });
|
|
318
|
+
await writeFile(join(staging, path), content);
|
|
319
|
+
}
|
|
320
|
+
options.signal?.throwIfAborted();
|
|
321
|
+
let existing;
|
|
322
|
+
try {
|
|
323
|
+
existing = await readdir(outputDir);
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
if (!(error instanceof Error) || !("code" in error) || error.code !== "ENOENT") {
|
|
327
|
+
throw error;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (existing && existing.length > 0) {
|
|
331
|
+
throw new Error(`Output directory is not empty: ${outputDir}`);
|
|
332
|
+
}
|
|
333
|
+
if (existing) {
|
|
334
|
+
await rmdir(outputDir);
|
|
335
|
+
}
|
|
336
|
+
await rename(staging, outputDir);
|
|
337
|
+
return { outputDir, webDir: join(outputDir, "dist"), tauriDir: join(outputDir, "src-tauri"), metadata };
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
await rm(staging, { recursive: true, force: true });
|
|
341
|
+
throw error;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async function executable(path) {
|
|
345
|
+
try {
|
|
346
|
+
await access(path, constants.X_OK);
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* The cargo to run: the first on PATH, else rustup's. An app started from the
|
|
355
|
+
* macOS Finder or a Windows shortcut has no shell profile, so rustup's
|
|
356
|
+
* `~/.cargo/bin` is often installed but missing from PATH.
|
|
357
|
+
*/
|
|
358
|
+
export async function findCargo(env = process.env, platform = process.platform) {
|
|
359
|
+
const name = platform === "win32" ? "cargo.exe" : "cargo";
|
|
360
|
+
const pathKey = Object.keys(env).find((key) => key.toUpperCase() === "PATH");
|
|
361
|
+
const directories = (pathKey ? env[pathKey] ?? "" : "").split(platform === "win32" ? ";" : delimiter).filter(Boolean);
|
|
362
|
+
const cargoHome = env["CARGO_HOME"] || join(env["HOME"] || env["USERPROFILE"] || homedir(), ".cargo");
|
|
363
|
+
for (const directory of [...directories, join(cargoHome, "bin")]) {
|
|
364
|
+
const candidate = join(directory, name);
|
|
365
|
+
if (await executable(candidate)) {
|
|
366
|
+
return candidate;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
const MISSING_CARGO = "cargo was not found. Install Rust from the Package Manager, or from https://rustup.rs, to compile the desktop app.";
|
|
372
|
+
/** Compiles an exported project into a release executable with `cargo build --release`. */
|
|
373
|
+
export async function compileTauriGameProject(project, options = {}) {
|
|
374
|
+
const env = options.env ?? process.env;
|
|
375
|
+
const cargo = options.cargo ?? await findCargo(env);
|
|
376
|
+
if (!cargo) {
|
|
377
|
+
throw new MissingRuntimePackageError(MISSING_CARGO, "rust");
|
|
378
|
+
}
|
|
379
|
+
await new Promise((resolvePromise, reject) => {
|
|
380
|
+
const child = spawn(cargo, ["build", "--release"], { cwd: project.tauriDir, env, signal: options.signal,
|
|
381
|
+
stdio: ["ignore", "pipe", "pipe"] });
|
|
382
|
+
let tail = "";
|
|
383
|
+
const collect = (chunk) => {
|
|
384
|
+
const text = chunk.toString("utf8");
|
|
385
|
+
tail = (tail + text).slice(-4000);
|
|
386
|
+
options.onOutput?.(text);
|
|
387
|
+
};
|
|
388
|
+
child.stdout.on("data", collect);
|
|
389
|
+
child.stderr.on("data", collect);
|
|
390
|
+
child.on("error", (error) => {
|
|
391
|
+
reject("code" in error && error.code === "ENOENT" ? new MissingRuntimePackageError(MISSING_CARGO, "rust", { cause: error }) : error);
|
|
392
|
+
});
|
|
393
|
+
child.on("close", (code) => {
|
|
394
|
+
if (code === 0) {
|
|
395
|
+
resolvePromise();
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
reject(new Error(`cargo build failed with exit code ${code}\n${tail}`));
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
const targetDir = env["CARGO_TARGET_DIR"] ? resolve(project.tauriDir, env["CARGO_TARGET_DIR"]) : join(project.tauriDir, "target");
|
|
403
|
+
const binaryName = process.platform === "win32" ? `${project.metadata.crateName}.exe` : project.metadata.crateName;
|
|
404
|
+
return { binaryPath: join(targetDir, "release", binaryName) };
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=build-tauri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-tauri.js","sourceRoot":"","sources":["../src/build-tauri.ts"],"names":[],"mappings":"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"}
|
package/dist/build.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAK1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD;AA4HD,6EAA6E;AAC7E,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA8G3G"}
|
package/dist/build.js
CHANGED
|
@@ -4,6 +4,7 @@ import { mkdir, mkdtemp, readFile, readdir, rename, rm, rmdir, writeFile } from
|
|
|
4
4
|
import { dirname, join, resolve } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
import { build } from "esbuild";
|
|
7
|
+
import { resolvePackageAssetPath } from "@nodetool-ai/config";
|
|
7
8
|
import { GlobalFonts } from "@napi-rs/canvas";
|
|
8
9
|
import { createCanvas, loadImage } from "@napi-rs/canvas";
|
|
9
10
|
import { validateGame } from "@nodetool-ai/game-runtime";
|
|
@@ -100,7 +101,33 @@ body.touch .touch-layer{display:block;position:fixed;inset:0;z-index:2;pointer-e
|
|
|
100
101
|
.touch-buttons{position:absolute;right:max(1.25rem,env(safe-area-inset-right));bottom:max(1.25rem,env(safe-area-inset-bottom));display:flex;flex-direction:column-reverse;gap:1rem;pointer-events:auto}
|
|
101
102
|
.touch-button{width:5.25rem;height:5.25rem;border-radius:50%;border:2px solid #fff6;background:#ffffff1f;color:#fff;font:600 .8rem system-ui,sans-serif;letter-spacing:.05em;touch-action:none;box-shadow:0 0 1.25rem #0008}
|
|
102
103
|
.touch-button.active{background:#ffffff59;transform:scale(.94)}
|
|
104
|
+
.touch-layer[data-pointer=mouse] *{pointer-events:none}
|
|
103
105
|
@media (orientation:portrait){body.touch.landscape-game .rotate{display:flex;position:fixed;inset:0;z-index:4;align-items:center;justify-content:center;padding:2rem;text-align:center;font-size:1.25rem;background:#000e}}`;
|
|
106
|
+
async function playerBundle() {
|
|
107
|
+
const sourceEntry = fileURLToPath(new URL("./standalone-player.ts", import.meta.url));
|
|
108
|
+
const compiledEntry = fileURLToPath(new URL("./standalone-player.js", import.meta.url));
|
|
109
|
+
if (!existsSync(sourceEntry) && !existsSync(compiledEntry)) {
|
|
110
|
+
return readFile(resolvePackageAssetPath({ pkg: "@nodetool-ai/game-renderer", path: PLAYER_FILE }, import.meta.url));
|
|
111
|
+
}
|
|
112
|
+
const entry = existsSync(sourceEntry) ? sourceEntry : compiledEntry;
|
|
113
|
+
const bundled = await build({
|
|
114
|
+
entryPoints: [entry],
|
|
115
|
+
outfile: PLAYER_FILE,
|
|
116
|
+
bundle: true,
|
|
117
|
+
platform: "browser",
|
|
118
|
+
format: "esm",
|
|
119
|
+
target: "es2022",
|
|
120
|
+
minify: true,
|
|
121
|
+
write: false,
|
|
122
|
+
conditions: ["nodetool-dev"],
|
|
123
|
+
logLevel: "silent",
|
|
124
|
+
});
|
|
125
|
+
const player = bundled.outputFiles?.[0];
|
|
126
|
+
if (!player) {
|
|
127
|
+
throw new Error("Standalone player bundle was empty");
|
|
128
|
+
}
|
|
129
|
+
return player.contents;
|
|
130
|
+
}
|
|
104
131
|
/** Builds a self-contained web player with local content-addressed media. */
|
|
105
132
|
export async function buildStandaloneGame(options) {
|
|
106
133
|
const validation = validateGame(options.document);
|
|
@@ -112,24 +139,7 @@ export async function buildStandaloneGame(options) {
|
|
|
112
139
|
await mkdir(dirname(outputDir), { recursive: true });
|
|
113
140
|
const staging = await mkdtemp(join(dirname(outputDir), ".nodetool-game-build-"));
|
|
114
141
|
try {
|
|
115
|
-
const
|
|
116
|
-
const entry = existsSync(sourceEntry) ? sourceEntry : fileURLToPath(new URL("./standalone-player.js", import.meta.url));
|
|
117
|
-
const bundled = await build({
|
|
118
|
-
entryPoints: [entry],
|
|
119
|
-
outfile: PLAYER_FILE,
|
|
120
|
-
bundle: true,
|
|
121
|
-
platform: "browser",
|
|
122
|
-
format: "esm",
|
|
123
|
-
target: "es2022",
|
|
124
|
-
minify: true,
|
|
125
|
-
write: false,
|
|
126
|
-
conditions: ["nodetool-dev"],
|
|
127
|
-
logLevel: "silent",
|
|
128
|
-
});
|
|
129
|
-
const player = bundled.outputFiles?.[0];
|
|
130
|
-
if (!player) {
|
|
131
|
-
throw new Error("Standalone player bundle was empty");
|
|
132
|
-
}
|
|
142
|
+
const player = await playerBundle();
|
|
133
143
|
const wasmPath = fileURLToPath(import.meta.resolve("@jitl/quickjs-ng-wasmfile-release-sync/wasm"));
|
|
134
144
|
const scriptRuntime = await readFile(wasmPath);
|
|
135
145
|
const exportedAssets = {};
|
|
@@ -207,7 +217,7 @@ export async function buildStandaloneGame(options) {
|
|
|
207
217
|
writeFile(join(staging, "index.html"), html()),
|
|
208
218
|
writeFile(join(staging, "style.css"), CSS),
|
|
209
219
|
writeFile(join(staging, "game.json"), JSON.stringify(exportedDocument)),
|
|
210
|
-
writeFile(join(staging, PLAYER_FILE), player
|
|
220
|
+
writeFile(join(staging, PLAYER_FILE), player),
|
|
211
221
|
writeFile(join(staging, "emscripten-module.wasm"), scriptRuntime),
|
|
212
222
|
]);
|
|
213
223
|
let existing;
|
package/dist/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type GameDocument3D } from "@nodetool-ai/protocol";
|
|
2
|
+
import type { StandaloneAsset, StandaloneGameBuild } from "./build.js";
|
|
3
|
+
export interface BuildStandaloneGame3DOptions {
|
|
4
|
+
readonly document: GameDocument3D;
|
|
5
|
+
readonly outputDir: string;
|
|
6
|
+
readonly resolveAsset: (sourceAssetId: string, signal?: AbortSignal) => Promise<StandaloneAsset | null>;
|
|
7
|
+
readonly signal?: AbortSignal;
|
|
8
|
+
}
|
|
9
|
+
/** Atomically exports verified model/collider content and all runtime code for static HTTP serving. */
|
|
10
|
+
export declare function buildStandaloneGame3D(options: BuildStandaloneGame3DOptions): Promise<StandaloneGameBuild>;
|
|
11
|
+
//# sourceMappingURL=build3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build3d.d.ts","sourceRoot":"","sources":["../src/build3d.ts"],"names":[],"mappings":"AAOA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGvE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACxG,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAoBD,uGAAuG;AACvG,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA8D/G"}
|