@hypersoniclabs/helix-cli 0.1.25-helix3.488 → 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.
Files changed (92) hide show
  1. package/dist/city/assemble/create.js +10 -2
  2. package/dist/city/assemble/create.js.map +1 -1
  3. package/dist/city/props/geometry.d.ts +17 -0
  4. package/dist/city/props/geometry.js +47 -0
  5. package/dist/city/props/geometry.js.map +1 -0
  6. package/dist/city/props/index.d.ts +49 -8
  7. package/dist/city/props/index.js +128 -29
  8. package/dist/city/props/index.js.map +1 -1
  9. package/dist/city/vegetation/index.d.ts +12 -0
  10. package/dist/city/vegetation/index.js +52 -10
  11. package/dist/city/vegetation/index.js.map +1 -1
  12. package/dist/cs2/convert/props.d.ts +73 -0
  13. package/dist/cs2/convert/props.js +351 -0
  14. package/dist/cs2/convert/props.js.map +1 -0
  15. package/dist/cs2/index.d.ts +1 -1
  16. package/dist/cs2/index.js.map +1 -1
  17. package/dist/cs2/inspect.d.ts +1 -1
  18. package/dist/cs2/inspect.js +2 -2
  19. package/dist/cs2/inspect.js.map +1 -1
  20. package/dist/cs2/props.d.ts +57 -0
  21. package/dist/cs2/props.js +100 -0
  22. package/dist/cs2/props.js.map +1 -0
  23. package/dist/cs2/propsCommand.d.ts +7 -0
  24. package/dist/cs2/propsCommand.js +108 -0
  25. package/dist/cs2/propsCommand.js.map +1 -0
  26. package/dist/cs2/propsPillars.d.ts +31 -0
  27. package/dist/cs2/propsPillars.js +55 -0
  28. package/dist/cs2/propsPillars.js.map +1 -0
  29. package/dist/cs2/propsPrototype.d.ts +32 -0
  30. package/dist/cs2/propsPrototype.js +100 -0
  31. package/dist/cs2/propsPrototype.js.map +1 -0
  32. package/dist/cs2/propsPublish.d.ts +23 -0
  33. package/dist/cs2/propsPublish.js +76 -0
  34. package/dist/cs2/propsPublish.js.map +1 -0
  35. package/dist/cs2/restyle/bakedCell.d.ts +18 -0
  36. package/dist/cs2/restyle/bakedCell.js +102 -0
  37. package/dist/cs2/restyle/bakedCell.js.map +1 -0
  38. package/dist/cs2/restyle/cellGlb.d.ts +34 -0
  39. package/dist/cs2/restyle/cellGlb.js +132 -0
  40. package/dist/cs2/restyle/cellGlb.js.map +1 -0
  41. package/dist/cs2/restyle/classify.d.ts +22 -0
  42. package/dist/cs2/restyle/classify.js +43 -0
  43. package/dist/cs2/restyle/classify.js.map +1 -0
  44. package/dist/cs2/restyle/command.d.ts +6 -0
  45. package/dist/cs2/restyle/command.js +93 -0
  46. package/dist/cs2/restyle/command.js.map +1 -0
  47. package/dist/cs2/restyle/far.d.ts +45 -0
  48. package/dist/cs2/restyle/far.js +147 -0
  49. package/dist/cs2/restyle/far.js.map +1 -0
  50. package/dist/cs2/restyle/format.d.ts +2 -0
  51. package/dist/cs2/restyle/format.js +17 -0
  52. package/dist/cs2/restyle/format.js.map +1 -0
  53. package/dist/cs2/restyle/grow.d.ts +34 -0
  54. package/dist/cs2/restyle/grow.js +74 -0
  55. package/dist/cs2/restyle/grow.js.map +1 -0
  56. package/dist/cs2/restyle/refine.d.ts +15 -0
  57. package/dist/cs2/restyle/refine.js +118 -0
  58. package/dist/cs2/restyle/refine.js.map +1 -0
  59. package/dist/cs2/restyle/restyle.d.ts +91 -0
  60. package/dist/cs2/restyle/restyle.js +437 -0
  61. package/dist/cs2/restyle/restyle.js.map +1 -0
  62. package/dist/cs2/restyle/scenePatch.d.ts +27 -0
  63. package/dist/cs2/restyle/scenePatch.js +104 -0
  64. package/dist/cs2/restyle/scenePatch.js.map +1 -0
  65. package/dist/cs2/restyle/walk.d.ts +48 -0
  66. package/dist/cs2/restyle/walk.js +77 -0
  67. package/dist/cs2/restyle/walk.js.map +1 -0
  68. package/dist/cs2/roads.d.ts +11 -6
  69. package/dist/cs2/roads.js +27 -19
  70. package/dist/cs2/roads.js.map +1 -1
  71. package/dist/cs2/types.d.ts +2 -1
  72. package/dist/index.js +4 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/tsconfig.build.tsbuildinfo +1 -1
  75. package/docs/scene-create.md +2 -3
  76. package/docs/scene-perf.md +5 -0
  77. package/package.json +1 -1
  78. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  79. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  80. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  81. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  82. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  83. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  84. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  85. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  86. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  87. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  88. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  89. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  90. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  91. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  92. 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":"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"}
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 { CitySource } from '../source';
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
- title: string;
17
- packageId: string;
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 {};
@@ -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. The only placement route that exists today
8
- // is a `universal-item.instances` row against a Continuum Package pin (the Scene Devices host), which the run shell must mount,
9
- // so a prop is reported `placeable` here and composed only when the plan asks for items (`props.items`, not yet wired).
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: ['park bench', 'street bench', 'bench'], words: ['bench'] },
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(20_000);
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=24`, signal);
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
- if (!want.words.some((word) => new RegExp(`(^|[^a-z])${word}([^a-z]|$)`).test(title)))
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
- const candidate = { title: item.title ?? '', ...item.packagePin, bytes: item.expectedClosure?.totalBytes ?? item.root.bytes ?? 0 };
79
- let refusal = null;
80
- try {
81
- const response = await fetch(item.root.url, { signal });
82
- const data = new Uint8Array(await response.arrayBuffer());
83
- const cid = `cid:sha256:${(0, node_crypto_1.createHash)('sha256').update(data).digest('hex')}`;
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
- found = { kind: want.kind, label: want.label, poiCount, status: 'placeable', candidate, reason: `${item.title} is a static web GLB within the contract` };
94
- break;
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 (found?.status === 'placeable')
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":"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"}
@@ -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
- const catalog = options.catalog ?? defaultTreeCatalog();
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
- if (!chosen.length)
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
- const placements = chosen.map((t) => {
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
- await (0, promises_1.writeFile)(sourceFile, `${JSON.stringify({
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
- await (0, bake_1.bakePlacements)(sourceFile, fine);
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 (inventory.structuralInstances > 1000) {
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
  };