@dzbot/dzstudio-mcp 0.0.0-stage → 0.1.0
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/LICENSE +661 -0
- package/README.md +162 -2
- package/dist/config/config.js +172 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/sessions.js +67 -0
- package/dist/config/sessions.js.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/agent.js +1148 -0
- package/dist/mcp/agent.js.map +1 -0
- package/dist/mcp/server.js +263 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/protocol/client.js +134 -0
- package/dist/protocol/client.js.map +1 -0
- package/dist/protocol/session.js +837 -0
- package/dist/protocol/session.js.map +1 -0
- package/dist/protocol/transport.js +66 -0
- package/dist/protocol/transport.js.map +1 -0
- package/dist/scene/chunks.js +30 -0
- package/dist/scene/chunks.js.map +1 -0
- package/dist/scene/edits.js +183 -0
- package/dist/scene/edits.js.map +1 -0
- package/dist/scene/float32.js +167 -0
- package/dist/scene/float32.js.map +1 -0
- package/dist/scene/ids.js +43 -0
- package/dist/scene/ids.js.map +1 -0
- package/dist/scene/index.js +9 -0
- package/dist/scene/index.js.map +1 -0
- package/dist/scene/json.js +294 -0
- package/dist/scene/json.js.map +1 -0
- package/dist/scene/projectload.js +652 -0
- package/dist/scene/projectload.js.map +1 -0
- package/dist/scene/scene.js +506 -0
- package/dist/scene/scene.js.map +1 -0
- package/dist/scene/srcjson.js +297 -0
- package/dist/scene/srcjson.js.map +1 -0
- package/dist/scene/textform.js +257 -0
- package/dist/scene/textform.js.map +1 -0
- package/dist/scene/types.js +35 -0
- package/dist/scene/types.js.map +1 -0
- package/dist/world/data.js +604 -0
- package/dist/world/data.js.map +1 -0
- package/dist/world/format.js +205 -0
- package/dist/world/format.js.map +1 -0
- package/dist/world/source.js +267 -0
- package/dist/world/source.js.map +1 -0
- package/dist/world/tools.js +530 -0
- package/dist/world/tools.js.map +1 -0
- package/package.json +48 -4
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
import { gunzipSync } from 'node:zlib';
|
|
2
|
+
import { decodeRaster, decodeTile, modelId, NO_HIT, POINTS, TILE } from './format.js';
|
|
3
|
+
import { DataCorrupt } from './source.js';
|
|
4
|
+
const DEG = 180 / Math.PI;
|
|
5
|
+
export class ClassIndex {
|
|
6
|
+
source;
|
|
7
|
+
index;
|
|
8
|
+
byLower = new Map();
|
|
9
|
+
byLoose = new Map();
|
|
10
|
+
entries = new Map();
|
|
11
|
+
rasters = new Map();
|
|
12
|
+
asciiLower;
|
|
13
|
+
constructor(source, index) {
|
|
14
|
+
this.source = source;
|
|
15
|
+
this.index = index;
|
|
16
|
+
for (const name of Object.keys(index.classes)) {
|
|
17
|
+
this.byLower.set(name.toLowerCase(), name);
|
|
18
|
+
const loose = name.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
19
|
+
if (!this.byLoose.has(loose))
|
|
20
|
+
this.byLoose.set(loose, name);
|
|
21
|
+
}
|
|
22
|
+
for (const [id, s] of Object.entries(index.shapes))
|
|
23
|
+
this.entries.set(id, { id, ...s });
|
|
24
|
+
}
|
|
25
|
+
get revision() {
|
|
26
|
+
return this.index.revision;
|
|
27
|
+
}
|
|
28
|
+
static async load(source, revision) {
|
|
29
|
+
return new ClassIndex(source, await source.json(`classes/${revision}/index.json`));
|
|
30
|
+
}
|
|
31
|
+
/** A class by name: exact, then ignoring case, then ignoring case and everything but letters and digits. */
|
|
32
|
+
find(query) {
|
|
33
|
+
const q = String(query);
|
|
34
|
+
const name = this.index.classes[q]
|
|
35
|
+
? q
|
|
36
|
+
: (this.byLower.get(q.toLowerCase()) ?? this.byLoose.get(q.toLowerCase().replace(/[^a-z0-9]/g, '')));
|
|
37
|
+
if (!name)
|
|
38
|
+
return null;
|
|
39
|
+
const c = this.index.classes[name];
|
|
40
|
+
const e = this.entries.get(c.shape);
|
|
41
|
+
if (!e)
|
|
42
|
+
return null;
|
|
43
|
+
return { name, flags: c.flags, ...e };
|
|
44
|
+
}
|
|
45
|
+
/** Whether the game knows a class: its name ignoring the case of ASCII letters, as the editor looks it up. */
|
|
46
|
+
knows(name) {
|
|
47
|
+
const lower = (t) => t.replace(/[A-Z]/g, (c) => c.toLowerCase());
|
|
48
|
+
this.asciiLower ??= new Set(Object.keys(this.index.classes).map(lower));
|
|
49
|
+
return this.asciiLower.has(lower(name));
|
|
50
|
+
}
|
|
51
|
+
/** A model by its path, or by its model id. */
|
|
52
|
+
shape(modelPathOrId) {
|
|
53
|
+
return this.entries.get(modelPathOrId) ?? this.entries.get(modelId(modelPathOrId)) ?? null;
|
|
54
|
+
}
|
|
55
|
+
/** Box of an object: via the model path first, then via the class name ignoring case. null = box unknown. */
|
|
56
|
+
boxFor(cls, modelPath) {
|
|
57
|
+
const s = modelPath ? this.entries.get(modelId(modelPath)) : undefined;
|
|
58
|
+
if (s && s.clip)
|
|
59
|
+
return s;
|
|
60
|
+
const name = cls ? this.byLower.get(cls.toLowerCase()) : undefined;
|
|
61
|
+
const cs = name ? this.entries.get(this.index.classes[name].shape) : undefined;
|
|
62
|
+
return cs && cs.clip ? cs : null;
|
|
63
|
+
}
|
|
64
|
+
raster(id) {
|
|
65
|
+
let p = this.rasters.get(id);
|
|
66
|
+
if (!p) {
|
|
67
|
+
const s = this.entries.get(id);
|
|
68
|
+
p = !s?.raster
|
|
69
|
+
? Promise.resolve(null)
|
|
70
|
+
: this.source
|
|
71
|
+
.verified(`classes/${this.revision}/shapes/${id}.bin.gz`, s.raster.bytes, s.raster.sha256)
|
|
72
|
+
.then((gz) => decodeRaster(gunzipSync(gz)));
|
|
73
|
+
p.catch(() => this.rasters.delete(id));
|
|
74
|
+
this.rasters.set(id, p);
|
|
75
|
+
}
|
|
76
|
+
return p;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export class WorldData {
|
|
80
|
+
source;
|
|
81
|
+
manifest;
|
|
82
|
+
classes;
|
|
83
|
+
cols;
|
|
84
|
+
rows;
|
|
85
|
+
cache = new Map();
|
|
86
|
+
constructor(source, manifest, classes) {
|
|
87
|
+
this.source = source;
|
|
88
|
+
this.manifest = manifest;
|
|
89
|
+
this.classes = classes;
|
|
90
|
+
this.cols = manifest.tile.cols;
|
|
91
|
+
this.rows = manifest.tile.rows;
|
|
92
|
+
}
|
|
93
|
+
get world() {
|
|
94
|
+
return this.manifest.world;
|
|
95
|
+
}
|
|
96
|
+
get revision() {
|
|
97
|
+
return this.manifest.revision;
|
|
98
|
+
}
|
|
99
|
+
static async load(source, world, revision, classes) {
|
|
100
|
+
const manifest = await source.json(`worlds/${world}/${revision}/manifest.json`);
|
|
101
|
+
return new WorldData(source, manifest, classes);
|
|
102
|
+
}
|
|
103
|
+
entry(tx, tz) {
|
|
104
|
+
return this.manifest.tiles[tz * this.cols + tx];
|
|
105
|
+
}
|
|
106
|
+
tile(tx, tz) {
|
|
107
|
+
const k = tz * this.cols + tx;
|
|
108
|
+
let p = this.cache.get(k);
|
|
109
|
+
if (p) {
|
|
110
|
+
this.cache.delete(k);
|
|
111
|
+
this.cache.set(k, p);
|
|
112
|
+
return p;
|
|
113
|
+
}
|
|
114
|
+
if (this.cache.size >= 64)
|
|
115
|
+
this.cache.delete(this.cache.keys().next().value);
|
|
116
|
+
const e = this.entry(tx, tz);
|
|
117
|
+
p = this.source
|
|
118
|
+
.verified(`worlds/${this.world}/${this.revision}/tiles/${tx}_${tz}.bin.gz`, e.bytes, e.sha256)
|
|
119
|
+
.then((gz) => decodeTile(gunzipSync(gz)));
|
|
120
|
+
p.catch(() => this.cache.delete(k));
|
|
121
|
+
this.cache.set(k, p);
|
|
122
|
+
return p;
|
|
123
|
+
}
|
|
124
|
+
locate(x, z) {
|
|
125
|
+
const tx = Math.min(Math.max(Math.floor(x / TILE), 0), this.cols - 1);
|
|
126
|
+
const tz = Math.min(Math.max(Math.floor(z / TILE), 0), this.rows - 1);
|
|
127
|
+
return { tx, tz, c: x - tx * TILE, r: z - tz * TILE };
|
|
128
|
+
}
|
|
129
|
+
/** Terrain height (m), bilinear from the four surrounding grid points. */
|
|
130
|
+
async heightAt(x, z) {
|
|
131
|
+
const { tx, tz, c, r } = this.locate(x, z);
|
|
132
|
+
const t = await this.tile(tx, tz);
|
|
133
|
+
const c0 = Math.min(Math.max(Math.floor(c), 0), TILE - 1);
|
|
134
|
+
const r0 = Math.min(Math.max(Math.floor(r), 0), TILE - 1);
|
|
135
|
+
const fc = Math.min(Math.max(c - c0, 0), 1);
|
|
136
|
+
const fr = Math.min(Math.max(r - r0, 0), 1);
|
|
137
|
+
const h = (cc, rr) => t.heights[rr * POINTS + cc];
|
|
138
|
+
const v = h(c0, r0) * (1 - fc) * (1 - fr) + h(c0 + 1, r0) * fc * (1 - fr) + h(c0, r0 + 1) * (1 - fc) * fr + h(c0 + 1, r0 + 1) * fc * fr;
|
|
139
|
+
return v / 100;
|
|
140
|
+
}
|
|
141
|
+
/** Material, water and walkable surface of the nearest grid point. */
|
|
142
|
+
async surfaceAt(x, z) {
|
|
143
|
+
const { tx, tz, c, r } = this.locate(x, z);
|
|
144
|
+
const t = await this.tile(tx, tz);
|
|
145
|
+
const cc = Math.min(Math.max(Math.round(c), 0), TILE);
|
|
146
|
+
const rr = Math.min(Math.max(Math.round(r), 0), TILE);
|
|
147
|
+
const k = rr * POINTS + cc;
|
|
148
|
+
const mat = this.manifest.materials[t.matl[k]];
|
|
149
|
+
const out = { material: mat.name, water: mat.water, terrain: t.heights[k] / 100, roadway: null };
|
|
150
|
+
if (mat.water === 'sea')
|
|
151
|
+
out.seaLevel = this.manifest.sea;
|
|
152
|
+
const i = binarySearch(t.road.k, k);
|
|
153
|
+
if (i >= 0) {
|
|
154
|
+
out.roadway = {
|
|
155
|
+
model: this.manifest.roadwayShapes[t.road.shape[i]],
|
|
156
|
+
height: (t.heights[k] + t.road.dh[i]) / 100,
|
|
157
|
+
aboveTerrain: t.road.dh[i] / 100,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return out;
|
|
161
|
+
}
|
|
162
|
+
async groundAt(x, z) {
|
|
163
|
+
return { height: await this.heightAt(x, z), ...(await this.surfaceAt(x, z)) };
|
|
164
|
+
}
|
|
165
|
+
/** Tiles whose objects can reach into the area: those touching it, plus neighbours whose `reach` extends into it. */
|
|
166
|
+
tilesFor(area) {
|
|
167
|
+
return this.manifest.tiles.filter((e) => {
|
|
168
|
+
if (area.circle) {
|
|
169
|
+
const { x, z, radius } = area.circle;
|
|
170
|
+
const dx = Math.max(e.x * TILE - x, 0, x - (e.x + 1) * TILE);
|
|
171
|
+
const dz = Math.max(e.z * TILE - z, 0, z - (e.z + 1) * TILE);
|
|
172
|
+
return Math.hypot(dx, dz) <= radius + e.reach;
|
|
173
|
+
}
|
|
174
|
+
const r = area.rect;
|
|
175
|
+
return ((e.x + 1) * TILE + e.reach >= r.minX &&
|
|
176
|
+
e.x * TILE - e.reach <= r.maxX &&
|
|
177
|
+
(e.z + 1) * TILE + e.reach >= r.minZ &&
|
|
178
|
+
e.z * TILE - e.reach <= r.maxZ);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Static objects whose clipping box (horizontally) touches the area; without a box, whose origin lies in it.
|
|
183
|
+
* Tiles that cannot be loaded are named in `missing`, never treated as empty.
|
|
184
|
+
*/
|
|
185
|
+
async objectsIn(area, filter = {}) {
|
|
186
|
+
const out = [];
|
|
187
|
+
const missing = [];
|
|
188
|
+
const want = filter.class?.toLowerCase();
|
|
189
|
+
for (const e of this.tilesFor(area)) {
|
|
190
|
+
if (!e.objects)
|
|
191
|
+
continue;
|
|
192
|
+
let t;
|
|
193
|
+
try {
|
|
194
|
+
t = await this.tile(e.x, e.z);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
missing.push(missingName(`${e.x}_${e.z}`, err));
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
for (const o of this.objectsOf(t)) {
|
|
201
|
+
if (want !== undefined && o.class.toLowerCase() !== want)
|
|
202
|
+
continue;
|
|
203
|
+
if (filter.flags && !(o.flags & filter.flags))
|
|
204
|
+
continue;
|
|
205
|
+
const d = distanceToArea(o, area);
|
|
206
|
+
if (d !== null)
|
|
207
|
+
out.push({ ...o, distance: d });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
out.sort((a, b) => a.distance - b.distance);
|
|
211
|
+
return { objects: out, missing };
|
|
212
|
+
}
|
|
213
|
+
objectsOf(t) {
|
|
214
|
+
if (t.list)
|
|
215
|
+
return t.list;
|
|
216
|
+
const o = t.objs;
|
|
217
|
+
const list = [];
|
|
218
|
+
for (let i = 0; i < o.n; i++) {
|
|
219
|
+
const [cls, shape, flags] = this.manifest.objects[o.tab[i]];
|
|
220
|
+
const rows = Array.from(o.m.subarray(i * 9, i * 9 + 9));
|
|
221
|
+
const x = (t.tx * TILE * 100 + o.x[i]) / 100;
|
|
222
|
+
const z = (t.tz * TILE * 100 + o.z[i]) / 100;
|
|
223
|
+
const y = o.y[i] / 100;
|
|
224
|
+
list.push({
|
|
225
|
+
id: `${this.world}/${this.revision}/${t.tx}_${t.tz}/${i}`,
|
|
226
|
+
source: 'map',
|
|
227
|
+
class: cls,
|
|
228
|
+
shape,
|
|
229
|
+
flags,
|
|
230
|
+
x,
|
|
231
|
+
y,
|
|
232
|
+
z,
|
|
233
|
+
rows,
|
|
234
|
+
...angles(rows),
|
|
235
|
+
box: this.classes.boxFor(cls, shape),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
t.list = list;
|
|
239
|
+
return list;
|
|
240
|
+
}
|
|
241
|
+
/** A static object by its id `<world>/<revision>/<tx>_<tz>/<n>`. */
|
|
242
|
+
async objectById(id) {
|
|
243
|
+
const m = /^([^/]+)\/([^/]+)\/(\d+)_(\d+)\/(\d+)$/.exec(id);
|
|
244
|
+
if (!m || m[1] !== this.world || m[2] !== this.revision)
|
|
245
|
+
return undefined;
|
|
246
|
+
const tx = Number(m[3]);
|
|
247
|
+
const tz = Number(m[4]);
|
|
248
|
+
if (tx >= this.cols || tz >= this.rows)
|
|
249
|
+
return undefined;
|
|
250
|
+
return this.objectsOf(await this.tile(tx, tz))[Number(m[5])];
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Walkable surfaces of static objects at a point, from the `r` rasters (walkable surface seen from below) of the
|
|
254
|
+
* objects whose clipping box covers it. The model-space cell is found at the object's own height, so for strongly
|
|
255
|
+
* tilted objects it is an approximation.
|
|
256
|
+
*/
|
|
257
|
+
async rasterSurfaces(x, z) {
|
|
258
|
+
const { objects, missing } = await this.objectsIn({ circle: { x, z, radius: 0 } });
|
|
259
|
+
const surfaces = [];
|
|
260
|
+
for (const o of objects) {
|
|
261
|
+
if (!o.box?.raster)
|
|
262
|
+
continue;
|
|
263
|
+
let raster;
|
|
264
|
+
try {
|
|
265
|
+
raster = await this.classes.raster(o.box.id);
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
missing.push(missingName(`raster ${o.box.id}`, err));
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
const r = raster?.channels.r;
|
|
272
|
+
if (!raster || !r)
|
|
273
|
+
continue;
|
|
274
|
+
const local = toLocal(o, x, o.y, z);
|
|
275
|
+
if (!local)
|
|
276
|
+
continue;
|
|
277
|
+
const i = Math.round((local[0] * 1000 - raster.x0Mm) / raster.stepMm);
|
|
278
|
+
const j = Math.round((local[2] * 1000 - raster.z0Mm) / raster.stepMm);
|
|
279
|
+
if (i < 0 || j < 0 || i >= raster.nx || j >= raster.nz)
|
|
280
|
+
continue;
|
|
281
|
+
const v = r[j * raster.nx + i];
|
|
282
|
+
if (v === NO_HIT)
|
|
283
|
+
continue;
|
|
284
|
+
surfaces.push({ height: toWorld(o, local[0], v / 100, local[2])[1], model: o.shape, object: o.id });
|
|
285
|
+
}
|
|
286
|
+
surfaces.sort((a, b) => b.height - a.height);
|
|
287
|
+
return { surfaces, missing };
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/** A tile (`tx_tz`) or raster that could not be used; marked when its data were corrupt rather than unreachable. */
|
|
291
|
+
export function missingName(name, err) {
|
|
292
|
+
return err instanceof DataCorrupt ? `${name} corrupt` : name;
|
|
293
|
+
}
|
|
294
|
+
function binarySearch(arr, v) {
|
|
295
|
+
let lo = 0;
|
|
296
|
+
let hi = arr.length - 1;
|
|
297
|
+
while (lo <= hi) {
|
|
298
|
+
const mid = (lo + hi) >> 1;
|
|
299
|
+
if (arr[mid] === v)
|
|
300
|
+
return mid;
|
|
301
|
+
if (arr[mid] < v)
|
|
302
|
+
lo = mid + 1;
|
|
303
|
+
else
|
|
304
|
+
hi = mid - 1;
|
|
305
|
+
}
|
|
306
|
+
return -1;
|
|
307
|
+
}
|
|
308
|
+
const footprints = new WeakMap();
|
|
309
|
+
function footprintOf(o, clip) {
|
|
310
|
+
let p = footprints.get(o);
|
|
311
|
+
if (!p) {
|
|
312
|
+
p = footprint(clip, o);
|
|
313
|
+
footprints.set(o, p);
|
|
314
|
+
}
|
|
315
|
+
return p;
|
|
316
|
+
}
|
|
317
|
+
/** Distance of an object to an area (0 inside), or null if it does not touch it. */
|
|
318
|
+
export function distanceToArea(o, area) {
|
|
319
|
+
if (area.circle) {
|
|
320
|
+
const { x, z, radius } = area.circle;
|
|
321
|
+
const d = o.box?.clip ? distanceToPolygon(x, z, footprintOf(o, o.box.clip)) : Math.hypot(o.x - x, o.z - z);
|
|
322
|
+
return d <= radius ? d : null;
|
|
323
|
+
}
|
|
324
|
+
const r = area.rect;
|
|
325
|
+
const cx = (r.minX + r.maxX) / 2;
|
|
326
|
+
const cz = (r.minZ + r.maxZ) / 2;
|
|
327
|
+
if (o.box?.clip) {
|
|
328
|
+
const poly = footprintOf(o, o.box.clip);
|
|
329
|
+
if (!polygonTouchesRect(poly, r))
|
|
330
|
+
return null;
|
|
331
|
+
return distanceToPolygon(cx, cz, poly);
|
|
332
|
+
}
|
|
333
|
+
if (o.x < r.minX || o.x > r.maxX || o.z < r.minZ || o.z > r.maxZ)
|
|
334
|
+
return null;
|
|
335
|
+
return Math.hypot(o.x - cx, o.z - cz);
|
|
336
|
+
}
|
|
337
|
+
/** Separating axes in 2D between a convex polygon and an axis-aligned rectangle; touching counts. */
|
|
338
|
+
function polygonTouchesRect(poly, r) {
|
|
339
|
+
const rect = [
|
|
340
|
+
[r.minX, r.minZ],
|
|
341
|
+
[r.maxX, r.minZ],
|
|
342
|
+
[r.maxX, r.maxZ],
|
|
343
|
+
[r.minX, r.maxZ],
|
|
344
|
+
];
|
|
345
|
+
const axes = [
|
|
346
|
+
[1, 0],
|
|
347
|
+
[0, 1],
|
|
348
|
+
];
|
|
349
|
+
for (let i = 0; i < poly.length; i++) {
|
|
350
|
+
const a = poly[i];
|
|
351
|
+
const b = poly[(i + 1) % poly.length];
|
|
352
|
+
axes.push([-(b[1] - a[1]), b[0] - a[0]]);
|
|
353
|
+
}
|
|
354
|
+
for (const [ax, az] of axes) {
|
|
355
|
+
if (!ax && !az)
|
|
356
|
+
continue;
|
|
357
|
+
const proj = (pts) => pts.map((p) => p[0] * ax + p[1] * az);
|
|
358
|
+
const pa = proj(poly);
|
|
359
|
+
const pb = proj(rect);
|
|
360
|
+
if (Math.max(...pa) < Math.min(...pb) || Math.max(...pb) < Math.min(...pa))
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* yaw/pitch/roll/scale as the export reports them. The engine's pitch is asin of the forward row's Y *with* the scale
|
|
367
|
+
* in it; its scale is the RMS length of the three rows (some walls and rocks are slightly non-uniform).
|
|
368
|
+
*/
|
|
369
|
+
export function angles(rows) {
|
|
370
|
+
const [ax, ay, az, ux, uy, uz, dx, dy, dz] = rows.map((v) => v / 1e6);
|
|
371
|
+
return {
|
|
372
|
+
yaw: Math.atan2(dx, dz) * DEG,
|
|
373
|
+
pitch: Math.asin(Math.max(-1, Math.min(1, dy))) * DEG,
|
|
374
|
+
roll: Math.atan2(-ay, uy) * DEG,
|
|
375
|
+
scale: Math.sqrt((ax * ax + ay * ay + az * az + ux * ux + uy * uy + uz * uz + dx * dx + dy * dy + dz * dz) / 3),
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/** Rows (×10⁶, scale included) from yaw/pitch/roll/scale; the inverse of `angles` for |scale · sin(pitch)| ≤ 1. */
|
|
379
|
+
export function rowsFrom(yaw, pitch, roll, scale = 1) {
|
|
380
|
+
const y = yaw / DEG;
|
|
381
|
+
const r = roll / DEG;
|
|
382
|
+
const sp = Math.sin(pitch / DEG) / scale;
|
|
383
|
+
const p = Math.asin(Math.max(-1, Math.min(1, sp)));
|
|
384
|
+
const cy = Math.cos(y);
|
|
385
|
+
const sy = Math.sin(y);
|
|
386
|
+
const cp = Math.cos(p);
|
|
387
|
+
const spp = Math.sin(p);
|
|
388
|
+
const cr = Math.cos(r);
|
|
389
|
+
const sr = Math.sin(r);
|
|
390
|
+
const aside = [cy * cr + sy * spp * sr, -cp * sr, -sy * cr + cy * spp * sr];
|
|
391
|
+
const up = [cy * sr - sy * spp * cr, cp * cr, -sy * sr - cy * spp * cr];
|
|
392
|
+
const dir = [sy * cp, spp, cy * cp];
|
|
393
|
+
return [...aside, ...up, ...dir].map((v) => Math.round(v * scale * 1e6));
|
|
394
|
+
}
|
|
395
|
+
export function toWorld(o, lx, ly, lz) {
|
|
396
|
+
const m = o.rows;
|
|
397
|
+
return [
|
|
398
|
+
o.x + (m[0] * lx + m[3] * ly + m[6] * lz) / 1e6,
|
|
399
|
+
o.y + (m[1] * lx + m[4] * ly + m[7] * lz) / 1e6,
|
|
400
|
+
o.z + (m[2] * lx + m[5] * ly + m[8] * lz) / 1e6,
|
|
401
|
+
];
|
|
402
|
+
}
|
|
403
|
+
/** Model-space coordinates of a world point, or null for a degenerate transformation. */
|
|
404
|
+
export function toLocal(o, x, y, z) {
|
|
405
|
+
const m = o.rows.map((v) => v / 1e6);
|
|
406
|
+
const [a, b, c] = [m[0], m[3], m[6]];
|
|
407
|
+
const [d, e, f] = [m[1], m[4], m[7]];
|
|
408
|
+
const [g, h, i] = [m[2], m[5], m[8]];
|
|
409
|
+
const det = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);
|
|
410
|
+
if (Math.abs(det) < 1e-12)
|
|
411
|
+
return null;
|
|
412
|
+
const px = x - o.x;
|
|
413
|
+
const py = y - o.y;
|
|
414
|
+
const pz = z - o.z;
|
|
415
|
+
return [
|
|
416
|
+
((e * i - f * h) * px - (b * i - c * h) * py + (b * f - c * e) * pz) / det,
|
|
417
|
+
(-(d * i - f * g) * px + (a * i - c * g) * py - (a * f - c * d) * pz) / det,
|
|
418
|
+
((d * h - e * g) * px - (a * h - b * g) * py + (a * e - b * d) * pz) / det,
|
|
419
|
+
];
|
|
420
|
+
}
|
|
421
|
+
export function corners(box, o) {
|
|
422
|
+
const out = [];
|
|
423
|
+
for (const lx of [box[0], box[3]])
|
|
424
|
+
for (const ly of [box[1], box[4]])
|
|
425
|
+
for (const lz of [box[2], box[5]])
|
|
426
|
+
out.push(toWorld(o, lx, ly, lz));
|
|
427
|
+
return out;
|
|
428
|
+
}
|
|
429
|
+
/** Horizontal outline of a box: the convex hull of its eight corners on X/Z. */
|
|
430
|
+
export function footprint(box, o) {
|
|
431
|
+
const pts = corners(box, o)
|
|
432
|
+
.map(([px, , pz]) => [px, pz])
|
|
433
|
+
.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
434
|
+
const cross = (o1, a, b) => (a[0] - o1[0]) * (b[1] - o1[1]) - (a[1] - o1[1]) * (b[0] - o1[0]);
|
|
435
|
+
const lower = [];
|
|
436
|
+
const upper = [];
|
|
437
|
+
for (const p of pts) {
|
|
438
|
+
while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], p) <= 0)
|
|
439
|
+
lower.pop();
|
|
440
|
+
lower.push(p);
|
|
441
|
+
}
|
|
442
|
+
for (const p of pts.slice().reverse()) {
|
|
443
|
+
while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], p) <= 0)
|
|
444
|
+
upper.pop();
|
|
445
|
+
upper.push(p);
|
|
446
|
+
}
|
|
447
|
+
return lower.slice(0, -1).concat(upper.slice(0, -1));
|
|
448
|
+
}
|
|
449
|
+
export function distanceToPolygon(x, z, poly) {
|
|
450
|
+
if (poly.length === 1)
|
|
451
|
+
return Math.hypot(poly[0][0] - x, poly[0][1] - z);
|
|
452
|
+
let inside = poly.length >= 3;
|
|
453
|
+
let best = Infinity;
|
|
454
|
+
for (let i = 0; i < poly.length; i++) {
|
|
455
|
+
const a = poly[i];
|
|
456
|
+
const b = poly[(i + 1) % poly.length];
|
|
457
|
+
const ex = b[0] - a[0];
|
|
458
|
+
const ez = b[1] - a[1];
|
|
459
|
+
if (ex * (z - a[1]) - ez * (x - a[0]) < 0)
|
|
460
|
+
inside = false;
|
|
461
|
+
const len = ex * ex + ez * ez;
|
|
462
|
+
const t = len ? Math.max(0, Math.min(1, ((x - a[0]) * ex + (z - a[1]) * ez) / len)) : 0;
|
|
463
|
+
best = Math.min(best, Math.hypot(a[0] + t * ex - x, a[1] + t * ez - z));
|
|
464
|
+
}
|
|
465
|
+
return inside ? 0 : best;
|
|
466
|
+
}
|
|
467
|
+
/** Oriented box (collision box, otherwise clipping box) of an object, with its scale. */
|
|
468
|
+
export function orientedBox(entry, o) {
|
|
469
|
+
const b = entry.collision || entry.clip;
|
|
470
|
+
if (!b)
|
|
471
|
+
return null;
|
|
472
|
+
const m = o.rows.map((v) => v / 1e6);
|
|
473
|
+
const axes = [];
|
|
474
|
+
const half = [];
|
|
475
|
+
for (let k = 0; k < 3; k++) {
|
|
476
|
+
const v = [m[k * 3], m[k * 3 + 1], m[k * 3 + 2]];
|
|
477
|
+
const len = Math.hypot(...v);
|
|
478
|
+
axes.push(v.map((q) => q / len));
|
|
479
|
+
half.push(((b[k + 3] - b[k]) / 2) * len);
|
|
480
|
+
}
|
|
481
|
+
return { center: toWorld(o, (b[0] + b[3]) / 2, (b[1] + b[4]) / 2, (b[2] + b[5]) / 2), axes, half };
|
|
482
|
+
}
|
|
483
|
+
/** Separating-axis test: penetration depth along the axis where it is smallest, or null if they do not intersect. */
|
|
484
|
+
export function overlapDepth(A, B) {
|
|
485
|
+
const dot = (p, q) => p[0] * q[0] + p[1] * q[1] + p[2] * q[2];
|
|
486
|
+
const crossV = (p, q) => [
|
|
487
|
+
p[1] * q[2] - p[2] * q[1],
|
|
488
|
+
p[2] * q[0] - p[0] * q[2],
|
|
489
|
+
p[0] * q[1] - p[1] * q[0],
|
|
490
|
+
];
|
|
491
|
+
const d = [B.center[0] - A.center[0], B.center[1] - A.center[1], B.center[2] - A.center[2]];
|
|
492
|
+
const candidates = [...A.axes, ...B.axes];
|
|
493
|
+
for (const a of A.axes)
|
|
494
|
+
for (const b of B.axes)
|
|
495
|
+
candidates.push(crossV(a, b));
|
|
496
|
+
let depth = Infinity;
|
|
497
|
+
for (const L0 of candidates) {
|
|
498
|
+
const len = Math.hypot(...L0);
|
|
499
|
+
if (len < 1e-6)
|
|
500
|
+
continue;
|
|
501
|
+
const L = L0.map((v) => v / len);
|
|
502
|
+
const rA = A.half.reduce((s, h, i) => s + h * Math.abs(dot(A.axes[i], L)), 0);
|
|
503
|
+
const rB = B.half.reduce((s, h, i) => s + h * Math.abs(dot(B.axes[i], L)), 0);
|
|
504
|
+
const o = rA + rB - Math.abs(dot(d, L));
|
|
505
|
+
if (o <= 0)
|
|
506
|
+
return null;
|
|
507
|
+
depth = Math.min(depth, o);
|
|
508
|
+
}
|
|
509
|
+
return depth;
|
|
510
|
+
}
|
|
511
|
+
/** Whether the segment from p to q passes through the box (slab test in the box's frame). */
|
|
512
|
+
export function segmentInBox(p, q, box) {
|
|
513
|
+
let t0 = 0;
|
|
514
|
+
let t1 = 1;
|
|
515
|
+
for (let k = 0; k < 3; k++) {
|
|
516
|
+
const ax = box.axes[k];
|
|
517
|
+
const a = (p[0] - box.center[0]) * ax[0] + (p[1] - box.center[1]) * ax[1] + (p[2] - box.center[2]) * ax[2];
|
|
518
|
+
const d = (q[0] - p[0]) * ax[0] + (q[1] - p[1]) * ax[1] + (q[2] - p[2]) * ax[2];
|
|
519
|
+
const h = box.half[k];
|
|
520
|
+
if (Math.abs(d) < 1e-12) {
|
|
521
|
+
if (a < -h || a > h)
|
|
522
|
+
return false;
|
|
523
|
+
continue;
|
|
524
|
+
}
|
|
525
|
+
let lo = (-h - a) / d;
|
|
526
|
+
let hi = (h - a) / d;
|
|
527
|
+
if (lo > hi)
|
|
528
|
+
[lo, hi] = [hi, lo];
|
|
529
|
+
t0 = Math.max(t0, lo);
|
|
530
|
+
t1 = Math.min(t1, hi);
|
|
531
|
+
if (t0 > t1)
|
|
532
|
+
return false;
|
|
533
|
+
}
|
|
534
|
+
return true;
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Whether a cell of an object's collision raster (`g`), taken as a vertical column in model space from the bottom of
|
|
538
|
+
* its box up to the hit height, lies inside another box.
|
|
539
|
+
*/
|
|
540
|
+
export function rasterHitsBox(o, entry, raster, other) {
|
|
541
|
+
const g = raster.channels.g;
|
|
542
|
+
const b = entry.collision || entry.clip;
|
|
543
|
+
if (!g || !b)
|
|
544
|
+
return false;
|
|
545
|
+
const bottom = b[1];
|
|
546
|
+
for (let j = 0; j < raster.nz; j++) {
|
|
547
|
+
const lz = (raster.z0Mm + j * raster.stepMm) / 1000;
|
|
548
|
+
for (let i = 0; i < raster.nx; i++) {
|
|
549
|
+
const v = g[j * raster.nx + i];
|
|
550
|
+
if (v === NO_HIT)
|
|
551
|
+
continue;
|
|
552
|
+
const lx = (raster.x0Mm + i * raster.stepMm) / 1000;
|
|
553
|
+
const top = v / 100;
|
|
554
|
+
if (segmentInBox(toWorld(o, lx, Math.min(bottom, top), lz), toWorld(o, lx, top, lz), other))
|
|
555
|
+
return true;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return false;
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* The four lower corners of the box (collision box, otherwise clipping box), each with the highest surface below it
|
|
562
|
+
* (terrain, walkable surface and, with `rasters`, the walkable rasters of static objects) and the distance to it.
|
|
563
|
+
*/
|
|
564
|
+
export async function objectGround(wd, entry, o, opts = {}) {
|
|
565
|
+
const b = entry.collision || entry.clip;
|
|
566
|
+
if (!b)
|
|
567
|
+
return { verdict: 'box unknown' };
|
|
568
|
+
const pts = [
|
|
569
|
+
[b[0], b[2]],
|
|
570
|
+
[b[3], b[2]],
|
|
571
|
+
[b[0], b[5]],
|
|
572
|
+
[b[3], b[5]],
|
|
573
|
+
].map(([lx, lz]) => toWorld(o, lx, b[1], lz));
|
|
574
|
+
const missing = [];
|
|
575
|
+
const corners = [];
|
|
576
|
+
for (const p of pts) {
|
|
577
|
+
const [x, y, z] = p;
|
|
578
|
+
const g = await wd.groundAt(x, z);
|
|
579
|
+
const surfaces = [{ h: g.height, kind: 'terrain' }];
|
|
580
|
+
if (g.roadway)
|
|
581
|
+
surfaces.push({ h: g.roadway.height, kind: 'roadway' });
|
|
582
|
+
if (opts.rasters) {
|
|
583
|
+
const r = await wd.rasterSurfaces(x, z);
|
|
584
|
+
missing.push(...r.missing);
|
|
585
|
+
for (const s of r.surfaces)
|
|
586
|
+
surfaces.push({ h: s.height, kind: 'object' });
|
|
587
|
+
}
|
|
588
|
+
const below = surfaces.filter((s) => s.h <= y);
|
|
589
|
+
const s = below.length ? below.reduce((a, c) => (c.h > a.h ? c : a)) : surfaces.reduce((a, c) => (c.h < a.h ? c : a));
|
|
590
|
+
corners.push({ corner: p, surface: s.h, distance: y - s.h, kind: s.kind });
|
|
591
|
+
}
|
|
592
|
+
const dist = corners.map((c) => c.distance);
|
|
593
|
+
const min = Math.min(...dist);
|
|
594
|
+
const max = Math.max(...dist);
|
|
595
|
+
const out = { verdict: null, min, max, corners };
|
|
596
|
+
if (missing.length)
|
|
597
|
+
out.missing = [...new Set(missing)];
|
|
598
|
+
if (min > 0.05)
|
|
599
|
+
out.verdict = `floats ${min.toFixed(2)} m`;
|
|
600
|
+
else if (max < -0.05)
|
|
601
|
+
out.verdict = `${(-max).toFixed(2)} m in the ground`;
|
|
602
|
+
return out;
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/world/data.ts"],"names":[],"mappings":"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"}
|