@hypersoniclabs/helix-cli 0.1.26 → 0.1.27-helix3.539

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 (34) hide show
  1. package/dist/city/colliders/apply.d.ts +34 -0
  2. package/dist/city/colliders/apply.js +167 -0
  3. package/dist/city/colliders/apply.js.map +1 -0
  4. package/dist/city/colliders/buildingBoxes.d.ts +71 -0
  5. package/dist/city/colliders/buildingBoxes.js +214 -0
  6. package/dist/city/colliders/buildingBoxes.js.map +1 -0
  7. package/dist/city/colliders/command.d.ts +2 -0
  8. package/dist/city/colliders/command.js +46 -0
  9. package/dist/city/colliders/command.js.map +1 -0
  10. package/dist/city/colliders/deckColliders.d.ts +64 -0
  11. package/dist/city/colliders/deckColliders.js +263 -0
  12. package/dist/city/colliders/deckColliders.js.map +1 -0
  13. package/dist/city/colliders/glbBounds.d.ts +37 -0
  14. package/dist/city/colliders/glbBounds.js +84 -0
  15. package/dist/city/colliders/glbBounds.js.map +1 -0
  16. package/dist/index.js +6 -4
  17. package/dist/index.js.map +1 -1
  18. package/dist/tsconfig.build.tsbuildinfo +1 -1
  19. package/package.json +3 -3
  20. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  21. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  22. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  23. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  24. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  25. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  26. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  27. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  28. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  29. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  30. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  31. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  32. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  33. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  34. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
@@ -0,0 +1,64 @@
1
+ import type { HelixSceneV2 } from '@hypersoniclabs/helix-manifest';
2
+ export interface DeckColliderOptions {
3
+ /** A render triangle is already covered when a collider triangle lies under its centroid within this many metres. */
4
+ toleranceM: number;
5
+ /** Smallest vertical component of a triangle's unit normal that counts as a surface to stand on. */
6
+ upMinNy: number;
7
+ maxTrianglesPerCell: number;
8
+ errorM: number;
9
+ errorCapM: number;
10
+ log?: (message: string) => void;
11
+ }
12
+ export declare const DEFAULT_DECK_COLLIDER_OPTIONS: Readonly<DeckColliderOptions>;
13
+ /** Where the render and collider cells of a road tier come from: a folder or, for a published prefix, any byte reader. */
14
+ export interface RoadCellSource {
15
+ cellSizeM: number;
16
+ originX: number;
17
+ originZ: number;
18
+ /** Paths as `read` takes them, collider cells named `<cx>_<cz>.glb`. */
19
+ render: string[];
20
+ collision: string[];
21
+ read(path: string): Promise<Uint8Array>;
22
+ }
23
+ /** A restyled `roads/` folder (`mesh-cells.json` + `render/` + `collider/`). */
24
+ export declare function roadCellsFromFolder(roadsDir: string): Promise<RoadCellSource>;
25
+ export interface DeckColliderCell {
26
+ cx: number;
27
+ cz: number;
28
+ file: string;
29
+ bytes: Uint8Array;
30
+ sha256: string;
31
+ triangles: number;
32
+ uncoveredTriangles: number;
33
+ errorM: number;
34
+ bounds: {
35
+ min: [number, number, number];
36
+ max: [number, number, number];
37
+ };
38
+ }
39
+ export interface DeckColliderReport {
40
+ renderTriangles: number;
41
+ surfaceTriangles: number;
42
+ uncoveredTriangles: number;
43
+ byKind: Record<string, number>;
44
+ cells: number;
45
+ triangles: number;
46
+ bytes: number;
47
+ maxCellTriangles: number;
48
+ cellsWithoutColliderSet: number[][];
49
+ }
50
+ /** Unit normal Y of a triangle (counter-clockwise from above is up). */
51
+ export declare function normalY(t: ArrayLike<number>): number;
52
+ /** y of the triangle's plane at (x, z), or null when (x, z) lies outside it. */
53
+ export declare function heightUnder(t: ArrayLike<number>, x: number, z: number): number | null;
54
+ export declare function buildDeckColliders(roads: RoadCellSource, input?: Partial<DeckColliderOptions>): Promise<{
55
+ cells: DeckColliderCell[];
56
+ report: DeckColliderReport;
57
+ }>;
58
+ export interface PatchDeckResult {
59
+ scene: HelixSceneV2;
60
+ addedResources: number;
61
+ addedSets: number;
62
+ }
63
+ /** Lists each deck cell as a second collider of the cell's existing collision set (a new set, node and group when the cell had none). */
64
+ export declare function patchSceneDeckColliders(scene: HelixSceneV2, cells: readonly DeckColliderCell[], uriDir?: string): PatchDeckResult;
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ // Elevated decks, ramps and rails you can stand on. The CS2 road bake keeps a piece's `structure` family out of the collider
3
+ // tier once the piece is elevated (convert/roadBake.ts), and an elevated carriageway IS a structure piece: its concrete deck
4
+ // top is the driving surface. Measured on Granit (render vs collider, up-facing triangles within 0.5 m): 98% of the deck
5
+ // surface below 10 m has a collider, 47% at 10-15 m, 25% at 15-20 m, 23% at 20-30 m, 12% above 30 m - and 99% of the
6
+ // uncovered triangles above 12 m are concrete. A player or car on a highway falls through to the street below.
7
+ //
8
+ // The render tier of the restyled cells still has every deck (it is what you see), so the collider tier is completed from it:
9
+ // every up-facing driving or walking triangle of the render cells that no collider triangle already lies under is welded,
10
+ // simplified at deck tolerance and written as an ADDITIONAL collider cell beside the old one (never re-simplifying what
11
+ // shipped), then listed in the same collision set.
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.DEFAULT_DECK_COLLIDER_OPTIONS = void 0;
14
+ exports.roadCellsFromFolder = roadCellsFromFolder;
15
+ exports.normalY = normalY;
16
+ exports.heightUnder = heightUnder;
17
+ exports.buildDeckColliders = buildDeckColliders;
18
+ exports.patchSceneDeckColliders = patchSceneDeckColliders;
19
+ const promises_1 = require("node:fs/promises");
20
+ const node_path_1 = require("node:path");
21
+ const node_crypto_1 = require("node:crypto");
22
+ const glb_1 = require("../../cs2/convert/glb");
23
+ const meshoptimizer_1 = require("meshoptimizer");
24
+ /** `_ROAD.x` kinds that are not a walking or driving surface. */
25
+ const KERB = 4;
26
+ const BUCKET_M = 4;
27
+ exports.DEFAULT_DECK_COLLIDER_OPTIONS = Object.freeze({ toleranceM: 0.5, upMinNy: 0.6, maxTrianglesPerCell: 60_000, errorM: 0.05, errorCapM: 0.2 });
28
+ /** A restyled `roads/` folder (`mesh-cells.json` + `render/` + `collider/`). */
29
+ async function roadCellsFromFolder(roadsDir) {
30
+ const index = JSON.parse(await (0, promises_1.readFile)((0, node_path_1.join)(roadsDir, 'mesh-cells.json'), 'utf8'));
31
+ return { cellSizeM: index.cellSizeM, originX: index.originX, originZ: index.originZ, render: index.render.map((c) => c.file), collision: index.collision.map((c) => c.file), read: async (path) => new Uint8Array(await (0, promises_1.readFile)((0, node_path_1.join)(roadsDir, path))) };
32
+ }
33
+ const cellOfFile = (file) => {
34
+ const match = /(-?\d+)_(-?\d+)\.glb$/.exec(file);
35
+ if (!match)
36
+ throw new Error(`deck colliders: collider cell ${file} is not named <cx>_<cz>.glb`);
37
+ return [Number(match[1]), Number(match[2])];
38
+ };
39
+ async function readWorldTriangles(io, bytes) {
40
+ const document = await io.readBinary(withoutExternalImages(bytes));
41
+ const out = [];
42
+ for (const node of document.getRoot().listNodes()) {
43
+ const mesh = node.getMesh();
44
+ if (!mesh)
45
+ continue;
46
+ const m = node.getWorldMatrix();
47
+ for (const primitive of mesh.listPrimitives()) {
48
+ const position = primitive.getAttribute('POSITION');
49
+ const indices = primitive.getIndices();
50
+ if (!position || !indices)
51
+ continue;
52
+ const road = primitive.getAttribute('_ROAD');
53
+ const roadScale = road?.getNormalized() ? 255 : 1;
54
+ const world = new Float32Array(position.getCount() * 3);
55
+ const p = [0, 0, 0];
56
+ for (let v = 0; v < position.getCount(); v += 1) {
57
+ position.getElement(v, p);
58
+ world[v * 3] = m[0] * p[0] + m[4] * p[1] + m[8] * p[2] + m[12];
59
+ world[v * 3 + 1] = m[1] * p[0] + m[5] * p[1] + m[9] * p[2] + m[13];
60
+ world[v * 3 + 2] = m[2] * p[0] + m[6] * p[1] + m[10] * p[2] + m[14];
61
+ }
62
+ const r = [0, 0, 0, 0];
63
+ for (let corner = 0; corner + 2 < indices.getCount(); corner += 3) {
64
+ const a = indices.getScalar(corner), b = indices.getScalar(corner + 1), c = indices.getScalar(corner + 2);
65
+ const tri = new Float32Array(9);
66
+ tri.set(world.subarray(a * 3, a * 3 + 3), 0);
67
+ tri.set(world.subarray(b * 3, b * 3 + 3), 3);
68
+ tri.set(world.subarray(c * 3, c * 3 + 3), 6);
69
+ let kind = -1;
70
+ if (road) {
71
+ road.getElement(a, r);
72
+ kind = Math.round(r[0] * roadScale);
73
+ }
74
+ out.push({ tri, kind });
75
+ }
76
+ }
77
+ }
78
+ return out;
79
+ }
80
+ /** Cuts the texture references out so a cell reads standalone (the same as the restyle's reader). */
81
+ function withoutExternalImages(glb) {
82
+ const view = new DataView(glb.buffer, glb.byteOffset, glb.byteLength);
83
+ const jsonLength = view.getUint32(12, true);
84
+ const json = JSON.parse(new TextDecoder().decode(glb.subarray(20, 20 + jsonLength)));
85
+ if (!json.images && !json.textures)
86
+ return glb;
87
+ for (const material of json.materials ?? [])
88
+ if (material.pbrMetallicRoughness)
89
+ delete material.pbrMetallicRoughness.baseColorTexture;
90
+ delete json.images;
91
+ delete json.textures;
92
+ delete json.samplers;
93
+ json.extensionsUsed = (json.extensionsUsed ?? []).filter((name) => name !== 'KHR_texture_basisu');
94
+ json.extensionsRequired = (json.extensionsRequired ?? []).filter((name) => name !== 'KHR_texture_basisu');
95
+ const text = new TextEncoder().encode(JSON.stringify(json));
96
+ const padded = new Uint8Array(Math.ceil(text.length / 4) * 4).fill(0x20);
97
+ padded.set(text);
98
+ const rest = glb.subarray(20 + jsonLength);
99
+ const out = new Uint8Array(20 + padded.length + rest.length);
100
+ const outView = new DataView(out.buffer);
101
+ out.set(glb.subarray(0, 12), 0);
102
+ outView.setUint32(8, out.length, true);
103
+ outView.setUint32(12, padded.length, true);
104
+ outView.setUint32(16, 0x4e4f534a, true);
105
+ out.set(padded, 20);
106
+ out.set(rest, 20 + padded.length);
107
+ return out;
108
+ }
109
+ /** Unit normal Y of a triangle (counter-clockwise from above is up). */
110
+ function normalY(t) {
111
+ const ux = t[3] - t[0], uy = t[4] - t[1], uz = t[5] - t[2], vx = t[6] - t[0], vy = t[7] - t[1], vz = t[8] - t[2];
112
+ const nx = uy * vz - uz * vy, ny = uz * vx - ux * vz, nz = ux * vy - uy * vx;
113
+ const length = Math.hypot(nx, ny, nz);
114
+ return length === 0 ? 0 : ny / length;
115
+ }
116
+ /** y of the triangle's plane at (x, z), or null when (x, z) lies outside it. */
117
+ function heightUnder(t, x, z) {
118
+ const d = (t[5] - t[8]) * (t[0] - t[6]) + (t[6] - t[3]) * (t[2] - t[8]);
119
+ if (Math.abs(d) < 1e-9)
120
+ return null;
121
+ const l1 = ((t[5] - t[8]) * (x - t[6]) + (t[6] - t[3]) * (z - t[8])) / d;
122
+ const l2 = ((t[8] - t[2]) * (x - t[6]) + (t[0] - t[6]) * (z - t[8])) / d;
123
+ const l3 = 1 - l1 - l2;
124
+ if (l1 < -1e-4 || l2 < -1e-4 || l3 < -1e-4)
125
+ return null;
126
+ return l1 * t[1] + l2 * t[4] + l3 * t[7];
127
+ }
128
+ class TriangleBuckets {
129
+ cells = new Map();
130
+ add(t) {
131
+ const x0 = Math.floor(Math.min(t[0], t[3], t[6]) / BUCKET_M), x1 = Math.floor(Math.max(t[0], t[3], t[6]) / BUCKET_M);
132
+ const z0 = Math.floor(Math.min(t[2], t[5], t[8]) / BUCKET_M), z1 = Math.floor(Math.max(t[2], t[5], t[8]) / BUCKET_M);
133
+ for (let gx = x0; gx <= x1; gx += 1)
134
+ for (let gz = z0; gz <= z1; gz += 1) {
135
+ const key = `${gx},${gz}`;
136
+ const list = this.cells.get(key);
137
+ if (list)
138
+ list.push(t);
139
+ else
140
+ this.cells.set(key, [t]);
141
+ }
142
+ }
143
+ covered(x, y, z, toleranceM) {
144
+ const list = this.cells.get(`${Math.floor(x / BUCKET_M)},${Math.floor(z / BUCKET_M)}`);
145
+ if (!list)
146
+ return false;
147
+ for (const t of list) {
148
+ const h = heightUnder(t, x, z);
149
+ if (h !== null && Math.abs(h - y) < toleranceM)
150
+ return true;
151
+ }
152
+ return false;
153
+ }
154
+ }
155
+ async function buildDeckColliders(roads, input = {}) {
156
+ const options = { ...exports.DEFAULT_DECK_COLLIDER_OPTIONS, ...input };
157
+ const log = options.log ?? (() => undefined);
158
+ await meshoptimizer_1.MeshoptDecoder.ready;
159
+ const io = (0, glb_1.cs2GltfIo)();
160
+ const index = roads;
161
+ const buckets = new TriangleBuckets();
162
+ let colliderTriangles = 0;
163
+ for (const cell of index.collision) {
164
+ for (const { tri } of await readWorldTriangles(io, await roads.read(cell))) {
165
+ if (normalY(tri) >= options.upMinNy) {
166
+ buckets.add(tri);
167
+ colliderTriangles += 1;
168
+ }
169
+ }
170
+ }
171
+ log(`existing collider: ${colliderTriangles} up-facing triangles in ${index.collision.length} cells`);
172
+ const uncovered = new Map();
173
+ const report = { renderTriangles: 0, surfaceTriangles: 0, uncoveredTriangles: 0, byKind: {}, cells: 0, triangles: 0, bytes: 0, maxCellTriangles: 0, cellsWithoutColliderSet: [] };
174
+ const kindName = ['asphalt', 'concrete', 'sett', 'gravel', 'kerb', 'sidewalk', 'median'];
175
+ for (const cell of index.render) {
176
+ for (const { tri, kind } of await readWorldTriangles(io, await roads.read(cell))) {
177
+ report.renderTriangles += 1;
178
+ if (kind === KERB || normalY(tri) < options.upMinNy)
179
+ continue;
180
+ report.surfaceTriangles += 1;
181
+ const cx = (tri[0] + tri[3] + tri[6]) / 3, cy = (tri[1] + tri[4] + tri[7]) / 3, cz = (tri[2] + tri[5] + tri[8]) / 3;
182
+ if (buckets.covered(cx, cy, cz, options.toleranceM))
183
+ continue;
184
+ report.uncoveredTriangles += 1;
185
+ report.byKind[kindName[kind] ?? String(kind)] = (report.byKind[kindName[kind] ?? String(kind)] ?? 0) + 1;
186
+ const gx = Math.floor((cx - index.originX) / index.cellSizeM), gz = Math.floor((cz - index.originZ) / index.cellSizeM);
187
+ const key = `${gx},${gz}`;
188
+ const list = uncovered.get(key);
189
+ if (list)
190
+ list.push(...tri);
191
+ else
192
+ uncovered.set(key, [...tri]);
193
+ }
194
+ }
195
+ log(`render surface ${report.surfaceTriangles} triangles, ${report.uncoveredTriangles} uncovered`);
196
+ const known = new Set(index.collision.map((file) => cellOfFile(file).join(',')));
197
+ const cells = [];
198
+ for (const [key, flat] of [...uncovered.entries()].sort(([a], [b]) => (a < b ? -1 : 1))) {
199
+ const [cx, cz] = key.split(',').map(Number);
200
+ if (!known.has(key))
201
+ report.cellsWithoutColliderSet.push([cx, cz]);
202
+ const positions = Float32Array.from(flat);
203
+ const identity = new Uint32Array(positions.length / 3);
204
+ for (let at = 0; at < identity.length; at += 1)
205
+ identity[at] = at;
206
+ let error = options.errorM;
207
+ let welded = await (0, glb_1.weldAndSimplify)(positions, identity, options.maxTrianglesPerCell, error);
208
+ while (welded.trianglesAfter > options.maxTrianglesPerCell && error < options.errorCapM) {
209
+ error *= 2;
210
+ welded = await (0, glb_1.weldAndSimplify)(positions, identity, options.maxTrianglesPerCell, error);
211
+ }
212
+ if (welded.indices.length === 0)
213
+ continue;
214
+ const bytes = await (0, glb_1.writeCs2Glb)(`cs2-roads-deck-collider-${cx}-${cz}`, [], [{ positions: welded.positions, indices: welded.indices }]);
215
+ const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];
216
+ for (let at = 0; at < welded.positions.length; at += 3)
217
+ for (let axis = 0; axis < 3; axis += 1) {
218
+ const v = welded.positions[at + axis];
219
+ if (v < min[axis])
220
+ min[axis] = v;
221
+ if (v > max[axis])
222
+ max[axis] = v;
223
+ }
224
+ const triangles = welded.indices.length / 3;
225
+ cells.push({ cx, cz, file: `deck-collider/${cx}_${cz}.glb`, bytes, sha256: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex'), triangles, uncoveredTriangles: flat.length / 9, errorM: welded.errorMetres, bounds: { min, max } });
226
+ report.triangles += triangles;
227
+ report.bytes += bytes.length;
228
+ report.maxCellTriangles = Math.max(report.maxCellTriangles, triangles);
229
+ }
230
+ report.cells = cells.length;
231
+ return { cells, report };
232
+ }
233
+ /** Lists each deck cell as a second collider of the cell's existing collision set (a new set, node and group when the cell had none). */
234
+ function patchSceneDeckColliders(scene, cells, uriDir = 'roads') {
235
+ const next = structuredClone(scene);
236
+ let addedResources = 0, addedSets = 0;
237
+ const identity = { position: [0, 0, 0], rotation: [0, 0, 0, 1], scale: [1, 1, 1] };
238
+ for (const cell of cells) {
239
+ const resourceId = `roads.crd.${cell.cx}.${cell.cz}`;
240
+ const resource = {
241
+ id: resourceId, kind: 'collider', source: { kind: 'bundle', assetId: `meshcells:roads:deck-collider:${cell.sha256}`, uri: `${uriDir}/${cell.file}` },
242
+ integrity: { sha256: cell.sha256 }, bytes: cell.bytes.length, mimeType: 'model/gltf-binary', required: true,
243
+ };
244
+ next.resources.push(resource);
245
+ addedResources += 1;
246
+ const setId = `roads.cs.${cell.cx}.${cell.cz}`;
247
+ let set = next.collision.sets.find((candidate) => candidate.id === setId);
248
+ if (!set) {
249
+ const nodeId = `roads.cn.${cell.cx}.${cell.cz}`, groupId = `roads.c.${cell.cx}.${cell.cz}`;
250
+ const node = { id: nodeId, transform: { ...identity }, streamGroup: groupId, components: [{ type: 'collision.proxy-set', set: setId }] };
251
+ next.nodes.push(node);
252
+ next.streamGroups.push({ id: groupId, mode: 'distance', priority: 60, dependencies: ['stream.root'], estimatedMemoryMiB: 1, cells: [{ id: `roads.cc.${cell.cx}.${cell.cz}`, bounds: { min: cell.bounds.min, max: cell.bounds.max }, nodes: [nodeId] }] });
253
+ next.scenes[0].nodes.push(nodeId);
254
+ next.scenes[0].streamGroups.push(groupId);
255
+ set = { id: setId, node: nodeId, static: [] };
256
+ next.collision.sets.push(set);
257
+ addedSets += 1;
258
+ }
259
+ set.static.push({ id: `roads.cod.${cell.cx}.${cell.cz}`, shape: 'triangle-mesh', resource: resourceId, transform: { ...identity } });
260
+ }
261
+ return { scene: next, addedResources, addedSets };
262
+ }
263
+ //# sourceMappingURL=deckColliders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deckColliders.js","sourceRoot":"","sources":["../../../src/city/colliders/deckColliders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type Box3 = {
2
+ min: [number, number, number];
3
+ max: [number, number, number];
4
+ };
5
+ interface GltfJson {
6
+ scene?: number;
7
+ scenes?: Array<{
8
+ nodes?: number[];
9
+ }>;
10
+ nodes?: Array<{
11
+ children?: number[];
12
+ mesh?: number;
13
+ matrix?: number[];
14
+ translation?: number[];
15
+ rotation?: number[];
16
+ scale?: number[];
17
+ }>;
18
+ meshes?: Array<{
19
+ primitives: Array<{
20
+ attributes: {
21
+ POSITION?: number;
22
+ };
23
+ }>;
24
+ }>;
25
+ accessors?: Array<{
26
+ min?: number[];
27
+ max?: number[];
28
+ normalized?: boolean;
29
+ componentType: number;
30
+ }>;
31
+ }
32
+ /** The JSON chunk of a GLB from its first bytes: `head` must cover the 20-byte header and the whole JSON chunk. */
33
+ export declare function glbJsonChunkLength(head: Uint8Array): number;
34
+ export declare function glbBoundsFromJson(json: GltfJson): Box3;
35
+ /** Bounds of a GLB given a reader of byte ranges (a file or an HTTP range request). */
36
+ export declare function glbBounds(read: (offset: number, length: number) => Promise<Uint8Array>): Promise<Box3>;
37
+ export {};
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ // The local-space bounding box of a GLB, read from its JSON chunk alone (POSITION accessor min/max walked through the node
3
+ // transforms). A city's prototype GLBs are meshopt-compressed and tens of MB; their JSON chunk is a few KB, so a
4
+ // building's collider box costs a range read, never a decode.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.glbJsonChunkLength = glbJsonChunkLength;
7
+ exports.glbBoundsFromJson = glbBoundsFromJson;
8
+ exports.glbBounds = glbBounds;
9
+ const NORMALISER = { 5120: 127, 5121: 255, 5122: 32767, 5123: 65535 };
10
+ const identity = () => [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
11
+ function multiply(a, b) {
12
+ const out = new Array(16).fill(0);
13
+ for (let c = 0; c < 4; c += 1)
14
+ for (let r = 0; r < 4; r += 1)
15
+ for (let k = 0; k < 4; k += 1)
16
+ out[c * 4 + r] += a[k * 4 + r] * b[c * 4 + k];
17
+ return out;
18
+ }
19
+ function trs(t = [0, 0, 0], q = [0, 0, 0, 1], s = [1, 1, 1]) {
20
+ const [x, y, z, w] = q;
21
+ const r00 = 1 - 2 * (y * y + z * z), r01 = 2 * (x * y - z * w), r02 = 2 * (x * z + y * w);
22
+ const r10 = 2 * (x * y + z * w), r11 = 1 - 2 * (x * x + z * z), r12 = 2 * (y * z - x * w);
23
+ const r20 = 2 * (x * z - y * w), r21 = 2 * (y * z + x * w), r22 = 1 - 2 * (x * x + y * y);
24
+ return [r00 * s[0], r10 * s[0], r20 * s[0], 0, r01 * s[1], r11 * s[1], r21 * s[1], 0, r02 * s[2], r12 * s[2], r22 * s[2], 0, t[0], t[1], t[2], 1];
25
+ }
26
+ /** The JSON chunk of a GLB from its first bytes: `head` must cover the 20-byte header and the whole JSON chunk. */
27
+ function glbJsonChunkLength(head) {
28
+ const view = new DataView(head.buffer, head.byteOffset, head.byteLength);
29
+ if (head.byteLength < 20 || view.getUint32(0, true) !== 0x46546c67 || view.getUint32(16, true) !== 0x4e4f534a)
30
+ throw new Error('glbBounds: not a GLB with a leading JSON chunk');
31
+ return view.getUint32(12, true);
32
+ }
33
+ function glbBoundsFromJson(json) {
34
+ const nodes = json.nodes ?? [];
35
+ const lo = [Infinity, Infinity, Infinity];
36
+ const hi = [-Infinity, -Infinity, -Infinity];
37
+ const seen = new Set();
38
+ const visit = (index, parent) => {
39
+ if (seen.has(index))
40
+ throw new Error('glbBounds: node graph is not a tree');
41
+ seen.add(index);
42
+ const node = nodes[index];
43
+ const local = node.matrix ? node.matrix : trs(node.translation, node.rotation, node.scale);
44
+ const world = multiply(parent, local);
45
+ if (node.mesh !== undefined) {
46
+ for (const primitive of json.meshes?.[node.mesh]?.primitives ?? []) {
47
+ const accessor = json.accessors?.[primitive.attributes.POSITION ?? -1];
48
+ if (!accessor?.min || !accessor.max)
49
+ throw new Error('glbBounds: a POSITION accessor has no min/max');
50
+ const scale = accessor.normalized ? NORMALISER[accessor.componentType] ?? 1 : 1;
51
+ const signed = accessor.componentType === 5120 || accessor.componentType === 5122;
52
+ const norm = (value) => (accessor.normalized ? (signed ? Math.max(value / scale, -1) : value / scale) : value);
53
+ for (const cx of [accessor.min[0], accessor.max[0]])
54
+ for (const cy of [accessor.min[1], accessor.max[1]])
55
+ for (const cz of [accessor.min[2], accessor.max[2]]) {
56
+ const px = norm(cx), py = norm(cy), pz = norm(cz);
57
+ for (let axis = 0; axis < 3; axis += 1) {
58
+ const v = world[axis] * px + world[4 + axis] * py + world[8 + axis] * pz + world[12 + axis];
59
+ if (v < lo[axis])
60
+ lo[axis] = v;
61
+ if (v > hi[axis])
62
+ hi[axis] = v;
63
+ }
64
+ }
65
+ }
66
+ }
67
+ for (const child of node.children ?? [])
68
+ visit(child, world);
69
+ };
70
+ const scene = json.scenes?.[json.scene ?? 0];
71
+ for (const root of scene?.nodes ?? [])
72
+ visit(root, identity());
73
+ if (!Number.isFinite(lo[0]))
74
+ throw new Error('glbBounds: the GLB draws no mesh');
75
+ return { min: lo, max: hi };
76
+ }
77
+ /** Bounds of a GLB given a reader of byte ranges (a file or an HTTP range request). */
78
+ async function glbBounds(read) {
79
+ const head = await read(0, 20);
80
+ const length = glbJsonChunkLength(head);
81
+ const chunk = await read(20, length);
82
+ return glbBoundsFromJson(JSON.parse(new TextDecoder().decode(chunk)));
83
+ }
84
+ //# sourceMappingURL=glbBounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glbBounds.js","sourceRoot":"","sources":["../../../src/city/colliders/glbBounds.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -50,9 +50,10 @@ const commands_4 = require("./sceneCreate/commands");
50
50
  const commands_5 = require("./city/source/commands");
51
51
  const command_3 = require("./city/import/osm/command");
52
52
  const command_4 = require("./city/buildings/command");
53
+ const command_5 = require("./city/colliders/command");
53
54
  const commands_6 = require("./model/commands");
54
- const command_5 = require("./city/roads/command");
55
- const command_6 = require("./cs2/restyle/command");
55
+ const command_6 = require("./city/roads/command");
56
+ const command_7 = require("./cs2/restyle/command");
56
57
  const propsCommand_1 = require("./cs2/propsCommand");
57
58
  const placementRequest_1 = require("./placementRequest");
58
59
  const bundle_1 = require("./bundle");
@@ -6081,9 +6082,10 @@ const city = program
6081
6082
  (0, commands_5.registerCitySourceCommands)(city, fail);
6082
6083
  (0, command_3.registerCityImportOsm)(city, fail);
6083
6084
  (0, command_4.registerCityBuildings)(city, fail);
6085
+ (0, command_5.registerCityColliders)(city, fail);
6084
6086
  (0, command_2.registerCityImportCs2)(city, fail);
6085
- (0, command_5.registerCityRoadsCommands)(city, fail);
6086
- (0, command_6.registerCityRoadsRestyleCs2)(city, fail);
6087
+ (0, command_6.registerCityRoadsCommands)(city, fail);
6088
+ (0, command_7.registerCityRoadsRestyleCs2)(city, fail);
6087
6089
  (0, propsCommand_1.registerCityPropsKit)(city, fail);
6088
6090
  (0, commands_6.registerModelCommands)(program, fail);
6089
6091
  const sceneImport = scene