@hypersoniclabs/helix-cli 0.1.27-helix3.558 → 0.1.27-helix3.560

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 (37) hide show
  1. package/dist/city/convert/closure.d.ts +57 -0
  2. package/dist/city/convert/closure.js +385 -0
  3. package/dist/city/convert/closure.js.map +1 -0
  4. package/dist/city/convert/optimizations.js +2 -0
  5. package/dist/city/convert/optimizations.js.map +1 -1
  6. package/dist/city/convert/packs.d.ts +68 -0
  7. package/dist/city/convert/packs.js +99 -0
  8. package/dist/city/convert/packs.js.map +1 -0
  9. package/dist/city/convert/packsStage.d.ts +42 -0
  10. package/dist/city/convert/packsStage.js +132 -0
  11. package/dist/city/convert/packsStage.js.map +1 -0
  12. package/dist/city/convert/stages.d.ts +18 -1
  13. package/dist/city/convert/stages.js +18 -4
  14. package/dist/city/convert/stages.js.map +1 -1
  15. package/dist/cs2/convert/buildingPrototypes.d.ts +30 -4
  16. package/dist/cs2/convert/buildingPrototypes.js +127 -58
  17. package/dist/cs2/convert/buildingPrototypes.js.map +1 -1
  18. package/dist/cs2/csm2.d.ts +10 -0
  19. package/dist/cs2/csm2.js +52 -1
  20. package/dist/cs2/csm2.js.map +1 -1
  21. package/dist/tsconfig.build.tsbuildinfo +1 -1
  22. package/package.json +1 -1
  23. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  24. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  25. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  26. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  27. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  28. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  29. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  30. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  31. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  32. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  33. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  34. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  35. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  36. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  37. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
@@ -0,0 +1,57 @@
1
+ type Vec3 = [number, number, number];
2
+ /** The shell's first-playable radii (engine example granit-city, src/main.ts FIRST_PLAYABLE_CELLS_M / FIRST_PLAYABLE_HLOD_M). */
3
+ export declare const FIRST_PLAYABLE: {
4
+ readonly cellsM: 300;
5
+ readonly hlodM: 900;
6
+ };
7
+ /** The city-material slots only the high tier loads (engine systems/scene/src/materials/city/params.ts CITY_LIBRARY_HIGH_ONLY). */
8
+ export declare const CITY_LIBRARY_HIGH_ONLY: ReadonlySet<string>;
9
+ /**
10
+ * How far from the player the placements system keeps regions: `structuralDistanceM + 64` of the tier's quality (engine
11
+ * systems/scene/src/placements/types.ts, `high` 576 on a desktop, `low` 320 on a phone). Measured on Granit: desktop regions are in the
12
+ * startup packs out to 627 m of the spawn and absent from 644 m.
13
+ */
14
+ export declare const PLACEMENT_REACH_M: {
15
+ readonly desktop: 640;
16
+ readonly mobile: 384;
17
+ };
18
+ export declare const SCENE_DOCUMENT = "scene.helix-scene.json";
19
+ /** Where the predictor reads the published tree from: paths are relative to the data prefix's `scene/` folder. */
20
+ export interface PackSource {
21
+ read(path: string): Promise<Buffer | null>;
22
+ size(path: string): Promise<number | null>;
23
+ }
24
+ /** A publish tree on disk (`<out>/publish/scene`); symlinked part folders resolve like any other path. */
25
+ export declare function directoryPackSource(sceneDir: string): PackSource;
26
+ export type PredictedPhase = 'critical' | 'deferred';
27
+ export interface PredictedFile {
28
+ /** Relative to `scene/` (the pack index key). */
29
+ path: string;
30
+ /** Decoded bytes, from the document (the sealed `bytes` of the resource), else the file. */
31
+ bytes: number;
32
+ /** Content digest from the document; absent for files that are not Scene resources (mounted child documents). */
33
+ sha256?: string;
34
+ /** The class that put it in the set (kept in the receipt, so a wrong class is visible). */
35
+ why: string;
36
+ }
37
+ export interface StartupPrediction {
38
+ /** The root folder name, e.g. `granit-c1`. */
39
+ root: string;
40
+ tier: 'desktop' | 'mobile';
41
+ spawn: Vec3;
42
+ streamRadiusM: number;
43
+ /** Files the first frame waits for on a path of its own (the ocean), fetched ahead of the packs. */
44
+ early: PredictedFile[];
45
+ /** The root document and its pin: fetched by the shell before the packs and never inside one, but part of the first-play transfer. */
46
+ documents: PredictedFile[];
47
+ critical: PredictedFile[];
48
+ deferred: PredictedFile[];
49
+ warnings: string[];
50
+ }
51
+ export interface PredictOptions {
52
+ tier?: 'desktop' | 'mobile';
53
+ /** Override the first-playable HLOD radius (default 900 m, the shell's). */
54
+ hlodRadiusM?: number;
55
+ }
56
+ export declare function predictStartup(source: PackSource, root: string, options?: PredictOptions): Promise<StartupPrediction>;
57
+ export {};
@@ -0,0 +1,385 @@
1
+ "use strict";
2
+ // The startup set of a converted city, predicted from its sealed Scene documents with no browser trace.
3
+ //
4
+ // WHY. A cold CDN point of presence pays an origin round trip for every small file a first visit asks for (~370 on Granit). Granit
5
+ // lays that set end to end into a few startup packs (engine example granit-city: src/startupPacks.ts, scripts/pack-startup.mjs), but
6
+ // it cuts the set by hand from a measured browser trace of the published World. A converter that publishes the next map has no such
7
+ // trace, so this module predicts the set from the documents alone.
8
+ //
9
+ // WHAT. CRITICAL is what the first reconcile of the shell asks for before it reveals; DEFERRED is what the streamer asks right
10
+ // after (the rest of the skyline, the far trees, the sharper HLOD refinement). Both are lists of paths relative to the data
11
+ // prefix's `scene/` folder, the keys of the pack index. The class list below is the engine's own first-playable closure
12
+ // (helix-manifest src/scene-perf/rules.ts `firstPlayableBytes`, ported here because the manifest does not export its context:
13
+ // `eagerGroupIds`, `residentGroupsAt`, `groupResourceIds`, `expandDependencies` and the near-region test, each marked "port") plus the
14
+ // classes the manifest rule cannot see and the loader asks for first (mounted child documents, the city-material library, the
15
+ // HLOD of the first-playable radius, the distant-tree pages), each calibrated against Granit's measured index (see
16
+ // docs/city-convert-cs2.md, "Startup packs"). Nothing here is Granit-specific: every number is a document field or a shell default.
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.SCENE_DOCUMENT = exports.PLACEMENT_REACH_M = exports.CITY_LIBRARY_HIGH_ONLY = exports.FIRST_PLAYABLE = void 0;
19
+ exports.directoryPackSource = directoryPackSource;
20
+ exports.predictStartup = predictStartup;
21
+ const node_path_1 = require("node:path");
22
+ const promises_1 = require("node:fs/promises");
23
+ const glb_1 = require("../../scenePerf/glb");
24
+ /** The shell's first-playable radii (engine example granit-city, src/main.ts FIRST_PLAYABLE_CELLS_M / FIRST_PLAYABLE_HLOD_M). */
25
+ exports.FIRST_PLAYABLE = { cellsM: 300, hlodM: 900 };
26
+ /** The city-material slots only the high tier loads (engine systems/scene/src/materials/city/params.ts CITY_LIBRARY_HIGH_ONLY). */
27
+ exports.CITY_LIBRARY_HIGH_ONLY = new Set(['wallsHao', 'interiors', 'asphaltDecals']);
28
+ /**
29
+ * How far from the player the placements system keeps regions: `structuralDistanceM + 64` of the tier's quality (engine
30
+ * systems/scene/src/placements/types.ts, `high` 576 on a desktop, `low` 320 on a phone). Measured on Granit: desktop regions are in the
31
+ * startup packs out to 627 m of the spawn and absent from 644 m.
32
+ */
33
+ exports.PLACEMENT_REACH_M = { desktop: 640, mobile: 384 };
34
+ exports.SCENE_DOCUMENT = 'scene.helix-scene.json';
35
+ /** A publish tree on disk (`<out>/publish/scene`); symlinked part folders resolve like any other path. */
36
+ function directoryPackSource(sceneDir) {
37
+ const full = (path) => {
38
+ const clean = node_path_1.posix.normalize(path);
39
+ return clean.startsWith('..') || clean.startsWith('/') ? null : node_path_1.posix.join(sceneDir.split('\\').join('/'), clean);
40
+ };
41
+ return {
42
+ async read(path) { const f = full(path); if (!f)
43
+ return null; try {
44
+ return await (0, promises_1.readFile)(f);
45
+ }
46
+ catch {
47
+ return null;
48
+ } },
49
+ async size(path) { const f = full(path); if (!f)
50
+ return null; try {
51
+ const s = await (0, promises_1.stat)(f);
52
+ return s.isFile() ? s.size : null;
53
+ }
54
+ catch {
55
+ return null;
56
+ } },
57
+ };
58
+ }
59
+ function loadDoc(folder, scene) {
60
+ const resources = new Map(scene.resources.map((r) => [r.id, r]));
61
+ const byPath = new Map();
62
+ const textureByName = new Map();
63
+ for (const resource of scene.resources) {
64
+ if (resource.source.kind !== 'bundle')
65
+ continue;
66
+ const path = node_path_1.posix.join(folder, resource.source.uri);
67
+ byPath.set(path, resource);
68
+ if (resource.kind === 'texture')
69
+ textureByName.set(node_path_1.posix.basename(path), [...(textureByName.get(node_path_1.posix.basename(path)) ?? []), { resource, path }]);
70
+ }
71
+ return { folder, scene, resources, byPath, textureByName };
72
+ }
73
+ async function readScene(source, folder) {
74
+ const bytes = await source.read(node_path_1.posix.join(folder, exports.SCENE_DOCUMENT));
75
+ if (!bytes)
76
+ return null;
77
+ const scene = JSON.parse(bytes.toString('utf8'));
78
+ return scene?.format === 'helix.scene' && scene.version === 2 ? scene : null;
79
+ }
80
+ // ---- port of helix-manifest src/scene-perf/context.ts -----------------------------------------------------------------------
81
+ const groupClosure = (groups, id) => {
82
+ const closure = new Set();
83
+ const pending = [id];
84
+ while (pending.length) {
85
+ const current = pending.pop();
86
+ if (!current || closure.has(current))
87
+ continue;
88
+ closure.add(current);
89
+ pending.push(...(groups.get(current)?.dependencies ?? []));
90
+ }
91
+ return closure;
92
+ };
93
+ const boundsFinite = (b) => !!b && b.min.every(Number.isFinite) && b.max.every(Number.isFinite);
94
+ function distanceToBounds(point, bounds) {
95
+ let sum = 0;
96
+ for (let axis = 0; axis < 3; axis += 1) {
97
+ const d = Math.max(bounds.min[axis] - point[axis], 0, point[axis] - bounds.max[axis]);
98
+ sum += d * d;
99
+ }
100
+ return Math.sqrt(sum);
101
+ }
102
+ /** Ground-plane distance (HLOD clusters span the full height of their buildings, which says nothing about how far they are). */
103
+ function planarDistanceToBounds(point, bounds) {
104
+ const dx = Math.max(bounds.min[0] - point[0], 0, point[0] - bounds.max[0]);
105
+ const dz = Math.max(bounds.min[2] - point[2], 0, point[2] - bounds.max[2]);
106
+ return Math.hypot(dx, dz);
107
+ }
108
+ function transformedBounds(bounds, t) {
109
+ const [qx, qy, qz, qw] = t.rotation;
110
+ const min = [Infinity, Infinity, Infinity];
111
+ const max = [-Infinity, -Infinity, -Infinity];
112
+ for (let corner = 0; corner < 8; corner += 1) {
113
+ const x = (corner & 1 ? bounds.max[0] : bounds.min[0]) * t.scale[0];
114
+ const y = (corner & 2 ? bounds.max[1] : bounds.min[1]) * t.scale[1];
115
+ const z = (corner & 4 ? bounds.max[2] : bounds.min[2]) * t.scale[2];
116
+ const tx = 2 * (qy * z - qz * y);
117
+ const ty = 2 * (qz * x - qx * z);
118
+ const tz = 2 * (qx * y - qy * x);
119
+ const world = [x + qw * tx + (qy * tz - qz * ty) + t.position[0], y + qw * ty + (qz * tx - qx * tz) + t.position[1], z + qw * tz + (qx * ty - qy * tx) + t.position[2]];
120
+ for (let axis = 0; axis < 3; axis += 1) {
121
+ min[axis] = Math.min(min[axis], world[axis]);
122
+ max[axis] = Math.max(max[axis], world[axis]);
123
+ }
124
+ }
125
+ return { min, max };
126
+ }
127
+ function distanceToGroup(point, group) {
128
+ const boxes = group.activation?.volumes?.length
129
+ ? group.activation.volumes.map((v) => transformedBounds(v.bounds, v.transform))
130
+ : group.cells.map((c) => c.bounds);
131
+ let best = Infinity;
132
+ for (const box of boxes)
133
+ if (boundsFinite(box))
134
+ best = Math.min(best, distanceToBounds(point, box));
135
+ return best;
136
+ }
137
+ /** port: eagerGroupIds + residentGroupsAt (context.ts), for one document and one point. */
138
+ function residency(scene, spawn) {
139
+ const profileId = scene.profiles.world ? 'world' : Object.keys(scene.profiles ?? {})[0];
140
+ const profile = scene.profiles[profileId];
141
+ const root = scene.scenes.find((s) => s.id === profile?.scene) ?? { id: '', nodes: [], streamGroups: [] };
142
+ const groups = new Map(scene.streamGroups.map((g) => [g.id, g]));
143
+ const rootGroupIds = new Set(root.streamGroups);
144
+ const rootGroups = scene.streamGroups.filter((g) => rootGroupIds.has(g.id));
145
+ const rootNodes = scene.nodes.filter((n) => rootGroupIds.has(n.streamGroup));
146
+ const streamRadiusM = profile?.runtimePolicy?.streamRadiusM ?? 0;
147
+ const eager = new Set();
148
+ for (const g of rootGroups)
149
+ if (g.mode === 'eager')
150
+ for (const id of groupClosure(groups, g.id))
151
+ eager.add(id);
152
+ const resident = new Set();
153
+ for (const g of rootGroups) {
154
+ const reach = g.mode === 'portal' ? (g.activation?.distanceM ?? 0) : (g.activation?.distanceM ?? streamRadiusM);
155
+ if (g.mode === 'eager' || distanceToGroup(spawn, g) <= reach)
156
+ for (const id of groupClosure(groups, g.id))
157
+ resident.add(id);
158
+ }
159
+ return { eager, resident, rootGroups, rootNodes, streamRadiusM };
160
+ }
161
+ // ---- the predictor ----------------------------------------------------------------------------------------------------------
162
+ class SetBuilder {
163
+ critical = new Map();
164
+ deferred = new Map();
165
+ early = new Map();
166
+ /** Adds to a phase; a file already critical stays critical, one already deferred is promoted when added as critical. */
167
+ put(phase, file) {
168
+ if (phase === 'critical') {
169
+ if (this.critical.has(file.path))
170
+ return;
171
+ this.deferred.delete(file.path);
172
+ this.critical.set(file.path, file);
173
+ }
174
+ else if (!this.critical.has(file.path) && !this.deferred.has(file.path))
175
+ this.deferred.set(file.path, file);
176
+ }
177
+ }
178
+ async function predictStartup(source, root, options = {}) {
179
+ const tier = options.tier ?? 'desktop';
180
+ const hlodRadiusM = options.hlodRadiusM ?? exports.FIRST_PLAYABLE.hlodM;
181
+ const warnings = [];
182
+ const rootScene = await readScene(source, root);
183
+ if (!rootScene)
184
+ throw new Error(`startup packs: ${node_path_1.posix.join(root, exports.SCENE_DOCUMENT)} is not a readable Scene v2 document`);
185
+ const spawns = rootScene.spawns?.length ? rootScene.spawns.map((s) => s.position) : [centre(rootScene.placement.bounds)];
186
+ const spawn = spawns[0];
187
+ const docs = [loadDoc(root, rootScene)];
188
+ const out = new SetBuilder();
189
+ const streamRadiusM = residency(rootScene, spawn).streamRadiusM;
190
+ // 1. The mounted child documents: the shell prefetches them first, `../<sha>/scene.helix-scene.json` of the root.
191
+ for (const mount of rootScene.mounts ?? []) {
192
+ const folder = mount.integrity.sha256;
193
+ const scene = await readScene(source, folder);
194
+ if (!scene) {
195
+ warnings.push(`mounted child ${folder} (${mount.id}) has no readable document`);
196
+ continue;
197
+ }
198
+ docs.push(loadDoc(folder, scene));
199
+ out.put('critical', { path: node_path_1.posix.join(folder, exports.SCENE_DOCUMENT), bytes: (await source.size(node_path_1.posix.join(folder, exports.SCENE_DOCUMENT))) ?? 0, sha256: folder, why: 'mounted-document' });
200
+ }
201
+ // Dependencies of a GLB: the external images it names (port: expandDependencies, with the facts byteRules.ts collects).
202
+ const depCache = new Map();
203
+ const dependencies = async (doc, resource) => {
204
+ if (resource.kind !== 'model' || resource.mimeType !== 'model/gltf-binary' || resource.source.kind !== 'bundle')
205
+ return [];
206
+ const path = node_path_1.posix.join(doc.folder, resource.source.uri);
207
+ let names = depCache.get(path);
208
+ if (!names) {
209
+ names = [];
210
+ const bytes = await source.read(path);
211
+ const glb = bytes ? (0, glb_1.inspectGlb)(bytes) : null;
212
+ if (!bytes)
213
+ warnings.push(`${path} is missing`);
214
+ for (const image of glb?.images ?? []) {
215
+ if (!image.uri || image.uri.startsWith('data:'))
216
+ continue;
217
+ const name = decodeURIComponent(image.uri);
218
+ const direct = node_path_1.posix.normalize(node_path_1.posix.join(node_path_1.posix.dirname(path), name));
219
+ if (doc.byPath.has(direct)) {
220
+ if (!names.includes(direct))
221
+ names.push(direct);
222
+ continue;
223
+ }
224
+ // A bare texture name names a shared texture resource by its file name, and the loader may resolve it in any mounted part (the
225
+ // parts each keep a copy, and which copy a load picks varies from run to run): take every texture of that name.
226
+ for (const other of [doc, ...docs.filter((d) => d !== doc)]) {
227
+ for (const named of other.textureByName.get(node_path_1.posix.basename(name)) ?? [])
228
+ if (!names.includes(named.path))
229
+ names.push(named.path);
230
+ }
231
+ }
232
+ depCache.set(path, names);
233
+ }
234
+ return names.map((p) => { const owner = docs.find((d) => d.byPath.has(p)) ?? doc; return { doc: owner, resource: owner.byPath.get(p), path: p }; });
235
+ };
236
+ const add = async (phase, doc, id, why) => {
237
+ if (!id)
238
+ return;
239
+ const resource = doc.resources.get(id);
240
+ if (!resource || resource.source.kind !== 'bundle')
241
+ return;
242
+ const path = node_path_1.posix.join(doc.folder, resource.source.uri);
243
+ out.put(phase, { path, bytes: resource.bytes ?? (await source.size(path)) ?? 0, sha256: resource.integrity.sha256, why });
244
+ for (const dep of await dependencies(doc, resource)) {
245
+ out.put(phase, { path: dep.path, bytes: dep.resource.bytes ?? (await source.size(dep.path)) ?? 0, sha256: dep.resource.integrity.sha256, why: `${why}:dependency` });
246
+ }
247
+ };
248
+ for (const doc of docs) {
249
+ const scene = doc.scene;
250
+ // Each document streams by its OWN profile radius (a mounted building part is 128 m on a desktop root, 48 m on a phone root).
251
+ const { eager, resident, rootNodes, streamRadiusM: docRadiusM } = residency(scene, spawn);
252
+ // 2. The city-material library and the slots the tier loads (the shell prefetches them with the mounts).
253
+ const ext = (scene.runtimeExtensions ?? []).find((e) => typeof e.extension === 'string' && e.extension.startsWith('web.city-materials'));
254
+ const libraryId = ext && typeof ext.parameters?.library === 'string' ? ext.parameters.library : undefined;
255
+ if (libraryId) {
256
+ await add('critical', doc, libraryId, 'city-materials');
257
+ const library = doc.resources.get(libraryId);
258
+ const bytes = library?.source.kind === 'bundle' ? await source.read(node_path_1.posix.join(doc.folder, library.source.uri)) : null;
259
+ if (bytes) {
260
+ const textures = JSON.parse(bytes.toString('utf8')).textures ?? {};
261
+ for (const [slot, entry] of Object.entries(textures))
262
+ if (tier === 'desktop' || !exports.CITY_LIBRARY_HIGH_ONLY.has(slot))
263
+ await add('critical', doc, entry.resource, 'city-materials');
264
+ }
265
+ else
266
+ warnings.push(`${doc.folder}: city-material library is not readable`);
267
+ }
268
+ // 3. Resources of a set of groups (port: groupResourceIds).
269
+ const groupResources = async (phase, groupIds, why) => {
270
+ const terrain = scene.terrain;
271
+ const tilesByNode = new Map((terrain.kind !== 'none' ? terrain.tiles ?? [] : []).map((t) => [t.node, t]));
272
+ const nodes = rootNodes.filter((n) => groupIds.has(n.streamGroup));
273
+ const nodeIds = new Set(nodes.map((n) => n.id));
274
+ for (const node of nodes) {
275
+ if (node.resource)
276
+ await add(phase, doc, node.resource, why);
277
+ for (const level of node.lod?.levels ?? [])
278
+ await add(phase, doc, level.resource, why);
279
+ const tile = tilesByNode.get(node.id);
280
+ if (tile)
281
+ for (const id of [tile.heights, tile.splat, tile.normals])
282
+ await add(phase, doc, id, `${why}:terrain`);
283
+ if (terrain.kind !== 'none' && terrain.node === node.id && terrain.coarse)
284
+ for (const id of [terrain.resource, terrain.coarse.splat, terrain.coarse.normals])
285
+ await add(phase, doc, id, `${why}:terrain`);
286
+ }
287
+ for (const set of scene.collision.sets) {
288
+ if (!nodeIds.has(set.node))
289
+ continue;
290
+ for (const collider of set.static)
291
+ if ('resource' in collider)
292
+ await add(phase, doc, collider.resource, `${why}:collider`);
293
+ }
294
+ };
295
+ await groupResources('critical', eager, 'eager-group');
296
+ if (scene.environment?.resource)
297
+ await add('critical', doc, scene.environment.resource, 'environment');
298
+ // 4. Placements: the prototypes the tier draws (desktop: the full family's LODs and the small family's last; phone: the small
299
+ // family's last), the distant atlases, the near regions and the distant-tree pages around the spawn.
300
+ const placements = scene.placements;
301
+ if (placements) {
302
+ for (const prototype of placements.prototypes) {
303
+ const full = prototype.families.find((f) => f.id === 'full');
304
+ const small = prototype.families.find((f) => f.id === 'small') ?? prototype.families[prototype.families.length - 1];
305
+ if (tier === 'desktop' && full)
306
+ for (const lod of full.lods)
307
+ await add('critical', doc, lod.model, 'placement-prototype');
308
+ const last = small?.lods[small.lods.length - 1];
309
+ await add(tier === 'desktop' ? 'deferred' : 'critical', doc, last?.model, 'placement-prototype-small');
310
+ if (prototype.giProxy && tier === 'desktop')
311
+ await add('deferred', doc, prototype.giProxy, 'placement-gi-proxy');
312
+ }
313
+ for (const atlas of placements.distant?.atlases ?? []) {
314
+ await add('critical', doc, atlas.color, 'distant-atlas');
315
+ await add('critical', doc, atlas.normal, 'distant-atlas');
316
+ }
317
+ }
318
+ // 5. Groups resident at the spawn (port: residentGroupsAt) and the placement regions in reach (port: the near-region test).
319
+ await groupResources('critical', resident, 'resident-group');
320
+ // The terrain collider lane reads tile heights out to `terrain.colliderRadiusM`, past the render radius (Granit: 1088 m against 384 m on a phone).
321
+ const heightfield = scene.terrain.kind !== 'none' ? scene.terrain : undefined;
322
+ if (heightfield?.colliderRadiusM) {
323
+ const colliderRadiusM = heightfield.colliderRadiusM;
324
+ const nodeBounds = new Map();
325
+ for (const group of scene.streamGroups)
326
+ for (const cell of group.cells)
327
+ for (const node of cell.nodes)
328
+ nodeBounds.set(node, cell.bounds);
329
+ const tiles = (heightfield.tiles ?? []).map((tile) => ({ tile, b: nodeBounds.get(tile.node) })).filter((t) => !!t.b)
330
+ .map((t) => ({ tile: t.tile, d: planarDistanceToBounds(spawn, t.b) })).filter((t) => t.d <= colliderRadiusM).sort((a, b) => a.d - b.d);
331
+ for (const { tile } of tiles)
332
+ await add('critical', doc, tile.heights, 'terrain-collider');
333
+ }
334
+ const regionsInReach = (placements?.regions ?? []).map((region) => ({ region, d: planarDistanceToBounds(spawn, region.bounds ?? { min: [region.x * 256, 0, region.z * 256], max: [region.x * 256 + 256, 0, region.z * 256 + 256] }) }))
335
+ .filter((r) => r.d <= exports.PLACEMENT_REACH_M[tier]).sort((a, b) => a.d - b.d);
336
+ for (const { region } of regionsInReach)
337
+ await add('critical', doc, region.resource, 'placement-region');
338
+ const pages = [...(placements?.distant?.pages ?? [])].map((page) => ({ page, d: planarDistanceToBounds(spawn, page.bounds) })).sort((a, b) => a.d - b.d);
339
+ for (const { page, d } of pages)
340
+ await add(d <= docRadiusM ? 'critical' : 'deferred', doc, page.resource, d <= docRadiusM ? 'distant-page' : 'distant-page-far');
341
+ // 6. HLOD. The clusters of the first-playable radius are critical (with the shared material each draws and the textures it names);
342
+ // the rest of the skyline and the sharper refinement around the spawn are what the streamer asks for next.
343
+ const hlod = scene.hlod;
344
+ if (hlod && hlod.version >= 2) {
345
+ const clusters = hlod.clusters.map((c) => ({ c, d: planarDistanceToBounds(spawn, c.bounds) })).sort((a, b) => a.d - b.d);
346
+ const refinementM = hlod.refinement?.maxDistanceM ?? 0;
347
+ for (const { c, d } of clusters) {
348
+ if (d <= hlodRadiusM) {
349
+ await add('critical', doc, c.resource, 'hlod-near');
350
+ await add('critical', doc, c.material, 'hlod-near');
351
+ }
352
+ }
353
+ for (const { c, d } of clusters) {
354
+ if (d > hlodRadiusM) {
355
+ await add('deferred', doc, c.resource, 'hlod-far');
356
+ await add('deferred', doc, c.material, 'hlod-far');
357
+ }
358
+ }
359
+ for (const { c, d } of clusters) {
360
+ const refinement = c.refinement;
361
+ if (tier === 'desktop' && refinement && refinementM > 0 && d <= refinementM) {
362
+ await add('deferred', doc, refinement.resource, 'hlod-refinement');
363
+ await add('deferred', doc, refinement.material, 'hlod-refinement');
364
+ }
365
+ }
366
+ }
367
+ }
368
+ // The ocean the visual runtime gates on travels on its own path, not in a pack (engine src/startupPacks.ts `early`).
369
+ for (const name of ['ocean.json', 'ocean.rgba']) {
370
+ const path = node_path_1.posix.join(root, name);
371
+ const bytes = await source.size(path);
372
+ if (bytes !== null)
373
+ out.early.set(path, { path, bytes, why: 'ocean' });
374
+ }
375
+ const documents = [];
376
+ for (const name of [exports.SCENE_DOCUMENT, 'pin.json']) {
377
+ const path = node_path_1.posix.join(root, name);
378
+ const bytes = await source.size(path);
379
+ if (bytes !== null)
380
+ documents.push({ path, bytes, why: 'root-document' });
381
+ }
382
+ return { root, tier, spawn, streamRadiusM, early: [...out.early.values()], documents, critical: [...out.critical.values()], deferred: [...out.deferred.values()], warnings };
383
+ }
384
+ const centre = (b) => [(b.min[0] + b.max[0]) / 2, (b.min[1] + b.max[1]) / 2, (b.min[2] + b.max[2]) / 2];
385
+ //# sourceMappingURL=closure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closure.js","sourceRoot":"","sources":["../../../src/city/convert/closure.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,8 @@ exports.OPTIMIZATIONS = [
37
37
  { id: 'visuals.derived-lighting', title: 'Per-map lighting (scene-visuals/<scene>.json): fog from the map extent, sun latitude, exposure compensation', ref: 'creator-cli #491', stage: 'world-data' },
38
38
  { id: 'publish.world-json', title: 'world.json names the desktop and phone documents; the shell boots a city from data, not source', ref: 'engine #1171', stage: 'world-data' },
39
39
  { id: 'perf.gate-both-tiers', title: 'scene validate --perf on the final desktop and phone roots; a refusal fails the run', ref: 'creator-cli #419', stage: 'validate' },
40
+ { id: 'packs.startup-closure', title: 'Startup packs (helix.granit-pack/2, critical + deferred) cut from the documents with no browser trace: eager + spawn-resident groups, HLOD of the first-playable radius, placements, distant trees, city materials', ref: 'cs2-pipeline-2 / engine startupPacks', stage: 'startup-packs' },
41
+ { id: 'publish.streamed-bytes', title: 'Cold-start transfer per tier (decoded, root documents + early + critical + deferred, each URL once) as streamedDataBytes for the World card', ref: 'helix-manifest #74, creator-cli #489', stage: 'streamed-bytes' },
40
42
  { id: 'publish.layout', title: 'Publish tree laid out (scene/<root>/ plus part folders) and a publish plan with the exact shell command', ref: 'cs2-pipeline-unify', stage: 'finish' },
41
43
  ];
42
44
  exports.NON_GOALS = [
@@ -1 +1 @@
1
- {"version":3,"file":"optimizations.js","sourceRoot":"","sources":["../../../src/city/convert/optimizations.ts"],"names":[],"mappings":";AAAA,6HAA6H;AAC7H,iIAAiI;AACjI,gIAAgI;;;AAInH,QAAA,aAAa,GAA4B;IACpD,EAAE,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,gDAAgD,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnI,EAAE,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,gEAAgE,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE;IACjJ,EAAE,EAAE,EAAE,6BAA6B,EAAE,KAAK,EAAE,+EAA+E,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE;IACvK,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,qGAAqG,EAAE,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE;IACrL,EAAE,EAAE,EAAE,+BAA+B,EAAE,KAAK,EAAE,8CAA8C,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;IAC3I,EAAE,EAAE,EAAE,iCAAiC,EAAE,KAAK,EAAE,kEAAkE,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,aAAa,EAAE;IACnK,EAAE,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,qEAAqE,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;IAC3J,EAAE,EAAE,EAAE,yBAAyB,EAAE,KAAK,EAAE,kDAAkD,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;IACzI,EAAE,EAAE,EAAE,6BAA6B,EAAE,KAAK,EAAE,wEAAwE,EAAE,GAAG,EAAE,sCAAsC,EAAE,KAAK,EAAE,WAAW,EAAE;IACvL,EAAE,EAAE,EAAE,8BAA8B,EAAE,KAAK,EAAE,6DAA6D,EAAE,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,WAAW,EAAE;IAC3J,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,yDAAyD,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;IACzI,EAAE,EAAE,EAAE,6BAA6B,EAAE,KAAK,EAAE,8FAA8F,EAAE,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,WAAW,EAAE;IACnM,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,4DAA4D,EAAE,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,WAAW,EAAE;IACtJ,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,0GAA0G,EAAE,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,WAAW,EAAE;IACnM,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,gNAAgN,EAAE,GAAG,EAAE,wDAAwD,EAAE,KAAK,EAAE,WAAW,EAAE;IACtU,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,8IAA8I,EAAE,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,WAAW,EAAE;IAClO,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,sGAAsG,EAAE,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,WAAW,EAAE;IAC1L,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,6EAA6E,EAAE,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,WAAW,EAAE;IAC1K,EAAE,EAAE,EAAE,8BAA8B,EAAE,KAAK,EAAE,0FAA0F,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;IACvL,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,sHAAsH,EAAE,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,YAAY,EAAE;IACzN,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,4MAA4M,EAAE,GAAG,EAAE,iDAAiD,EAAE,KAAK,EAAE,YAAY,EAAE;IAC/T,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,wGAAwG,EAAE,GAAG,EAAE,kCAAkC,EAAE,KAAK,EAAE,YAAY,EAAE;IAC3M,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,oGAAoG,EAAE,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE;IACxL,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,kEAAkE,EAAE,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,MAAM,EAAE;IACpJ,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,mGAAmG,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE;IACnL,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,oDAAoD,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;IACnI,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,oDAAoD,EAAE,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,WAAW,EAAE;IACjJ,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,oDAAoD,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;IAClI,EAAE,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,8GAA8G,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;IACnM,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,6GAA6G,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;IACtM,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,gGAAgG,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE;IAC/K,EAAE,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,qFAAqF,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE;IACxK,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,yGAAyG,EAAE,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE;CACvL,CAAC;AAQW,QAAA,SAAS,GAAuB;IAC3C;QACE,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,wFAAwF;QAC/F,GAAG,EAAE,4eAA4e;QACjf,KAAK,EAAE,qHAAqH;QAC5H,QAAQ,EAAE,sNAAsN;KACjO;IACD;QACE,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,sHAAsH;QAC7H,GAAG,EAAE,6gBAA6gB;QAClhB,KAAK,EAAE,yUAAyU;QAChV,QAAQ,EAAE,yJAAyJ;KACpK;IACD;QACE,EAAE,EAAE,uCAAuC;QAC3C,KAAK,EAAE,+EAA+E;QACtF,GAAG,EAAE,waAAwa;QAC7a,KAAK,EAAE,8RAA8R;QACrS,QAAQ,EAAE,qKAAqK;KAChL;CACF,CAAC;AAEK,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAgB,EAAE;IAC3D,MAAM,KAAK,GAAG,qBAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAJW,QAAA,gBAAgB,oBAI3B"}
1
+ {"version":3,"file":"optimizations.js","sourceRoot":"","sources":["../../../src/city/convert/optimizations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export declare const PACK_INDEX_FORMAT_V1 = "helix.granit-pack/1";
2
+ export declare const PACK_INDEX_FORMAT_V2 = "helix.granit-pack/2";
3
+ /** Shape of `packs/<scene>/index.json` (the reader's `StartupPackIndex`). */
4
+ export interface StartupPackIndex {
5
+ format: typeof PACK_INDEX_FORMAT_V1 | typeof PACK_INDEX_FORMAT_V2;
6
+ scene: string;
7
+ root: 'scene/';
8
+ packs: Array<{
9
+ file: string;
10
+ bytes: number;
11
+ stored: number;
12
+ members: number;
13
+ defer?: boolean;
14
+ }>;
15
+ early?: string[];
16
+ members: Record<string, [number, number, number]>;
17
+ }
18
+ export interface PackMember {
19
+ path: string;
20
+ bytes: Uint8Array;
21
+ }
22
+ export interface PackGroup {
23
+ members: PackMember[];
24
+ defer?: boolean;
25
+ label?: string;
26
+ targetBytes?: number;
27
+ }
28
+ export interface PackFile {
29
+ file: string;
30
+ stored: Buffer;
31
+ }
32
+ export declare const CRITICAL_TARGET_BYTES: number;
33
+ export declare const DEFERRED_TARGET_BYTES: number;
34
+ /** Greedy contiguous split of `members` into packs of about `targetBytes`, keeping the given order (a member is never split). */
35
+ export declare function splitIntoPacks<T extends {
36
+ bytes: Uint8Array;
37
+ }>(members: readonly T[], targetBytes: number): T[][];
38
+ /** Lays the members of one pack end to end. Returns the decoded stream and each member's `[offset, length]`. */
39
+ export declare function layOut(members: readonly PackMember[]): {
40
+ decoded: Buffer;
41
+ where: Array<[number, number]>;
42
+ };
43
+ /** Packs from ordered groups (critical first, then deferred), numbered in the order given; format /2. Pure: no I/O. */
44
+ export declare function buildPackGroups(scene: string, groups: readonly PackGroup[], options?: {
45
+ level?: number;
46
+ early?: string[];
47
+ }): {
48
+ index: StartupPackIndex;
49
+ files: PackFile[];
50
+ };
51
+ /** What the converter reports for one tier's packs. */
52
+ export interface PackSummary {
53
+ packs: number;
54
+ critical: {
55
+ files: number;
56
+ decodedBytes: number;
57
+ storedBytes: number;
58
+ };
59
+ deferred: {
60
+ files: number;
61
+ decodedBytes: number;
62
+ storedBytes: number;
63
+ };
64
+ early: number;
65
+ }
66
+ export declare function summarizeIndex(index: StartupPackIndex): PackSummary;
67
+ /** Throws on an index the shell would reject or misread (the reader's own checks, plus offsets inside their pack). */
68
+ export declare function assertPackIndex(index: StartupPackIndex): void;