@hypersoniclabs/helix-cli 0.1.25-helix3.481 → 0.1.25-helix3.484

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 (150) hide show
  1. package/NOTICE +33 -0
  2. package/README.md +1 -0
  3. package/dist/city/import/cs2/areas.d.ts +43 -0
  4. package/dist/city/import/cs2/areas.js +343 -0
  5. package/dist/city/import/cs2/areas.js.map +1 -0
  6. package/dist/city/import/cs2/buildings.d.ts +31 -0
  7. package/dist/city/import/cs2/buildings.js +207 -0
  8. package/dist/city/import/cs2/buildings.js.map +1 -0
  9. package/dist/city/import/cs2/command.d.ts +6 -0
  10. package/dist/city/import/cs2/command.js +86 -0
  11. package/dist/city/import/cs2/command.js.map +1 -0
  12. package/dist/city/import/cs2/footprint.d.ts +43 -0
  13. package/dist/city/import/cs2/footprint.js +343 -0
  14. package/dist/city/import/cs2/footprint.js.map +1 -0
  15. package/dist/city/import/cs2/frame.d.ts +15 -0
  16. package/dist/city/import/cs2/frame.js +44 -0
  17. package/dist/city/import/cs2/frame.js.map +1 -0
  18. package/dist/city/import/cs2/import.d.ts +61 -0
  19. package/dist/city/import/cs2/import.js +263 -0
  20. package/dist/city/import/cs2/import.js.map +1 -0
  21. package/dist/city/import/cs2/index.d.ts +4 -0
  22. package/dist/city/import/cs2/index.js +18 -0
  23. package/dist/city/import/cs2/index.js.map +1 -0
  24. package/dist/city/import/cs2/poly.d.ts +37 -0
  25. package/dist/city/import/cs2/poly.js +254 -0
  26. package/dist/city/import/cs2/poly.js.map +1 -0
  27. package/dist/city/import/cs2/refusals.d.ts +22 -0
  28. package/dist/city/import/cs2/refusals.js +47 -0
  29. package/dist/city/import/cs2/refusals.js.map +1 -0
  30. package/dist/city/import/cs2/roads.d.ts +49 -0
  31. package/dist/city/import/cs2/roads.js +612 -0
  32. package/dist/city/import/cs2/roads.js.map +1 -0
  33. package/dist/city/import/cs2/tables.d.ts +29 -0
  34. package/dist/city/import/cs2/tables.js +85 -0
  35. package/dist/city/import/cs2/tables.js.map +1 -0
  36. package/dist/city/import/cs2/terrain.d.ts +18 -0
  37. package/dist/city/import/cs2/terrain.js +68 -0
  38. package/dist/city/import/cs2/terrain.js.map +1 -0
  39. package/dist/city/import/cs2/trees.d.ts +16 -0
  40. package/dist/city/import/cs2/trees.js +48 -0
  41. package/dist/city/import/cs2/trees.js.map +1 -0
  42. package/dist/city/import/cs2/water.d.ts +36 -0
  43. package/dist/city/import/cs2/water.js +223 -0
  44. package/dist/city/import/cs2/water.js.map +1 -0
  45. package/dist/glb/render.d.ts +16 -0
  46. package/dist/glb/render.js +187 -0
  47. package/dist/glb/render.js.map +1 -0
  48. package/dist/index.js +34 -6
  49. package/dist/index.js.map +1 -1
  50. package/dist/model/budgets.d.ts +7 -0
  51. package/dist/model/budgets.js +26 -0
  52. package/dist/model/budgets.js.map +1 -0
  53. package/dist/model/catalog.d.ts +16 -0
  54. package/dist/model/catalog.js +652 -0
  55. package/dist/model/catalog.js.map +1 -0
  56. package/dist/model/codec.d.ts +6 -0
  57. package/dist/model/codec.js +72 -0
  58. package/dist/model/codec.js.map +1 -0
  59. package/dist/model/commands.d.ts +4 -0
  60. package/dist/model/commands.js +130 -0
  61. package/dist/model/commands.js.map +1 -0
  62. package/dist/model/examples/arched-gate.model.js +48 -0
  63. package/dist/model/examples/crate.model.js +26 -0
  64. package/dist/model/examples/street-lamp.model.js +76 -0
  65. package/dist/model/helperNames.d.ts +10 -0
  66. package/dist/model/helperNames.js +76 -0
  67. package/dist/model/helperNames.js.map +1 -0
  68. package/dist/model/index.d.ts +9 -0
  69. package/dist/model/index.js +25 -0
  70. package/dist/model/index.js.map +1 -0
  71. package/dist/model/instrument.d.ts +3 -0
  72. package/dist/model/instrument.js +72 -0
  73. package/dist/model/instrument.js.map +1 -0
  74. package/dist/model/manifold.wasm.bin +0 -0
  75. package/dist/model/node.d.ts +11 -0
  76. package/dist/model/node.js +101 -0
  77. package/dist/model/node.js.map +1 -0
  78. package/dist/model/policy.d.ts +3 -0
  79. package/dist/model/policy.js +188 -0
  80. package/dist/model/policy.js.map +1 -0
  81. package/dist/model/runtime.bundle.txt +3832 -0
  82. package/dist/model/search.d.ts +29 -0
  83. package/dist/model/search.js +137 -0
  84. package/dist/model/search.js.map +1 -0
  85. package/dist/model/tuning.d.ts +34 -0
  86. package/dist/model/tuning.js +35 -0
  87. package/dist/model/tuning.js.map +1 -0
  88. package/dist/model/types.d.ts +60 -0
  89. package/dist/model/types.js +4 -0
  90. package/dist/model/types.js.map +1 -0
  91. package/dist/model/workerCode.d.ts +19 -0
  92. package/dist/model/workerCode.js +78 -0
  93. package/dist/model/workerCode.js.map +1 -0
  94. package/dist/sceneSplit/chunk.d.ts +55 -0
  95. package/dist/sceneSplit/chunk.js +202 -0
  96. package/dist/sceneSplit/chunk.js.map +1 -0
  97. package/dist/sceneSplit/clip.d.ts +37 -0
  98. package/dist/sceneSplit/clip.js +154 -0
  99. package/dist/sceneSplit/clip.js.map +1 -0
  100. package/dist/sceneSplit/commands.d.ts +3 -0
  101. package/dist/sceneSplit/commands.js +115 -0
  102. package/dist/sceneSplit/commands.js.map +1 -0
  103. package/dist/sceneSplit/fragments.d.ts +15 -0
  104. package/dist/sceneSplit/fragments.js +155 -0
  105. package/dist/sceneSplit/fragments.js.map +1 -0
  106. package/dist/sceneSplit/geometryQueries.d.ts +9 -0
  107. package/dist/sceneSplit/geometryQueries.js +63 -0
  108. package/dist/sceneSplit/geometryQueries.js.map +1 -0
  109. package/dist/sceneSplit/gltfIo.d.ts +13 -0
  110. package/dist/sceneSplit/gltfIo.js +24 -0
  111. package/dist/sceneSplit/gltfIo.js.map +1 -0
  112. package/dist/sceneSplit/ktx2.d.ts +9 -0
  113. package/dist/sceneSplit/ktx2.js +80 -0
  114. package/dist/sceneSplit/ktx2.js.map +1 -0
  115. package/dist/sceneSplit/math.d.ts +48 -0
  116. package/dist/sceneSplit/math.js +221 -0
  117. package/dist/sceneSplit/math.js.map +1 -0
  118. package/dist/sceneSplit/plan.d.ts +37 -0
  119. package/dist/sceneSplit/plan.js +152 -0
  120. package/dist/sceneSplit/plan.js.map +1 -0
  121. package/dist/sceneSplit/source.d.ts +30 -0
  122. package/dist/sceneSplit/source.js +180 -0
  123. package/dist/sceneSplit/source.js.map +1 -0
  124. package/dist/sceneSplit/split.d.ts +29 -0
  125. package/dist/sceneSplit/split.js +969 -0
  126. package/dist/sceneSplit/split.js.map +1 -0
  127. package/dist/sceneSplit/testutil/fixtures.d.ts +17 -0
  128. package/dist/sceneSplit/testutil/fixtures.js +223 -0
  129. package/dist/sceneSplit/testutil/fixtures.js.map +1 -0
  130. package/dist/sceneSplit/types.d.ts +175 -0
  131. package/dist/sceneSplit/types.js +3 -0
  132. package/dist/sceneSplit/types.js.map +1 -0
  133. package/dist/tsconfig.build.tsbuildinfo +1 -1
  134. package/docs/scene-split.md +97 -0
  135. package/package.json +34 -4
  136. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  137. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  138. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  139. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  140. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  141. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  142. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  143. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  144. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  145. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  146. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  147. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  148. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  149. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  150. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
package/NOTICE ADDED
@@ -0,0 +1,33 @@
1
+ @hypersoniclabs/helix-cli
2
+ Copyright (c) 2026 Hypersonic Labs
3
+
4
+ This package includes third-party software:
5
+
6
+ Kiln (github.com/matthew-kissinger/kiln)
7
+ Copyright (c) 2026 Matthew Kissinger
8
+ License: MIT
9
+ Used in: src/model/runtime/kiln/* and src/model/search.ts (geometry helpers, solids bridge, part connectivity,
10
+ helper search), ported and modified. Each ported file carries an attribution header.
11
+
12
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
13
+ documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
14
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
15
+ persons to whom the Software is furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
18
+ Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
21
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
22
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ manifold-3d (github.com/elalish/manifold)
26
+ License: Apache License 2.0 (www.apache.org/licenses/LICENSE-2.0)
27
+ Bundled into dist/model/runtime.bundle.txt (the JavaScript glue, patched to skip Node detection) and shipped as
28
+ dist/model/manifold.wasm.bin (unmodified).
29
+
30
+ three.js (github.com/mrdoob/three.js)
31
+ Copyright (c) 2010-2025 three.js authors
32
+ License: MIT
33
+ Bundled into dist/model/runtime.bundle.txt.
package/README.md CHANGED
@@ -106,6 +106,7 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
106
106
  | `helix world scene-source inventory\|compile <helsinki\|bistro> <archive>` | Verify and safely inventory a known CC BY source archive, then compile deterministic local proxy/detail GLBs and an existing-schema Scene v2 package. |
107
107
  | `helix world scene-source publish <world-id> <package-dir> [--publish]` | Validate the Scene v2 package, refuse it if it breaks the open-world performance rules (docs/scene-perf.md; no override), and print its multipart build receipt. Execution remains dry-run-only until backend private-pin entitlement lands; `--publish` currently fails closed, and access control never changes CC BY rights. |
108
108
  | `helix scene validate <dir\|file> [--perf] [--tier desktop\|mobile\|desktop,mobile] [--out <report.json>]` | Check a Scene v2 package against the shared validator and, with `--perf`, the 14 open-world performance rules (textures, geometry, cells, draws, budget, first-playable bytes). Exit 0 pass, 1 refused, 2 cannot be judged. See `docs/scene-perf.md`. |
109
+ | `helix scene split <input> -o <dir> [--cell-size m] [--core-radius m] [--spawn x,y,z] [--textures ktx2\|keep]` | Split a monolithic environment (one big shell GLB, or a Scene v2 document with an eager shell) into a small eager spawn core plus distance-streamed cells on a fixed, content-addressed grid. Writes a validated Scene v2 package with per-cell bounds, priority and an honest memory budget, plus a report of eager bytes before and after. Deterministic and byte-identical on a rerun; never publishes. See [`docs/scene-split.md`](docs/scene-split.md). |
109
110
  | `helix continuum publish-source-map\|publish-scratch\|publish-package\|publish-glb\|make-item\|publish-owned-item` | Resume exact-CID object adoption/ingestion, Package lease/seal, optional explicitly authorized Listing, and WorldRelease publication through one creator-owned pipeline. |
110
111
  | `helix continuum receipt <job-id>` | Read the sanitized durable receipt for a completed Continuum publication. |
111
112
  | `helix unreal init\|validate\|doctor\|package [project]` | Create and gate a shared-runtime or native-game publish manifest, check optional editor MCP, and assemble a local upload-shaped package. |
@@ -0,0 +1,43 @@
1
+ import { type CityArea } from '../../source';
2
+ import type { Frame } from './frame';
3
+ import { type PolygonWithHoles } from './poly';
4
+ import type { RefusalLog } from './refusals';
5
+ export interface AreaStats {
6
+ records: number;
7
+ rows: number;
8
+ kinds: Record<string, number>;
9
+ withHoles: number;
10
+ totalKm2: number;
11
+ }
12
+ /** Split a closed vertex loop wherever a vertex repeats, so each piece visits every vertex at most once. */
13
+ export declare function splitAtPinches(loop: number[]): number[][];
14
+ /** Directed boundary loops of a triangle set, in scene (x, z). Triangles are re-wound CCW from above first. */
15
+ export declare function trianglesToPolygons(positions: ArrayLike<number>, vertexIds: Uint32Array | number[], weld?: number): {
16
+ polygons: PolygonWithHoles[];
17
+ orphanHoles: number;
18
+ };
19
+ /**
20
+ * The outline of a triangle set by rasterising it, for records whose triangles overlap or double back so that the exact
21
+ * boundary is not a simple polygon. The outline is within one cell (0.25 m, coarser only for areas over 400 m across).
22
+ */
23
+ export declare function rasterPolygons(positions: ArrayLike<number>, vertexIds: Uint32Array | number[]): {
24
+ polygons: PolygonWithHoles[];
25
+ orphanHoles: number;
26
+ };
27
+ export declare function importAreas(bundle: string, frame: Frame, refusals: RefusalLog): Promise<{
28
+ areas: CityArea[];
29
+ stats: AreaStats;
30
+ }>;
31
+ export interface CleanedPolygon extends PolygonWithHoles {
32
+ /** What was done to make the polygon simple, when it was not simple as traced. */
33
+ repairs: Array<'hole-shrunk' | 'hole-dropped'>;
34
+ }
35
+ /**
36
+ * Simplify and round a polygon; null when what is left is not a clean simple polygon. A hole that touches its own
37
+ * outer ring (a park with a pond cut to its edge) cannot be a valid hole, so it is shrunk until it clears, or dropped.
38
+ */
39
+ export declare function cleanPolygon(polygon: PolygonWithHoles): CleanedPolygon | null;
40
+ export declare const AREA_STRIDES: {
41
+ record: number;
42
+ position: number;
43
+ };
@@ -0,0 +1,343 @@
1
+ "use strict";
2
+ // Land use: CS2 paints areas (parks, fields, forest, paving) as triangle meshes, one record per area. The outline of a
3
+ // triangle set is the edges used by exactly one triangle; chaining them gives the outer rings and the holes.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.AREA_STRIDES = void 0;
6
+ exports.splitAtPinches = splitAtPinches;
7
+ exports.trianglesToPolygons = trianglesToPolygons;
8
+ exports.rasterPolygons = rasterPolygons;
9
+ exports.importAreas = importAreas;
10
+ exports.cleanPolygon = cleanPolygon;
11
+ const areas_1 = require("../../../cs2/areas");
12
+ const source_1 = require("../../source");
13
+ const poly_1 = require("./poly");
14
+ const tables_1 = require("./tables");
15
+ const MIN_AREA_M2 = 0.5;
16
+ const SIMPLIFY_M = 0.15;
17
+ /** Split a closed vertex loop wherever a vertex repeats, so each piece visits every vertex at most once. */
18
+ function splitAtPinches(loop) {
19
+ const pieces = [];
20
+ const stack = [];
21
+ const at = new Map();
22
+ for (const v of loop) {
23
+ const seen = at.get(v);
24
+ if (seen !== undefined) {
25
+ const piece = stack.splice(seen);
26
+ for (const w of piece)
27
+ at.delete(w);
28
+ pieces.push(piece);
29
+ }
30
+ at.set(v, stack.length);
31
+ stack.push(v);
32
+ }
33
+ if (stack.length > 0)
34
+ pieces.push(stack);
35
+ return pieces;
36
+ }
37
+ /** Directed boundary loops of a triangle set, in scene (x, z). Triangles are re-wound CCW from above first. */
38
+ function trianglesToPolygons(positions, vertexIds, weld = 0.01) {
39
+ // Weld vertices closer than `weld`: look in the 3 x 3 cells around the point so a pair straddling a cell edge still merges.
40
+ const cells = new Map();
41
+ const points = [];
42
+ const vertex = (v) => {
43
+ const x = positions[v * areas_1.AREA_POSITION_STRIDE];
44
+ const z = positions[v * areas_1.AREA_POSITION_STRIDE + 2];
45
+ const cx = Math.floor(x / weld);
46
+ const cz = Math.floor(z / weld);
47
+ for (let i = cx - 1; i <= cx + 1; i += 1) {
48
+ for (let j = cz - 1; j <= cz + 1; j += 1) {
49
+ for (const id of cells.get(`${i},${j}`) ?? []) {
50
+ if (Math.hypot(points[id][0] - x, points[id][1] - z) <= weld)
51
+ return id;
52
+ }
53
+ }
54
+ }
55
+ const id = points.length;
56
+ points.push([x, z]);
57
+ const k = `${cx},${cz}`;
58
+ const list = cells.get(k);
59
+ if (list)
60
+ list.push(id);
61
+ else
62
+ cells.set(k, [id]);
63
+ return id;
64
+ };
65
+ // Directed edges a->b with the interior on the left seen from above. An interior edge appears once in each direction.
66
+ const out = new Map();
67
+ const edgeCount = new Map();
68
+ const edgeKey = (a, b) => a * 4294967296 + b;
69
+ const triangles = [];
70
+ for (let t = 0; t + 2 < vertexIds.length; t += 3) {
71
+ let a = vertex(vertexIds[t]);
72
+ let b = vertex(vertexIds[t + 1]);
73
+ let c = vertex(vertexIds[t + 2]);
74
+ if (a === b || b === c || a === c)
75
+ continue;
76
+ // Shoelace over (x, z): negative is CCW from above. Flip a CW triangle.
77
+ const area2 = (points[b][0] - points[a][0]) * (points[c][1] - points[a][1]) - (points[c][0] - points[a][0]) * (points[b][1] - points[a][1]);
78
+ if (area2 === 0)
79
+ continue;
80
+ if (area2 > 0)
81
+ [b, c] = [c, b];
82
+ triangles.push([a, b, c]);
83
+ }
84
+ for (const [a, b, c] of triangles) {
85
+ for (const [p, q] of [[a, b], [b, c], [c, a]])
86
+ edgeCount.set(edgeKey(p, q), (edgeCount.get(edgeKey(p, q)) ?? 0) + 1);
87
+ }
88
+ for (const [k, count] of edgeCount) {
89
+ const a = Math.floor(k / 4294967296);
90
+ const b = k - a * 4294967296;
91
+ // Cancel against the opposite directed edge: a shared (interior) edge.
92
+ const opposite = edgeCount.get(edgeKey(b, a)) ?? 0;
93
+ if (count - opposite <= 0)
94
+ continue;
95
+ const list = out.get(a);
96
+ if (list)
97
+ list.push(b);
98
+ else
99
+ out.set(a, [b]);
100
+ }
101
+ const outers = [];
102
+ const holes = [];
103
+ const used = new Set();
104
+ for (const [start, targets] of out) {
105
+ for (const first of targets) {
106
+ if (used.has(edgeKey(start, first)))
107
+ continue;
108
+ const loop = [];
109
+ let a = start;
110
+ let b = first;
111
+ let closed = false;
112
+ for (let guard = 0; guard < 1e6; guard += 1) {
113
+ used.add(edgeKey(a, b));
114
+ loop.push(a);
115
+ if (b === start) {
116
+ closed = true;
117
+ break;
118
+ }
119
+ const candidates = (out.get(b) ?? []).filter((c) => !used.has(edgeKey(b, c)));
120
+ if (candidates.length === 0)
121
+ break;
122
+ let pick = candidates[0];
123
+ if (candidates.length > 1) {
124
+ // At a pinch, turn as far to the right as possible so the interior stays one piece.
125
+ const inX = points[b][0] - points[a][0];
126
+ const inZ = points[b][1] - points[a][1];
127
+ let best = Infinity;
128
+ for (const c of candidates) {
129
+ const ox = points[c][0] - points[b][0];
130
+ const oz = points[c][1] - points[b][1];
131
+ const turn = Math.atan2(inX * oz - inZ * ox, inX * ox + inZ * oz);
132
+ if (turn < best) {
133
+ best = turn;
134
+ pick = c;
135
+ }
136
+ }
137
+ }
138
+ a = b;
139
+ b = pick;
140
+ }
141
+ if (!closed || loop.length < 3)
142
+ continue;
143
+ // A loop that touches itself at a vertex is several simple loops sharing that vertex: split it there.
144
+ for (const piece of splitAtPinches(loop)) {
145
+ if (piece.length < 3)
146
+ continue;
147
+ const ring = piece.map((id) => points[id]);
148
+ // Interior on the left: CCW from above is an outer ring; the opposite winding is a hole.
149
+ const signed = -ring.reduce((s, p, i) => s + (p[0] * ring[(i + 1) % ring.length][1] - ring[(i + 1) % ring.length][0] * p[1]), 0) / 2;
150
+ (signed > 0 ? outers : holes).push(ring);
151
+ }
152
+ }
153
+ }
154
+ return (0, poly_1.assignHoles)(outers, holes);
155
+ }
156
+ /**
157
+ * The outline of a triangle set by rasterising it, for records whose triangles overlap or double back so that the exact
158
+ * boundary is not a simple polygon. The outline is within one cell (0.25 m, coarser only for areas over 400 m across).
159
+ */
160
+ function rasterPolygons(positions, vertexIds) {
161
+ let minX = Infinity;
162
+ let minZ = Infinity;
163
+ let maxX = -Infinity;
164
+ let maxZ = -Infinity;
165
+ for (const v of vertexIds) {
166
+ const x = positions[v * areas_1.AREA_POSITION_STRIDE];
167
+ const z = positions[v * areas_1.AREA_POSITION_STRIDE + 2];
168
+ if (x < minX)
169
+ minX = x;
170
+ if (x > maxX)
171
+ maxX = x;
172
+ if (z < minZ)
173
+ minZ = z;
174
+ if (z > maxZ)
175
+ maxZ = z;
176
+ }
177
+ if (!(maxX > minX) || !(maxZ > minZ))
178
+ return { polygons: [], orphanHoles: 0 };
179
+ const cell = Math.max(0.25, Math.max(maxX - minX, maxZ - minZ) / 1500);
180
+ const originX = minX - cell;
181
+ const originZ = minZ - cell;
182
+ const width = Math.ceil((maxX - originX) / cell) + 2;
183
+ const height = Math.ceil((maxZ - originZ) / cell) + 2;
184
+ const mask = new Uint8Array(width * height);
185
+ for (let t = 0; t + 2 < vertexIds.length; t += 3) {
186
+ const ax = positions[vertexIds[t] * areas_1.AREA_POSITION_STRIDE];
187
+ const az = positions[vertexIds[t] * areas_1.AREA_POSITION_STRIDE + 2];
188
+ const bx = positions[vertexIds[t + 1] * areas_1.AREA_POSITION_STRIDE];
189
+ const bz = positions[vertexIds[t + 1] * areas_1.AREA_POSITION_STRIDE + 2];
190
+ const cx = positions[vertexIds[t + 2] * areas_1.AREA_POSITION_STRIDE];
191
+ const cz = positions[vertexIds[t + 2] * areas_1.AREA_POSITION_STRIDE + 2];
192
+ const denom = (bz - cz) * (ax - cx) + (cx - bx) * (az - cz);
193
+ if (Math.abs(denom) < 1e-12)
194
+ continue;
195
+ const i0 = Math.max(0, Math.floor((Math.min(ax, bx, cx) - originX) / cell));
196
+ const i1 = Math.min(width - 1, Math.floor((Math.max(ax, bx, cx) - originX) / cell));
197
+ const j0 = Math.max(0, Math.floor((Math.min(az, bz, cz) - originZ) / cell));
198
+ const j1 = Math.min(height - 1, Math.floor((Math.max(az, bz, cz) - originZ) / cell));
199
+ for (let j = j0; j <= j1; j += 1) {
200
+ const pz = originZ + (j + 0.5) * cell;
201
+ for (let i = i0; i <= i1; i += 1) {
202
+ const px = originX + (i + 0.5) * cell;
203
+ const u = ((bz - cz) * (px - cx) + (cx - bx) * (pz - cz)) / denom;
204
+ const v = ((cz - az) * (px - cx) + (ax - cx) * (pz - cz)) / denom;
205
+ if (u >= -1e-9 && v >= -1e-9 && u + v <= 1 + 1e-9)
206
+ mask[j * width + i] = 1;
207
+ }
208
+ }
209
+ }
210
+ const traced = (0, poly_1.traceMask)(mask, width, height);
211
+ const toMetres = (loop) => loop.map((p) => [originX + p[0] * cell, originZ + p[1] * cell]);
212
+ return (0, poly_1.assignHoles)(traced.outers.map(toMetres), traced.holes.map(toMetres));
213
+ }
214
+ async function importAreas(bundle, frame, refusals) {
215
+ const source = await (0, areas_1.readCs2Areas)(bundle);
216
+ const areas = [];
217
+ const stats = { records: source.count, rows: 0, kinds: {}, withHoles: 0, totalKm2: 0 };
218
+ for (let index = 0; index < source.count; index += 1) {
219
+ const record = (0, areas_1.areaRecord)(source, index);
220
+ const id = `cs2:a${record.entityId}`;
221
+ const verdict = (0, tables_1.classifyAreaPrefab)(record.prefabName);
222
+ if (!verdict.ok) {
223
+ refusals.add('areas', verdict.reason, id);
224
+ continue;
225
+ }
226
+ const ids = source.indices.subarray(record.firstIndex, record.firstIndex + record.triangleCount * 3);
227
+ let { polygons, orphanHoles } = trianglesToPolygons(source.positions, ids);
228
+ if (polygons.some((polygon) => cleanPolygon(polygon) === null)) {
229
+ // The exact boundary is not a simple polygon (overlapping triangles): take the rasterised outline instead.
230
+ const raster = rasterPolygons(source.positions, ids);
231
+ if (raster.polygons.length > 0) {
232
+ polygons = raster.polygons;
233
+ orphanHoles = raster.orphanHoles;
234
+ refusals.degrade('areas', 'outline-rasterised-overlapping-triangles', id);
235
+ }
236
+ }
237
+ if (orphanHoles > 0)
238
+ refusals.degrade('areas', 'hole-without-outer-ring', id, orphanHoles);
239
+ if (polygons.length === 0) {
240
+ refusals.add('areas', 'no-outline', id);
241
+ continue;
242
+ }
243
+ let part = 0;
244
+ for (const polygon of polygons) {
245
+ const cleaned = cleanPolygon(polygon);
246
+ if (!cleaned) {
247
+ refusals.add('areas', 'degenerate-or-self-touching-outline', id);
248
+ continue;
249
+ }
250
+ for (const repair of cleaned.repairs)
251
+ refusals.degrade('areas', repair === 'hole-shrunk' ? 'hole-touched-outline-shrunk' : 'hole-touched-outline-dropped', id);
252
+ const [[minX, minZ], [maxX, maxZ]] = frame.bounds;
253
+ const apron = source_1.CITY_SOURCE_APRON_M;
254
+ const all = [cleaned.ring, ...cleaned.holes];
255
+ if (all.some((r) => r.some(([x, z]) => x < minX - apron || x > maxX + apron || z < minZ - apron || z > maxZ + apron))) {
256
+ refusals.add('areas', 'beyond-apron', id);
257
+ continue;
258
+ }
259
+ const area = -cleaned.ring.reduce((s, p, i) => s + (p[0] * cleaned.ring[(i + 1) % cleaned.ring.length][1] - cleaned.ring[(i + 1) % cleaned.ring.length][0] * p[1]), 0) / 2;
260
+ if (area < MIN_AREA_M2) {
261
+ refusals.add('areas', 'smaller-than-half-a-square-metre', id);
262
+ continue;
263
+ }
264
+ const row = {
265
+ id: part === 0 ? id : `${id}~${part}`,
266
+ kind: verdict.kind,
267
+ ring: cleaned.ring,
268
+ src: { cs2Entity: record.entityId, cs2Prefab: record.prefabName, cs2Material: record.materialName },
269
+ };
270
+ if (cleaned.holes.length > 0) {
271
+ row.holes = cleaned.holes;
272
+ stats.withHoles += 1;
273
+ }
274
+ areas.push(row);
275
+ part += 1;
276
+ stats.kinds[verdict.kind] = (stats.kinds[verdict.kind] ?? 0) + 1;
277
+ stats.totalKm2 += area / 1e6;
278
+ }
279
+ }
280
+ stats.rows = areas.length;
281
+ stats.totalKm2 = Number(stats.totalKm2.toFixed(3));
282
+ return { areas, stats };
283
+ }
284
+ const round = (ring) => ring.map((p) => [(0, source_1.roundMm)(p[0]), (0, source_1.roundMm)(p[1])]);
285
+ /** Pull a ring towards its centroid; a hole that grazes its outer ring clears it after a small shrink. */
286
+ function shrink(ring, factor) {
287
+ let cx = 0;
288
+ let cz = 0;
289
+ for (const p of ring) {
290
+ cx += p[0];
291
+ cz += p[1];
292
+ }
293
+ cx /= ring.length;
294
+ cz /= ring.length;
295
+ return ring.map((p) => [(0, source_1.roundMm)(cx + (p[0] - cx) * factor), (0, source_1.roundMm)(cz + (p[1] - cz) * factor)]);
296
+ }
297
+ /**
298
+ * Simplify and round a polygon; null when what is left is not a clean simple polygon. A hole that touches its own
299
+ * outer ring (a park with a pond cut to its edge) cannot be a valid hole, so it is shrunk until it clears, or dropped.
300
+ */
301
+ function cleanPolygon(polygon) {
302
+ let outerOnly = null;
303
+ let tracedHoles = [];
304
+ for (const tolerance of [SIMPLIFY_M, SIMPLIFY_M / 3, 0]) {
305
+ const ring = (0, poly_1.cleanRing)(round((0, poly_1.cleanRing)((0, poly_1.simplifyClosed)(polygon.ring, tolerance))));
306
+ const holes = polygon.holes.map((h) => (0, poly_1.cleanRing)(round((0, poly_1.cleanRing)((0, poly_1.simplifyClosed)(h, tolerance))))).filter((h) => h.length >= 3);
307
+ if (ring.length < 3)
308
+ continue;
309
+ if ((0, poly_1.polygonIsClean)({ ring, holes }))
310
+ return { ring, holes, repairs: [] };
311
+ if (outerOnly === null && (0, poly_1.polygonIsClean)({ ring, holes: [] })) {
312
+ outerOnly = ring;
313
+ tracedHoles = holes;
314
+ }
315
+ }
316
+ if (outerOnly === null)
317
+ return null;
318
+ const kept = [];
319
+ const repairs = [];
320
+ for (const hole of tracedHoles) {
321
+ let placed = null;
322
+ let how = 'hole-shrunk';
323
+ if ((0, poly_1.polygonIsClean)({ ring: outerOnly, holes: [...kept, hole] })) {
324
+ kept.push(hole);
325
+ continue;
326
+ }
327
+ for (const factor of [0.99, 0.97, 0.94, 0.9, 0.8]) {
328
+ const candidate = shrink(hole, factor);
329
+ if ((0, poly_1.polygonIsClean)({ ring: outerOnly, holes: [...kept, candidate] })) {
330
+ placed = candidate;
331
+ break;
332
+ }
333
+ }
334
+ if (placed)
335
+ kept.push(placed);
336
+ else
337
+ how = 'hole-dropped';
338
+ repairs.push(how);
339
+ }
340
+ return { ring: outerOnly, holes: kept, repairs };
341
+ }
342
+ exports.AREA_STRIDES = { record: areas_1.AREA_RECORD_STRIDE, position: areas_1.AREA_POSITION_STRIDE };
343
+ //# sourceMappingURL=areas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"areas.js","sourceRoot":"","sources":["../../../../src/city/import/cs2/areas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type CityBuilding } from '../../source';
2
+ import type { Frame } from './frame';
3
+ import type { RefusalLog } from './refusals';
4
+ export interface BuildingStats {
5
+ placements: number;
6
+ rows: number;
7
+ withMesh: number;
8
+ withoutMesh: number;
9
+ prefabs: number;
10
+ prefabsWithMesh: number;
11
+ footprintMethods: Record<string, number>;
12
+ withParts: number;
13
+ withHoles: number;
14
+ underSixSquareMetres: number;
15
+ tilted: number;
16
+ region: Record<string, number>;
17
+ uses: Record<string, number>;
18
+ /** Placements whose prefab has no entry in the buildings category but one in another. */
19
+ meshFromOtherCategory: number;
20
+ heightRangeM: [number, number];
21
+ }
22
+ /** The yaw about +Y (three.js `rotation.y`) of a quaternion, and how far the rotation leans off vertical. */
23
+ export declare function quaternionYaw(qx: number, qy: number, qz: number, qw: number): {
24
+ yawRad: number;
25
+ upCos: number;
26
+ };
27
+ export declare function yawDegrees(yawRad: number): number;
28
+ export declare function importBuildings(bundle: string, frame: Frame, refusals: RefusalLog): Promise<{
29
+ rows: CityBuilding[];
30
+ stats: BuildingStats;
31
+ }>;