@hypersoniclabs/helix-cli 0.1.25-helix3.489 → 0.1.25-helix3.490
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/city/assemble/create.js +10 -2
- package/dist/city/assemble/create.js.map +1 -1
- package/dist/city/props/geometry.d.ts +17 -0
- package/dist/city/props/geometry.js +47 -0
- package/dist/city/props/geometry.js.map +1 -0
- package/dist/city/props/index.d.ts +49 -8
- package/dist/city/props/index.js +128 -29
- package/dist/city/props/index.js.map +1 -1
- package/dist/city/vegetation/index.d.ts +12 -0
- package/dist/city/vegetation/index.js +52 -10
- package/dist/city/vegetation/index.js.map +1 -1
- package/dist/cs2/convert/props.d.ts +73 -0
- package/dist/cs2/convert/props.js +351 -0
- package/dist/cs2/convert/props.js.map +1 -0
- package/dist/cs2/props.d.ts +57 -0
- package/dist/cs2/props.js +100 -0
- package/dist/cs2/props.js.map +1 -0
- package/dist/cs2/propsCommand.d.ts +7 -0
- package/dist/cs2/propsCommand.js +108 -0
- package/dist/cs2/propsCommand.js.map +1 -0
- package/dist/cs2/propsPillars.d.ts +31 -0
- package/dist/cs2/propsPillars.js +55 -0
- package/dist/cs2/propsPillars.js.map +1 -0
- package/dist/cs2/propsPrototype.d.ts +32 -0
- package/dist/cs2/propsPrototype.js +100 -0
- package/dist/cs2/propsPrototype.js.map +1 -0
- package/dist/cs2/propsPublish.d.ts +23 -0
- package/dist/cs2/propsPublish.js +76 -0
- package/dist/cs2/propsPublish.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/docs/scene-create.md +2 -3
- package/package.json +1 -1
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
|
@@ -111,10 +111,18 @@ async function createCityScene(options) {
|
|
|
111
111
|
const terrain = await lap('terrain', () => (0, terrain_1.buildCityTerrain)(loaded, (0, node_path_1.join)(work, 'terrain'), { metresPerSample: plan.terrain.metresPerSample, conformed: roads?.conformed }));
|
|
112
112
|
const spawn = (0, spawn_1.pickSpawn)(loaded, built.manifest, terrain.heightAt, plan.spawn);
|
|
113
113
|
log(`spawn: ${spawn.position.map((v) => v.toFixed(1)).join(', ')} (${spawn.reason})`);
|
|
114
|
+
// Props are searched first so the placeable ones can be baked into the same placements as the trees.
|
|
115
|
+
const props = plan.props.enabled ? await lap('props', () => (0, props_1.resolveProps)(loaded, { log, offline: options.offline })) : null;
|
|
116
|
+
let placedProps = null;
|
|
117
|
+
if (props && plan.vegetation.enabled) {
|
|
118
|
+
placedProps = await lap('props placement', () => (0, props_1.placeProps)(loaded, props.findings, { heightAt: terrain.heightAt, bounds: loaded.manifest.frame.boundsXZ, log }));
|
|
119
|
+
props.report.placed = placedProps.records.length;
|
|
120
|
+
props.report.prototypes = placedProps.prototypes.length;
|
|
121
|
+
props.report.placedByKind = placedProps.placedByKind;
|
|
122
|
+
}
|
|
114
123
|
const vegetation = plan.vegetation.enabled
|
|
115
|
-
? await lap('vegetation', () => (0, vegetation_1.buildVegetation)(loaded, { dir: (0, node_path_1.join)(work, 'placements'), terrainDir: (0, node_path_1.join)(work, 'terrain'), heightAt: terrain.heightAt, maxTrees: plan.vegetation.maxTrees, log }))
|
|
124
|
+
? await lap('vegetation', () => (0, vegetation_1.buildVegetation)(loaded, { dir: (0, node_path_1.join)(work, 'placements'), terrainDir: (0, node_path_1.join)(work, 'terrain'), heightAt: terrain.heightAt, maxTrees: plan.vegetation.maxTrees, log, ...(placedProps?.records.length ? { props: placedProps } : {}) }))
|
|
116
125
|
: null;
|
|
117
|
-
const props = plan.props.enabled ? await lap('props', () => (0, props_1.resolveProps)(loaded, { log, offline: options.offline })) : null;
|
|
118
126
|
const composed = await lap('compose', () => (0, compose_1.composeCityScene)({
|
|
119
127
|
sceneId, title, terrainDir: (0, node_path_1.join)(work, 'terrain'), ...(vegetation?.placementsDir ? { placementsDir: vegetation.placementsDir } : {}),
|
|
120
128
|
buildingsDir: (0, node_path_1.join)(work, 'buildings'), buildings: built.manifest, library: (0, materials_1.packageCityLibrary)(), ...(roads ? { roads: roads.cells } : {}), memoryBudgetMiB, streamRadiusM,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/city/assemble/create.ts"],"names":[],"mappings":";AAAA,gHAAgH;AAChH,EAAE;AACF,mGAAmG;AACnG,iHAAiH;AACjH,4EAA4E;AAC5E,gGAAgG;AAChG,gHAAgH;AAChH,2HAA2H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0E3H,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/city/assemble/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CitySource, Vec2 } from '../source';
|
|
2
|
+
export interface StreetHit {
|
|
3
|
+
point: Vec2;
|
|
4
|
+
distance: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function pointToSegment(p: Vec2, a: Vec2, b: Vec2): {
|
|
7
|
+
point: Vec2;
|
|
8
|
+
distance: number;
|
|
9
|
+
};
|
|
10
|
+
export declare class StreetIndex {
|
|
11
|
+
readonly cell: number;
|
|
12
|
+
readonly reach: number;
|
|
13
|
+
private readonly buckets;
|
|
14
|
+
constructor(source: CitySource, cell?: number, reach?: number);
|
|
15
|
+
/** The nearest street centreline point within `reach`, or null. */
|
|
16
|
+
nearest(p: Vec2): StreetHit | null;
|
|
17
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Nearest-street queries for prop facing: bucketed road segments, nearest point on any centreline within reach.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.StreetIndex = void 0;
|
|
5
|
+
exports.pointToSegment = pointToSegment;
|
|
6
|
+
function pointToSegment(p, a, b) {
|
|
7
|
+
const dx = b[0] - a[0], dz = b[1] - a[1], len2 = dx * dx + dz * dz;
|
|
8
|
+
const t = len2 === 0 ? 0 : Math.max(0, Math.min(1, ((p[0] - a[0]) * dx + (p[1] - a[1]) * dz) / len2));
|
|
9
|
+
const point = [a[0] + t * dx, a[1] + t * dz];
|
|
10
|
+
return { point, distance: Math.hypot(p[0] - point[0], p[1] - point[1]) };
|
|
11
|
+
}
|
|
12
|
+
class StreetIndex {
|
|
13
|
+
cell;
|
|
14
|
+
reach;
|
|
15
|
+
buckets = new Map();
|
|
16
|
+
constructor(source, cell = 32, reach = 32) {
|
|
17
|
+
this.cell = cell;
|
|
18
|
+
this.reach = reach;
|
|
19
|
+
for (const edge of source.roads?.edges ?? []) {
|
|
20
|
+
for (let i = 0; i + 1 < edge.pts.length; i += 1) {
|
|
21
|
+
const a = edge.pts[i], b = edge.pts[i + 1];
|
|
22
|
+
for (let ix = Math.floor((Math.min(a[0], b[0]) - reach) / cell); ix <= Math.floor((Math.max(a[0], b[0]) + reach) / cell); ix += 1) {
|
|
23
|
+
for (let iz = Math.floor((Math.min(a[1], b[1]) - reach) / cell); iz <= Math.floor((Math.max(a[1], b[1]) + reach) / cell); iz += 1) {
|
|
24
|
+
const key = `${ix},${iz}`;
|
|
25
|
+
const list = this.buckets.get(key);
|
|
26
|
+
if (list)
|
|
27
|
+
list.push([a, b]);
|
|
28
|
+
else
|
|
29
|
+
this.buckets.set(key, [[a, b]]);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** The nearest street centreline point within `reach`, or null. */
|
|
36
|
+
nearest(p) {
|
|
37
|
+
let best = null;
|
|
38
|
+
for (const [a, b] of this.buckets.get(`${Math.floor(p[0] / this.cell)},${Math.floor(p[1] / this.cell)}`) ?? []) {
|
|
39
|
+
const hit = pointToSegment(p, a, b);
|
|
40
|
+
if (hit.distance <= this.reach && (!best || hit.distance < best.distance))
|
|
41
|
+
best = hit;
|
|
42
|
+
}
|
|
43
|
+
return best;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.StreetIndex = StreetIndex;
|
|
47
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../src/city/props/geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +1,52 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type PropKind } from '../../cs2/props';
|
|
2
|
+
import { type PropPrototype } from '../../cs2/propsPrototype';
|
|
3
|
+
import type { CitySource, Vec2 } from '../source';
|
|
2
4
|
export declare const VAULT_DEFAULT_API = "https://helix-backend-api-helix3.up.railway.app";
|
|
3
5
|
interface Wanted {
|
|
4
6
|
kind: string;
|
|
5
7
|
label: string;
|
|
6
8
|
queries: string[];
|
|
7
9
|
words: string[];
|
|
10
|
+
facing?: 'road' | 'away' | 'none';
|
|
8
11
|
}
|
|
9
12
|
export declare const WANTED_PROPS: Wanted[];
|
|
13
|
+
/** Kit kinds the catalog search also answers for (no source POI names them today): reported, never placed. */
|
|
14
|
+
export declare const KIT_KINDS: PropKind[];
|
|
15
|
+
export interface PropCandidate {
|
|
16
|
+
title: string;
|
|
17
|
+
packageId: string;
|
|
18
|
+
version: string;
|
|
19
|
+
manifestCid: string;
|
|
20
|
+
bytes: number;
|
|
21
|
+
/** LOD GLBs, finest first (the root, then the quality variants). Present for kit Packages. */
|
|
22
|
+
lods?: Array<{
|
|
23
|
+
cid: string;
|
|
24
|
+
url: string;
|
|
25
|
+
}>;
|
|
26
|
+
kit?: boolean;
|
|
27
|
+
}
|
|
10
28
|
export interface PropFinding {
|
|
11
29
|
kind: string;
|
|
12
30
|
label: string;
|
|
13
31
|
poiCount: number;
|
|
14
32
|
status: 'placeable' | 'unplaceable' | 'none' | 'unreachable';
|
|
15
|
-
candidate?:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
version: string;
|
|
19
|
-
manifestCid: string;
|
|
20
|
-
bytes: number;
|
|
21
|
-
};
|
|
33
|
+
candidate?: PropCandidate;
|
|
34
|
+
/** Every placeable kit Package for the kind, in catalog order (up to four); POIs pick among them by id hash. */
|
|
35
|
+
candidates?: PropCandidate[];
|
|
22
36
|
reason: string;
|
|
23
37
|
}
|
|
24
38
|
export interface PropsReport {
|
|
25
39
|
enabled: boolean;
|
|
26
40
|
api?: string;
|
|
27
41
|
placed?: number;
|
|
42
|
+
prototypes?: number;
|
|
43
|
+
placedByKind?: Record<string, number>;
|
|
28
44
|
findings?: PropFinding[];
|
|
29
45
|
missing?: string[];
|
|
30
46
|
}
|
|
31
47
|
export interface PropsResult {
|
|
32
48
|
report: PropsReport;
|
|
49
|
+
findings: PropFinding[];
|
|
33
50
|
}
|
|
34
51
|
/** Why a GLB cannot be placed under the open-world contract; null when it can. */
|
|
35
52
|
export declare function glbRefusal(bytes: Uint8Array): string | null;
|
|
@@ -38,4 +55,28 @@ export declare function resolveProps(source: CitySource, options: {
|
|
|
38
55
|
log?: (line: string) => void;
|
|
39
56
|
offline?: boolean;
|
|
40
57
|
}): Promise<PropsResult>;
|
|
58
|
+
export interface PropRecord {
|
|
59
|
+
id: string;
|
|
60
|
+
prototype: string;
|
|
61
|
+
position: [number, number, number];
|
|
62
|
+
rotation: [number, number, number, number];
|
|
63
|
+
scale: 1;
|
|
64
|
+
}
|
|
65
|
+
export interface PlacedProps {
|
|
66
|
+
prototypes: PropPrototype[];
|
|
67
|
+
records: PropRecord[];
|
|
68
|
+
placedByKind: Record<string, number>;
|
|
69
|
+
/** Source POIs of a placeable kind that could not be placed, with the reason. */
|
|
70
|
+
skipped: Record<string, number>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* One structural record per source POI of a kit-covered kind, on the ground, faced toward the nearest street (the prop's +Z
|
|
74
|
+
* front reaches over the road: lamp arms, signal heads, mailbox doors). A POI beyond `bounds` is not placed. Which of a kind's
|
|
75
|
+
* (up to four) Packages a POI gets is a pure function of its id.
|
|
76
|
+
*/
|
|
77
|
+
export declare function placeProps(source: CitySource, findings: PropFinding[], options: {
|
|
78
|
+
heightAt: (x: number, z: number) => number;
|
|
79
|
+
bounds: [Vec2, Vec2];
|
|
80
|
+
log?: (line: string) => void;
|
|
81
|
+
}): Promise<PlacedProps>;
|
|
41
82
|
export {};
|
package/dist/city/props/index.js
CHANGED
|
@@ -4,25 +4,30 @@
|
|
|
4
4
|
// match means no prop and a line in the report saying what is missing.
|
|
5
5
|
//
|
|
6
6
|
// A found Package is held to the open-world contract before it can be placed: a static web GLB that the engine's loaders and
|
|
7
|
-
// the perf rules (P03/P04: KTX2 textures, meshopt or quantised geometry) accept.
|
|
8
|
-
//
|
|
9
|
-
//
|
|
7
|
+
// the perf rules (P03/P04: KTX2 textures, meshopt or quantised geometry) accept. A placeable street-props-kit Package
|
|
8
|
+
// (`kit:street-props-v1`, built by `helix city props kit`) is also placed: its LOD chain and collider become scene placement
|
|
9
|
+
// prototypes (`placePropPlacements`), one structural record per source POI, faced toward the nearest street.
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.WANTED_PROPS = exports.VAULT_DEFAULT_API = void 0;
|
|
11
|
+
exports.KIT_KINDS = exports.WANTED_PROPS = exports.VAULT_DEFAULT_API = void 0;
|
|
12
12
|
exports.glbRefusal = glbRefusal;
|
|
13
13
|
exports.resolveProps = resolveProps;
|
|
14
|
+
exports.placeProps = placeProps;
|
|
14
15
|
const node_crypto_1 = require("node:crypto");
|
|
16
|
+
const geometry_1 = require("./geometry");
|
|
17
|
+
const propsPrototype_1 = require("../../cs2/propsPrototype");
|
|
15
18
|
exports.VAULT_DEFAULT_API = 'https://helix-backend-api-helix3.up.railway.app';
|
|
16
19
|
exports.WANTED_PROPS = [
|
|
17
|
-
{ kind: 'waste_basket', label: 'litter bin', queries: ['garbage bin', 'trash can', 'litter bin', 'waste bin'], words: ['bin', 'trash', 'garbage', 'litter'] },
|
|
18
|
-
{ kind: 'bench', label: 'street bench', queries: ['
|
|
19
|
-
{ kind: 'street_lamp', label: 'street lamp', queries: ['street lamp', 'street light', 'lamp post', 'lamppost'], words: ['street', 'lamppost', 'post'] },
|
|
20
|
-
{ kind: 'fire_hydrant', label: 'fire hydrant', queries: ['fire hydrant', 'hydrant'], words: ['hydrant'] },
|
|
21
|
-
{ kind: 'bus_stop', label: 'bus shelter', queries: ['bus stop', 'bus shelter'], words: ['bus'] },
|
|
22
|
-
{ kind: 'post_box', label: 'mailbox', queries: ['mailbox', 'post box', 'letter box'], words: ['mailbox', 'post box', 'letter'] },
|
|
23
|
-
{ kind: 'traffic_signals', label: 'traffic signal', queries: ['traffic light', 'traffic signal'], words: ['traffic'] },
|
|
24
|
-
{ kind: 'bollard', label: 'bollard', queries: ['bollard'], words: ['bollard'] },
|
|
20
|
+
{ kind: 'waste_basket', label: 'litter bin', queries: ['litter-bin', 'garbage bin', 'trash can', 'litter bin', 'waste bin'], words: ['bin', 'trash', 'garbage', 'litter'], facing: 'road' },
|
|
21
|
+
{ kind: 'bench', label: 'street bench', queries: ['bench', 'park bench', 'street bench'], words: ['bench'], facing: 'road' },
|
|
22
|
+
{ kind: 'street_lamp', label: 'street lamp', queries: ['street-lamp', 'street lamp', 'street light', 'lamp post', 'lamppost'], words: ['street', 'lamppost', 'post'], facing: 'road' },
|
|
23
|
+
{ kind: 'fire_hydrant', label: 'fire hydrant', queries: ['fire-hydrant', 'fire hydrant', 'hydrant'], words: ['hydrant'], facing: 'road' },
|
|
24
|
+
{ kind: 'bus_stop', label: 'bus shelter', queries: ['bus-stop', 'bus stop', 'bus shelter'], words: ['bus'], facing: 'road' },
|
|
25
|
+
{ kind: 'post_box', label: 'mailbox', queries: ['mailbox', 'post box', 'letter box'], words: ['mailbox', 'post box', 'letter'], facing: 'road' },
|
|
26
|
+
{ kind: 'traffic_signals', label: 'traffic signal', queries: ['traffic-light', 'traffic light', 'traffic signal'], words: ['traffic'], facing: 'road' },
|
|
27
|
+
{ kind: 'bollard', label: 'bollard', queries: ['bollard'], words: ['bollard'], facing: 'road' },
|
|
25
28
|
];
|
|
29
|
+
/** Kit kinds the catalog search also answers for (no source POI names them today): reported, never placed. */
|
|
30
|
+
exports.KIT_KINDS = ['road_sign', 'planter', 'bike_rack', 'bridge_pillar'];
|
|
26
31
|
async function getJson(url, signal) {
|
|
27
32
|
try {
|
|
28
33
|
const response = await fetch(url, { signal, headers: { accept: 'application/json' } });
|
|
@@ -47,13 +52,38 @@ function glbRefusal(bytes) {
|
|
|
47
52
|
return 'it is animated or skinned';
|
|
48
53
|
return null;
|
|
49
54
|
}
|
|
55
|
+
const KIT_TAG = 'kit:street-props-v1';
|
|
56
|
+
const MAX_KIT_VARIANTS = 4;
|
|
57
|
+
async function fetchChecked(url, cid, signal) {
|
|
58
|
+
try {
|
|
59
|
+
const response = await fetch(url, { signal });
|
|
60
|
+
const data = new Uint8Array(await response.arrayBuffer());
|
|
61
|
+
const got = `cid:sha256:${(0, node_crypto_1.createHash)('sha256').update(data).digest('hex')}`;
|
|
62
|
+
if (!response.ok)
|
|
63
|
+
return { refusal: `the object could not be fetched (HTTP ${response.status})` };
|
|
64
|
+
if (got !== cid)
|
|
65
|
+
return { refusal: 'the fetched object does not match its CID' };
|
|
66
|
+
return { data };
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
return { refusal: `the object could not be fetched (${error instanceof Error ? error.message : String(error)})` };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Quality variants of a kit Package, finest first: the root, then `lod1`, `lod2`. */
|
|
73
|
+
function kitLods(item) {
|
|
74
|
+
const rank = (id) => (id === 'web' || !id ? 0 : Number(/^lod(\d)$/.exec(id)?.[1] ?? 9));
|
|
75
|
+
return (item.presentation?.renditions ?? [])
|
|
76
|
+
.filter((r) => r.cid && r.url)
|
|
77
|
+
.sort((a, b) => rank(a.variantId) - rank(b.variantId))
|
|
78
|
+
.map((r) => ({ cid: r.cid, url: r.url }));
|
|
79
|
+
}
|
|
50
80
|
async function resolveProps(source, options) {
|
|
51
81
|
const api = (options.api ?? exports.VAULT_DEFAULT_API).replace(/\/$/, '');
|
|
52
82
|
const counts = new Map();
|
|
53
83
|
for (const poi of source.pois ?? [])
|
|
54
84
|
counts.set(poi.kind, (counts.get(poi.kind) ?? 0) + 1);
|
|
55
85
|
const findings = [];
|
|
56
|
-
const signal = AbortSignal.timeout(
|
|
86
|
+
const signal = AbortSignal.timeout(60_000);
|
|
57
87
|
for (const want of exports.WANTED_PROPS) {
|
|
58
88
|
const poiCount = counts.get(want.kind) ?? 0;
|
|
59
89
|
if (!poiCount)
|
|
@@ -64,8 +94,10 @@ async function resolveProps(source, options) {
|
|
|
64
94
|
}
|
|
65
95
|
let reachable = false;
|
|
66
96
|
let found = null;
|
|
97
|
+
const kit = [];
|
|
98
|
+
const seen = new Set();
|
|
67
99
|
for (const query of want.queries) {
|
|
68
|
-
const result = await getJson(`${api}/api/v1/vault/catalog?q=${encodeURIComponent(query)}&limit=
|
|
100
|
+
const result = await getJson(`${api}/api/v1/vault/catalog?q=${encodeURIComponent(query)}&limit=48`, signal);
|
|
69
101
|
if (!result)
|
|
70
102
|
continue;
|
|
71
103
|
reachable = true;
|
|
@@ -73,37 +105,104 @@ async function resolveProps(source, options) {
|
|
|
73
105
|
const title = (item.title ?? '').toLowerCase();
|
|
74
106
|
if (item.packageType !== 'asset' || item.visibility !== 'public' || !item.packagePin || !item.root?.url)
|
|
75
107
|
continue;
|
|
76
|
-
|
|
108
|
+
const isKit = (item.tags ?? []).includes(KIT_TAG) && (item.tags ?? []).includes(`kind:${want.kind}`);
|
|
109
|
+
if (!isKit && !want.words.some((word) => new RegExp(`(^|[^a-z])${word}([^a-z]|$)`).test(title)))
|
|
77
110
|
continue;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
refusal = !response.ok ? `the root could not be fetched (HTTP ${response.status})` : cid !== item.root.cid ? 'the fetched root does not match its CID' : glbRefusal(data);
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
refusal = `the root could not be fetched (${error instanceof Error ? error.message : String(error)})`;
|
|
88
|
-
}
|
|
111
|
+
if (seen.has(item.packagePin.packageId))
|
|
112
|
+
continue;
|
|
113
|
+
seen.add(item.packagePin.packageId);
|
|
114
|
+
const candidate = { title: item.title ?? '', ...item.packagePin, bytes: item.expectedClosure?.totalBytes ?? item.root.bytes ?? 0, ...(isKit ? { kit: true, lods: kitLods(item) } : {}) };
|
|
115
|
+
const root = await fetchChecked(item.root.url, item.root.cid, signal);
|
|
116
|
+
const refusal = 'refusal' in root ? root.refusal : glbRefusal(root.data);
|
|
89
117
|
if (refusal) {
|
|
90
118
|
found ??= { kind: want.kind, label: want.label, poiCount, status: 'unplaceable', candidate, reason: `${item.title}: ${refusal}` };
|
|
91
119
|
continue;
|
|
92
120
|
}
|
|
93
|
-
|
|
94
|
-
|
|
121
|
+
if (isKit && kit.length < MAX_KIT_VARIANTS)
|
|
122
|
+
kit.push(candidate);
|
|
123
|
+
else if (!isKit && !kit.length && found?.status !== 'placeable')
|
|
124
|
+
found = { kind: want.kind, label: want.label, poiCount, status: 'placeable', candidate, reason: `${item.title} is a static web GLB within the contract` };
|
|
95
125
|
}
|
|
96
|
-
if (
|
|
126
|
+
if (kit.length >= MAX_KIT_VARIANTS)
|
|
97
127
|
break;
|
|
98
128
|
}
|
|
129
|
+
if (kit.length)
|
|
130
|
+
found = { kind: want.kind, label: want.label, poiCount, status: 'placeable', candidate: kit[0], candidates: kit, reason: `${kit.length} street-props kit Package${kit.length === 1 ? '' : 's'} (${kit.map((c) => c.title).join('; ')}), static web GLBs with a LOD chain within the contract` };
|
|
99
131
|
findings.push(found ?? { kind: want.kind, label: want.label, poiCount, status: reachable ? 'none' : 'unreachable', reason: reachable ? `no public asset in the Vault matches "${want.queries[0]}"` : 'the Vault catalog could not be reached' });
|
|
100
132
|
options.log?.(`props: ${want.kind} (${poiCount} in the source): ${findings[findings.length - 1].status}, ${findings[findings.length - 1].reason}`);
|
|
101
133
|
}
|
|
102
134
|
return {
|
|
135
|
+
findings,
|
|
103
136
|
report: {
|
|
104
137
|
enabled: true, api, placed: 0, findings,
|
|
105
138
|
missing: findings.filter((f) => f.status !== 'placeable').map((f) => `${f.label} (${f.poiCount})`),
|
|
106
139
|
},
|
|
107
140
|
};
|
|
108
141
|
}
|
|
142
|
+
const hash32 = (text) => (0, node_crypto_1.createHash)('sha256').update(text).digest().readUInt32LE(0);
|
|
143
|
+
/**
|
|
144
|
+
* One structural record per source POI of a kit-covered kind, on the ground, faced toward the nearest street (the prop's +Z
|
|
145
|
+
* front reaches over the road: lamp arms, signal heads, mailbox doors). A POI beyond `bounds` is not placed. Which of a kind's
|
|
146
|
+
* (up to four) Packages a POI gets is a pure function of its id.
|
|
147
|
+
*/
|
|
148
|
+
async function placeProps(source, findings, options) {
|
|
149
|
+
const streets = new geometry_1.StreetIndex(source);
|
|
150
|
+
const [[bx0, bz0], [bx1, bz1]] = options.bounds;
|
|
151
|
+
const prototypes = new Map();
|
|
152
|
+
const byKind = new Map();
|
|
153
|
+
const signal = AbortSignal.timeout(120_000);
|
|
154
|
+
for (const finding of findings) {
|
|
155
|
+
if (finding.status !== 'placeable' || !finding.candidates?.length)
|
|
156
|
+
continue;
|
|
157
|
+
const list = [];
|
|
158
|
+
for (const candidate of finding.candidates) {
|
|
159
|
+
if (!candidate.lods?.length)
|
|
160
|
+
continue;
|
|
161
|
+
const glbs = [];
|
|
162
|
+
for (const lod of candidate.lods) {
|
|
163
|
+
const got = await fetchChecked(lod.url, lod.cid, signal);
|
|
164
|
+
if ('refusal' in got)
|
|
165
|
+
throw new Error(`props: ${candidate.title}: ${got.refusal}`);
|
|
166
|
+
glbs.push(got.data);
|
|
167
|
+
}
|
|
168
|
+
const id = `prop-${candidate.packageId.slice(0, 8)}`;
|
|
169
|
+
const prototype = prototypes.get(id) ?? await (0, propsPrototype_1.propPrototypeFromGlbs)(id, glbs);
|
|
170
|
+
prototypes.set(id, prototype);
|
|
171
|
+
list.push(prototype);
|
|
172
|
+
}
|
|
173
|
+
if (list.length)
|
|
174
|
+
byKind.set(finding.kind, list);
|
|
175
|
+
}
|
|
176
|
+
const records = [];
|
|
177
|
+
const placedByKind = {};
|
|
178
|
+
const skipped = {};
|
|
179
|
+
for (const poi of [...(source.pois ?? [])].sort((a, b) => (a.id < b.id ? -1 : 1))) {
|
|
180
|
+
const options_ = byKind.get(poi.kind);
|
|
181
|
+
if (!options_)
|
|
182
|
+
continue;
|
|
183
|
+
const [x, z] = poi.p;
|
|
184
|
+
if (x < bx0 + 1 || x >= bx1 - 1 || z < bz0 + 1 || z >= bz1 - 1) {
|
|
185
|
+
skipped[poi.kind] = (skipped[poi.kind] ?? 0) + 1;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const want = exports.WANTED_PROPS.find((w) => w.kind === poi.kind);
|
|
189
|
+
const hit = streets.nearest([x, z]);
|
|
190
|
+
let yaw;
|
|
191
|
+
if (hit && hit.distance > 0.05 && want?.facing !== 'none')
|
|
192
|
+
yaw = Math.atan2(hit.point[0] - x, hit.point[1] - z) + (want?.facing === 'away' ? Math.PI : 0);
|
|
193
|
+
else if (poi.headingDeg !== undefined)
|
|
194
|
+
yaw = (poi.headingDeg * Math.PI) / 180;
|
|
195
|
+
else
|
|
196
|
+
yaw = (hash32(`${poi.id}:yaw`) / 4294967296) * Math.PI * 2;
|
|
197
|
+
const prototype = options_[hash32(`${poi.id}:variant`) % options_.length];
|
|
198
|
+
records.push({
|
|
199
|
+
id: `prop:${poi.id}`, prototype: prototype.id,
|
|
200
|
+
position: [Number(x.toFixed(3)), Number(options.heightAt(x, z).toFixed(3)), Number(z.toFixed(3))],
|
|
201
|
+
rotation: [0, Number(Math.sin(yaw / 2).toFixed(6)), 0, Number(Math.cos(yaw / 2).toFixed(6))], scale: 1,
|
|
202
|
+
});
|
|
203
|
+
placedByKind[poi.kind] = (placedByKind[poi.kind] ?? 0) + 1;
|
|
204
|
+
}
|
|
205
|
+
options.log?.(`props: placing ${records.length} street props (${Object.entries(placedByKind).map(([k, n]) => `${k} ${n}`).join(', ')}) over ${prototypes.size} prototypes`);
|
|
206
|
+
return { prototypes: [...prototypes.values()], records, placedByKind, skipped };
|
|
207
|
+
}
|
|
109
208
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/city/props/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/city/props/index.ts"],"names":[],"mappings":";AAAA,2HAA2H;AAC3H,2HAA2H;AAC3H,uEAAuE;AACvE,EAAE;AACF,6HAA6H;AAC7H,sHAAsH;AACtH,6HAA6H;AAC7H,6GAA6G;;;AAgF7G,gCASC;AA2BD,oCA6CC;AA4BD,gCAoDC;AA/OD,6CAAyC;AACzC,yCAAyC;AAEzC,6DAAqF;AAGxE,QAAA,iBAAiB,GAAG,iDAAiD,CAAC;AAItE,QAAA,YAAY,GAAa;IACpC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;IAC3L,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;IAC5H,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;IACtL,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;IACzI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;IAC5H,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;IAChJ,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,eAAe,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;IACvJ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;CAChG,CAAC;AAEF,8GAA8G;AACjG,QAAA,SAAS,GAAe,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AA8C5F,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,MAAmB;IACrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACvF,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA+B,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,SAAgB,UAAU,CAAC,KAAiB;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,UAAU;QAAE,OAAO,uBAAuB,CAAC;IAChG,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAiF,CAAC;IAC5K,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,GAAG,CAAC,4BAA4B,CAAC;QAAE,OAAO,yFAAyF,CAAC;IACjJ,IAAI,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAAE,OAAO,yDAAyD,CAAC;IACvG,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,2BAA2B,CAAC;IACtF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,GAAG,qBAAqB,CAAC;AACtC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,GAAW,EAAE,MAAmB;IACvE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,cAAc,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,yCAAyC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;QAClG,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC;QACjF,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACpH,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,SAAS,OAAO,CAAC,IAAiB;IAChC,MAAM,IAAI,GAAG,CAAC,EAA6B,EAAU,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3H,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,IAAI,EAAE,CAAC;SACzC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;SAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SACrD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,MAAkB,EAAE,OAA0E;IAC/H,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,yBAAiB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,oBAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7K,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,GAAuB,IAAI,CAAC;QACrC,MAAM,GAAG,GAAoB,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,GAAG,2BAA2B,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC5G,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC/C,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG;oBAAE,SAAS;gBAClH,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrG,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,aAAa,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAAE,SAAS;gBAC1G,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;oBAAE,SAAS;gBAClD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACpC,MAAM,SAAS,GAAkB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACxM,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACtE,MAAM,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzE,IAAI,OAAO,EAAE,CAAC;oBAAC,KAAK,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,EAAE,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC7J,IAAI,KAAK,IAAI,GAAG,CAAC,MAAM,GAAG,gBAAgB;oBAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;qBAC3D,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,MAAM,KAAK,WAAW;oBAAE,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,0CAA0C,EAAE,CAAC;YAC7N,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,IAAI,gBAAgB;gBAAE,MAAM;QAC5C,CAAC;QACD,IAAI,GAAG,CAAC,MAAM;YAAE,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,4BAA4B,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,yDAAyD,EAAE,CAAC;QAChT,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,yCAAyC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,wCAAwC,EAAE,CAAC,CAAC;QACjP,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,QAAQ,oBAAoB,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACrJ,CAAC;IACD,OAAO;QACL,QAAQ;QACR,MAAM,EAAE;YACN,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ;YACvC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;SACnG;KACF,CAAC;AACJ,CAAC;AAqBD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAEpG;;;;GAIG;AACI,KAAK,UAAU,UAAU,CAAC,MAAkB,EAAE,QAAuB,EAAE,OAI7E;IACC,MAAM,OAAO,GAAG,IAAI,sBAAW,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM;YAAE,SAAS;QAC5E,MAAM,IAAI,GAAoB,EAAE,CAAC;QACjC,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM;gBAAE,SAAS;YACtC,MAAM,IAAI,GAAiB,EAAE,CAAC;YAC9B,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACzD,IAAI,SAAS,IAAI,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,CAAC,KAAK,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YACD,MAAM,EAAE,GAAG,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,IAAA,sCAAqB,EAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9E,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC/H,MAAM,IAAI,GAAG,oBAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,GAAW,CAAC;QAChB,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM;YAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACrJ,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;YAAE,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;;YACzE,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC;YACX,EAAE,EAAE,QAAQ,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;YAC7C,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACjG,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;SACvG,CAAC,CAAC;QACH,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC,kBAAkB,OAAO,CAAC,MAAM,kBAAkB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,IAAI,aAAa,CAAC,CAAC;IAC5K,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AAClF,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CitySource, type Vec2 } from '../source';
|
|
2
|
+
import type { PropPrototype } from '../../cs2/propsPrototype';
|
|
2
3
|
export declare const CITY_TREES_PROTOTYPES: readonly ["douglas-fir", "ponderosa-pine"];
|
|
3
4
|
export declare function defaultTreeCatalog(): string;
|
|
4
5
|
export interface VegetationOptions {
|
|
@@ -11,6 +12,17 @@ export interface VegetationOptions {
|
|
|
11
12
|
/** Fill parks and forests as well as placing the source's own trees. */
|
|
12
13
|
fillAreas?: boolean;
|
|
13
14
|
catalog?: string;
|
|
15
|
+
/** Street props (Vault street-props kit) baked into the same placements as the trees: prototypes plus one record per prop. */
|
|
16
|
+
props?: {
|
|
17
|
+
prototypes: PropPrototype[];
|
|
18
|
+
records: Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
prototype: string;
|
|
21
|
+
position: [number, number, number];
|
|
22
|
+
rotation: [number, number, number, number];
|
|
23
|
+
scale: number;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
14
26
|
log?: (line: string) => void;
|
|
15
27
|
}
|
|
16
28
|
export interface VegetationReport {
|
|
@@ -11,9 +11,12 @@ const node_crypto_1 = require("node:crypto");
|
|
|
11
11
|
const promises_1 = require("node:fs/promises");
|
|
12
12
|
const node_path_1 = require("node:path");
|
|
13
13
|
const source_1 = require("../source");
|
|
14
|
+
const authored_1 = require("../../placements/authored");
|
|
15
|
+
const assets_1 = require("../../placements/assets");
|
|
14
16
|
const bake_1 = require("../../placements/bake");
|
|
15
17
|
const impostors_1 = require("../../placements/impostors");
|
|
16
18
|
const source_2 = require("../../placements/source");
|
|
19
|
+
const propsPrototype_1 = require("../../cs2/propsPrototype");
|
|
17
20
|
exports.CITY_TREES_PROTOTYPES = ['douglas-fir', 'ponderosa-pine'];
|
|
18
21
|
function defaultTreeCatalog() {
|
|
19
22
|
return (0, node_path_1.resolve)(__dirname, '..', '..', '..', 'assets', 'city-trees', 'v1', 'catalog.json');
|
|
@@ -154,19 +157,42 @@ function planTrees(source, bounds, options) {
|
|
|
154
157
|
}
|
|
155
158
|
async function buildVegetation(source, options) {
|
|
156
159
|
const log = options.log ?? (() => undefined);
|
|
157
|
-
|
|
160
|
+
let catalog = options.catalog ?? defaultTreeCatalog();
|
|
158
161
|
const planned = planTrees(source, source.manifest.frame.boundsXZ, { fillAreas: options.fillAreas !== false });
|
|
159
162
|
// The source's own trees first, then the fill; a hash order picks which fill trees survive a cap.
|
|
160
163
|
const own = planned.spots.filter((s) => s.origin === 'source');
|
|
161
164
|
const fill = planned.spots.filter((s) => s.origin === 'area').sort((a, b) => hash32(a.id, 'cap') - hash32(b.id, 'cap'));
|
|
162
165
|
const chosen = [...own, ...fill].slice(0, options.maxTrees);
|
|
163
|
-
|
|
166
|
+
const props = options.props?.records.length ? options.props : null;
|
|
167
|
+
if (!chosen.length && !props)
|
|
164
168
|
return { placementsDir: null, report: { enabled: true, instances: 0, prototypes: 0, note: 'the source has no trees and no parks or forests to fill' } };
|
|
165
169
|
const dir = (0, node_path_1.resolve)(options.dir);
|
|
166
170
|
await (0, promises_1.rm)(dir, { recursive: true, force: true });
|
|
167
171
|
await (0, promises_1.mkdir)((0, node_path_1.join)(dir, 'fine'), { recursive: true });
|
|
168
172
|
const sourceFile = (0, node_path_1.join)(dir, 'placements-source.json');
|
|
169
|
-
|
|
173
|
+
if (props) {
|
|
174
|
+
// One placements bake carries both: the tree catalog's assets are copied beside the props' so a single inventory serves it.
|
|
175
|
+
const base = JSON.parse(await (0, promises_1.readFile)(catalog, 'utf8'));
|
|
176
|
+
const keep = base.prototypes.filter((p) => exports.CITY_TREES_PROTOTYPES.includes(p.id));
|
|
177
|
+
const merged = (0, node_path_1.join)(dir, 'catalog');
|
|
178
|
+
const textures = {};
|
|
179
|
+
const files = new Set();
|
|
180
|
+
for (const prototype of keep)
|
|
181
|
+
for (const family of Object.values(prototype.families)) {
|
|
182
|
+
for (const uri of family.textures) {
|
|
183
|
+
textures[uri] = base.textures[uri];
|
|
184
|
+
files.add(uri);
|
|
185
|
+
}
|
|
186
|
+
for (const lod of family.lods)
|
|
187
|
+
files.add(lod.file);
|
|
188
|
+
}
|
|
189
|
+
for (const file of files) {
|
|
190
|
+
await (0, promises_1.mkdir)((0, node_path_1.dirname)((0, node_path_1.join)(merged, file)), { recursive: true });
|
|
191
|
+
await (0, promises_1.copyFile)((0, node_path_1.join)((0, node_path_1.dirname)(catalog), file), (0, node_path_1.join)(merged, file));
|
|
192
|
+
}
|
|
193
|
+
catalog = await (0, propsPrototype_1.writePropInventory)(merged, props.prototypes, { textures, prototypes: keep, copy: [] });
|
|
194
|
+
}
|
|
195
|
+
const treePlacements = chosen.map((t) => {
|
|
170
196
|
const yaw = unit(t.id, 'yaw') * Math.PI * 2;
|
|
171
197
|
const scale = 0.75 + unit(t.id, 'scale') * 0.55;
|
|
172
198
|
return {
|
|
@@ -177,16 +203,32 @@ async function buildVegetation(source, options) {
|
|
|
177
203
|
scale: Number(scale.toFixed(3)),
|
|
178
204
|
};
|
|
179
205
|
});
|
|
180
|
-
|
|
181
|
-
schema: 'helix.placements-source/1', terrain: (0, node_path_1.relative)(dir, (0, node_path_1.resolve)(options.terrainDir)), catalog: (0, node_path_1.relative)(dir, catalog), layers: [], placements, metresPerSample: 4,
|
|
182
|
-
})}\n`);
|
|
183
|
-
log(`vegetation: baking ${placements.length} trees (${own.length} from the source, ${chosen.length - own.length} filling parks and forests)`);
|
|
206
|
+
const placements = props ? [...treePlacements, ...props.records] : treePlacements;
|
|
184
207
|
const fine = (0, node_path_1.join)(dir, 'fine');
|
|
185
|
-
|
|
208
|
+
log(`vegetation: baking ${treePlacements.length} trees (${own.length} from the source, ${chosen.length - own.length} filling parks and forests)${props ? ` and ${props.records.length} street props` : ''}`);
|
|
209
|
+
if (props) {
|
|
210
|
+
// Trees and street furniture together are far beyond the 1 MiB authoring-source cap, so exact records stream into the regions
|
|
211
|
+
// (the CS2 tree bake does the same). Stable ids are derived as the authoring path derives them.
|
|
212
|
+
const inventory = await (0, assets_1.preparePlacementsInventory)(catalog, fine);
|
|
213
|
+
const indexOf = new Map(inventory.prototypes.map((prototype, index) => [prototype.id, index]));
|
|
214
|
+
const records = placements.map((placement) => {
|
|
215
|
+
const prototype = indexOf.get(placement.prototype);
|
|
216
|
+
if (prototype === undefined)
|
|
217
|
+
throw new Error(`vegetation: prototype ${placement.prototype} is not in the merged inventory`);
|
|
218
|
+
return { ...placement, id: (0, source_2.placementsDigest)(new TextEncoder().encode(`manual:${placement.id}`)).slice(0, 32), prototype };
|
|
219
|
+
});
|
|
220
|
+
await (0, authored_1.bakeAuthoredPlacements)({ ...inventory, output: fine, records, heightAt: options.heightAt });
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
await (0, promises_1.writeFile)(sourceFile, `${JSON.stringify({
|
|
224
|
+
schema: 'helix.placements-source/1', terrain: (0, node_path_1.relative)(dir, (0, node_path_1.resolve)(options.terrainDir)), catalog: (0, node_path_1.relative)(dir, catalog), layers: [], placements, metresPerSample: 4,
|
|
225
|
+
})}\n`);
|
|
226
|
+
await (0, bake_1.bakePlacements)(sourceFile, fine);
|
|
227
|
+
}
|
|
186
228
|
let finalDir = fine;
|
|
187
229
|
let impostors = false;
|
|
188
230
|
const inventory = (0, source_2.inspectPlacementsBake)(fine);
|
|
189
|
-
if (
|
|
231
|
+
if (treePlacements.length > 1000) {
|
|
190
232
|
log('vegetation: baking distant impostor pages (over 1,000 trees)');
|
|
191
233
|
const out = (0, node_path_1.join)(dir, 'final');
|
|
192
234
|
await (0, impostors_1.bakeTreeImpostors)(fine, out, { size: 512, onProgress: (message) => log(` ${message}`) });
|
|
@@ -197,7 +239,7 @@ async function buildVegetation(source, options) {
|
|
|
197
239
|
return {
|
|
198
240
|
placementsDir: finalDir,
|
|
199
241
|
report: {
|
|
200
|
-
enabled: true, instances: finalInventory.structuralInstances, prototypes: finalInventory.prototypes.length,
|
|
242
|
+
enabled: true, instances: finalInventory.structuralInstances - (props?.records.length ?? 0), prototypes: finalInventory.prototypes.length - (props?.prototypes.length ?? 0),
|
|
201
243
|
fromSource: own.length, fromAreas: chosen.length - own.length, droppedInsideBuildings: planned.droppedInsideBuildings, impostors, bytes: finalInventory.bytes,
|
|
202
244
|
},
|
|
203
245
|
};
|