@drawtonomy/sdk 0.4.0 → 0.5.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.
Files changed (46) hide show
  1. package/LICENSE +190 -0
  2. package/README.ja.md +2 -2
  3. package/README.md +29 -2
  4. package/dist/exporter/index.d.ts +9 -0
  5. package/dist/exporter/index.d.ts.map +1 -0
  6. package/dist/exporter/index.js +15 -0
  7. package/dist/exporter/index.js.map +1 -0
  8. package/dist/exporter/laneCenterline.d.ts +38 -0
  9. package/dist/exporter/laneCenterline.d.ts.map +1 -0
  10. package/dist/exporter/laneCenterline.js +94 -0
  11. package/dist/exporter/laneCenterline.js.map +1 -0
  12. package/dist/exporter/opendrive.d.ts +6 -0
  13. package/dist/exporter/opendrive.d.ts.map +1 -0
  14. package/dist/exporter/opendrive.js +565 -0
  15. package/dist/exporter/opendrive.js.map +1 -0
  16. package/dist/exporter/openscenario.d.ts +30 -0
  17. package/dist/exporter/openscenario.d.ts.map +1 -0
  18. package/dist/exporter/openscenario.js +393 -0
  19. package/dist/exporter/openscenario.js.map +1 -0
  20. package/dist/exporter/packageEsmini.d.ts +18 -0
  21. package/dist/exporter/packageEsmini.d.ts.map +1 -0
  22. package/dist/exporter/packageEsmini.js +23 -0
  23. package/dist/exporter/packageEsmini.js.map +1 -0
  24. package/dist/exporter/sanitize.d.ts +8 -0
  25. package/dist/exporter/sanitize.d.ts.map +1 -0
  26. package/dist/exporter/sanitize.js +29 -0
  27. package/dist/exporter/sanitize.js.map +1 -0
  28. package/dist/exporter/trajectory.d.ts +41 -0
  29. package/dist/exporter/trajectory.d.ts.map +1 -0
  30. package/dist/exporter/trajectory.js +200 -0
  31. package/dist/exporter/trajectory.js.map +1 -0
  32. package/dist/exporter/units.d.ts +16 -0
  33. package/dist/exporter/units.d.ts.map +1 -0
  34. package/dist/exporter/units.js +38 -0
  35. package/dist/exporter/units.js.map +1 -0
  36. package/dist/exporter/zip.d.ts +13 -0
  37. package/dist/exporter/zip.d.ts.map +1 -0
  38. package/dist/exporter/zip.js +137 -0
  39. package/dist/exporter/zip.js.map +1 -0
  40. package/dist/index.d.ts +1 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +2 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/types.d.ts +22 -7
  45. package/dist/types.d.ts.map +1 -1
  46. package/package.json +9 -10
@@ -0,0 +1,565 @@
1
+ // OpenDRIVE 1.8 (.xodr) exporter — emits a road network from a snapshot.
2
+ // No external library dependencies.
3
+ //
4
+ // Design (Phase 1):
5
+ // - Each lane is emitted as an independent <road> (junctions are out of scope)
6
+ // - Reference line is the midpoints of the left/right boundary samples
7
+ // - Each segment is a <line> geometry; lane width is a per-sample <width>
8
+ // - Lane connectivity (next/prev) is written into <link>
9
+ // - Coordinate frame: canvas (x right, y down) → ENU (x right, y up); y is flipped
10
+ import { computeCenterlineWithWidth } from './laneCenterline';
11
+ import { escapeXml, fmt, pxToEnuX, pxToEnuY, pxToMeter } from './units';
12
+ /** O(1) shape lookup by id. */
13
+ function buildShapeMap(shapes) {
14
+ const map = new Map();
15
+ for (const s of shapes)
16
+ map.set(s.id, s);
17
+ return map;
18
+ }
19
+ /**
20
+ * Build the centerline + width samples for a lane from its two boundaries.
21
+ * If pointOverrides is provided, those point ids are read from the override
22
+ * map instead of from the shape map (used for boundary alignment snapping).
23
+ */
24
+ function buildRoadGeometry(shapeMap, lane, pointOverrides) {
25
+ const leftId = lane.props.leftBoundaryId;
26
+ const rightId = lane.props.rightBoundaryId;
27
+ if (!leftId || !rightId)
28
+ return null;
29
+ const left = shapeMap.get(leftId);
30
+ const right = shapeMap.get(rightId);
31
+ if (!left || !right)
32
+ return null;
33
+ const leftPts = collectPoints(shapeMap, left.props.pointIds, lane.props.invertLeft, pointOverrides);
34
+ const rightPts = collectPoints(shapeMap, right.props.pointIds, lane.props.invertRight, pointOverrides);
35
+ if (leftPts.length < 2 || rightPts.length < 2)
36
+ return null;
37
+ const samples = computeCenterlineWithWidth(leftPts, rightPts);
38
+ if (samples.length < 2)
39
+ return null;
40
+ const odrSamples = samples.map((s) => ({
41
+ x: pxToEnuX(s.x),
42
+ y: pxToEnuY(s.y),
43
+ width: pxToMeter(s.width),
44
+ s: pxToMeter(s.s),
45
+ }));
46
+ const length = odrSamples[odrSamples.length - 1].s;
47
+ return { laneId: lane.id, samples, odrSamples, length };
48
+ }
49
+ function collectPoints(shapeMap, pointIds, invert, pointOverrides) {
50
+ const ids = invert ? [...pointIds].reverse() : pointIds;
51
+ const pts = [];
52
+ for (const id of ids) {
53
+ const ov = pointOverrides.get(id);
54
+ if (ov) {
55
+ pts.push({ x: ov.x, y: ov.y });
56
+ continue;
57
+ }
58
+ const p = shapeMap.get(id);
59
+ if (p)
60
+ pts.push({ x: p.x, y: p.y });
61
+ }
62
+ return pts;
63
+ }
64
+ /**
65
+ * Snap together boundary endpoints of connected lanes by clustering nearby
66
+ * points and using the centroid as the canonical position.
67
+ *
68
+ * Two lanes that "look" connected on the canvas may actually own separate
69
+ * point shapes whose coordinates drift by a few pixels. The road exporter
70
+ * would then emit a small visible gap between them in the player. This
71
+ * routine collects the boundary endpoints of lanes that participate in a
72
+ * next/prev relationship and snaps clusters within epsilonPx onto a single
73
+ * representative position.
74
+ */
75
+ function buildBoundaryAlignmentOverrides(shapeMap, lanes, epsilonPx = 30) {
76
+ const endpoints = [];
77
+ const laneIds = new Set(lanes.map((l) => l.id));
78
+ const collectEndpoints = (lane, side) => {
79
+ for (const sideKey of ['leftBoundaryId', 'rightBoundaryId']) {
80
+ const lsId = lane.props[sideKey];
81
+ if (!lsId)
82
+ continue;
83
+ const ls = shapeMap.get(lsId);
84
+ if (!ls)
85
+ continue;
86
+ const invert = sideKey === 'leftBoundaryId' ? lane.props.invertLeft : lane.props.invertRight;
87
+ const ids = invert ? [...ls.props.pointIds].reverse() : ls.props.pointIds;
88
+ if (ids.length === 0)
89
+ continue;
90
+ const pid = side === 'start' ? ids[0] : ids[ids.length - 1];
91
+ const pt = shapeMap.get(pid);
92
+ if (!pt)
93
+ continue;
94
+ endpoints.push({ pointId: pid, x: pt.x, y: pt.y });
95
+ }
96
+ };
97
+ // Restrict to lanes that participate in a next/prev relationship.
98
+ for (const lane of lanes) {
99
+ const hasNext = (lane.props.next || []).some((id) => laneIds.has(id));
100
+ const hasPrev = (lane.props.prev || []).some((id) => laneIds.has(id));
101
+ if (hasNext)
102
+ collectEndpoints(lane, 'end');
103
+ if (hasPrev)
104
+ collectEndpoints(lane, 'start');
105
+ }
106
+ // Greedy clustering: group points within epsilon of each other.
107
+ const clusters = [];
108
+ const eps2 = epsilonPx * epsilonPx;
109
+ for (const ep of endpoints) {
110
+ let placed = false;
111
+ for (const cluster of clusters) {
112
+ const c0 = cluster[0];
113
+ const dx = ep.x - c0.x;
114
+ const dy = ep.y - c0.y;
115
+ if (dx * dx + dy * dy <= eps2) {
116
+ cluster.push(ep);
117
+ placed = true;
118
+ break;
119
+ }
120
+ }
121
+ if (!placed)
122
+ clusters.push([ep]);
123
+ }
124
+ // Use each cluster centroid as the snapped position.
125
+ const overrides = new Map();
126
+ for (const cluster of clusters) {
127
+ if (cluster.length < 2)
128
+ continue; // Solitary points need no snapping.
129
+ let sx = 0;
130
+ let sy = 0;
131
+ for (const ep of cluster) {
132
+ sx += ep.x;
133
+ sy += ep.y;
134
+ }
135
+ const cx = sx / cluster.length;
136
+ const cy = sy / cluster.length;
137
+ for (const ep of cluster) {
138
+ // Last write wins if the same point id is referenced multiple times.
139
+ overrides.set(ep.pointId, { x: cx, y: cy });
140
+ }
141
+ }
142
+ return overrides;
143
+ }
144
+ function emitPlanView(geom) {
145
+ const lines = [];
146
+ lines.push(` <planView>`);
147
+ for (let i = 0; i < geom.odrSamples.length - 1; i++) {
148
+ const a = geom.odrSamples[i];
149
+ const b = geom.odrSamples[i + 1];
150
+ const dx = b.x - a.x;
151
+ const dy = b.y - a.y;
152
+ const segLen = Math.hypot(dx, dy);
153
+ if (segLen < 1e-9)
154
+ continue;
155
+ const hdg = Math.atan2(dy, dx);
156
+ lines.push(` <geometry s="${fmt(a.s)}" x="${fmt(a.x)}" y="${fmt(a.y)}" hdg="${fmt(hdg)}" length="${fmt(segLen)}">`);
157
+ lines.push(` <line/>`);
158
+ lines.push(` </geometry>`);
159
+ }
160
+ lines.push(` </planView>`);
161
+ return lines.join('\n');
162
+ }
163
+ function emitLanes(geom, hasPrev, hasNext) {
164
+ const lines = [];
165
+ lines.push(` <lanes>`);
166
+ lines.push(` <laneSection s="0">`);
167
+ // Left side: id=+1 (OpenDRIVE numbers lanes positively to the left of the reference line).
168
+ lines.push(` <left>`);
169
+ lines.push(` <lane id="1" type="driving" level="false">`);
170
+ emitLaneLink(lines, hasPrev, hasNext, 1);
171
+ emitHalfWidthEntries(geom, lines);
172
+ lines.push(` <roadMark sOffset="0" type="solid" weight="standard" color="white" width="0.13"/>`);
173
+ lines.push(` </lane>`);
174
+ lines.push(` </left>`);
175
+ // Center reference line.
176
+ lines.push(` <center>`);
177
+ lines.push(` <lane id="0" type="none" level="false">`);
178
+ lines.push(` <link/>`);
179
+ lines.push(` <roadMark sOffset="0" type="solid" weight="standard" color="standard" width="0.13"/>`);
180
+ lines.push(` </lane>`);
181
+ lines.push(` </center>`);
182
+ // Right side: id=-1.
183
+ lines.push(` <right>`);
184
+ lines.push(` <lane id="-1" type="driving" level="false">`);
185
+ emitLaneLink(lines, hasPrev, hasNext, -1);
186
+ emitHalfWidthEntries(geom, lines);
187
+ lines.push(` <roadMark sOffset="0" type="solid" weight="standard" color="white" width="0.13"/>`);
188
+ lines.push(` </lane>`);
189
+ lines.push(` </right>`);
190
+ lines.push(` </laneSection>`);
191
+ lines.push(` </lanes>`);
192
+ return lines.join('\n');
193
+ }
194
+ function emitLaneLink(out, hasPrev, hasNext, laneId) {
195
+ if (!hasPrev && !hasNext) {
196
+ out.push(` <link/>`);
197
+ return;
198
+ }
199
+ out.push(` <link>`);
200
+ if (hasPrev) {
201
+ out.push(` <predecessor id="${laneId}"/>`);
202
+ }
203
+ if (hasNext) {
204
+ out.push(` <successor id="${laneId}"/>`);
205
+ }
206
+ out.push(` </link>`);
207
+ }
208
+ function emitHalfWidthEntries(geom, out) {
209
+ for (let i = 0; i < geom.odrSamples.length - 1; i++) {
210
+ const s = geom.odrSamples[i].s;
211
+ const halfA = geom.odrSamples[i].width / 2;
212
+ const halfB = geom.odrSamples[i + 1].width / 2;
213
+ const segLen = geom.odrSamples[i + 1].s - s;
214
+ // Linear fit a + b*ds (c=d=0).
215
+ const a = halfA;
216
+ const b = segLen > 1e-9 ? (halfB - halfA) / segLen : 0;
217
+ out.push(` <width sOffset="${fmt(s)}" a="${fmt(a)}" b="${fmt(b)}" c="0" d="0"/>`);
218
+ }
219
+ }
220
+ function emitLink(lane, laneIdToRoadId) {
221
+ const lines = [];
222
+ lines.push(` <link>`);
223
+ if (lane.props.prev?.[0] && laneIdToRoadId.has(lane.props.prev[0])) {
224
+ const rid = laneIdToRoadId.get(lane.props.prev[0]);
225
+ lines.push(` <predecessor elementType="road" elementId="${rid}" contactPoint="end"/>`);
226
+ }
227
+ if (lane.props.next?.[0] && laneIdToRoadId.has(lane.props.next[0])) {
228
+ const rid = laneIdToRoadId.get(lane.props.next[0]);
229
+ lines.push(` <successor elementType="road" elementId="${rid}" contactPoint="start"/>`);
230
+ }
231
+ lines.push(` </link>`);
232
+ return lines.join('\n');
233
+ }
234
+ function projectToRoad(geom, xG, yG) {
235
+ let bestS = 0;
236
+ let bestT = 0;
237
+ let bestDist = Infinity;
238
+ let bestHdg = 0;
239
+ let bestClamped = false;
240
+ const samples = geom.odrSamples;
241
+ for (let i = 0; i < samples.length - 1; i++) {
242
+ const a = samples[i];
243
+ const b = samples[i + 1];
244
+ const dx = b.x - a.x;
245
+ const dy = b.y - a.y;
246
+ const segLen = Math.hypot(dx, dy);
247
+ if (segLen < 1e-9)
248
+ continue;
249
+ const ux = dx / segLen;
250
+ const uy = dy / segLen;
251
+ const px = xG - a.x;
252
+ const py = yG - a.y;
253
+ let tNorm = px * ux + py * uy;
254
+ let clamped = false;
255
+ if (tNorm < 0) {
256
+ tNorm = 0;
257
+ clamped = i === 0;
258
+ }
259
+ if (tNorm > segLen) {
260
+ tNorm = segLen;
261
+ clamped = i === samples.length - 2;
262
+ }
263
+ const projX = a.x + ux * tNorm;
264
+ const projY = a.y + uy * tNorm;
265
+ const dist = Math.hypot(xG - projX, yG - projY);
266
+ if (dist < bestDist) {
267
+ bestDist = dist;
268
+ bestS = a.s + tNorm;
269
+ const nx = -uy;
270
+ const ny = ux;
271
+ bestT = px * nx + py * ny;
272
+ bestHdg = Math.atan2(uy, ux);
273
+ bestClamped = clamped;
274
+ }
275
+ }
276
+ return { s: bestS, t: bestT, hdg: bestHdg, distance: bestDist, clampedAtEnd: bestClamped };
277
+ }
278
+ function attachShapesToRoads(trafficLights, crosswalks, polygons, laneToGeom, laneIdToRoadId, maxAttachDistanceMeter = 50) {
279
+ const roadSignals = new Map();
280
+ const roadObjects = new Map();
281
+ let signalIdCounter = 1;
282
+ let objectIdCounter = 1;
283
+ const roads = [];
284
+ laneToGeom.forEach((geom, laneId) => {
285
+ const roadId = laneIdToRoadId.get(laneId);
286
+ if (roadId !== undefined)
287
+ roads.push({ laneId, geom, roadId });
288
+ });
289
+ for (const tl of trafficLights) {
290
+ const xG = pxToEnuX(tl.x);
291
+ const yG = pxToEnuY(tl.y);
292
+ let best = null;
293
+ for (const r of roads) {
294
+ const proj = projectToRoad(r.geom, xG, yG);
295
+ if (!best || proj.distance < best.proj.distance)
296
+ best = { roadId: r.roadId, proj };
297
+ }
298
+ if (!best || best.proj.distance > maxAttachDistanceMeter)
299
+ continue;
300
+ const style = tl.props.style ?? '';
301
+ const isPed = style.startsWith('pedestrian') || style.includes('ped');
302
+ // Conventional signal type codes: 1000001 = vehicle, 1000002 = pedestrian.
303
+ const sigType = isPed ? '1000002' : '1000001';
304
+ const heightM = pxToMeter(tl.props.h);
305
+ const widthM = pxToMeter(tl.props.w);
306
+ const list = roadSignals.get(best.roadId) ?? [];
307
+ list.push({
308
+ id: signalIdCounter++,
309
+ s: best.proj.s,
310
+ t: best.proj.t,
311
+ zOffset: isPed ? 1.5 : 4.5,
312
+ height: heightM,
313
+ width: widthM,
314
+ name: style,
315
+ type: sigType,
316
+ subtype: '-1',
317
+ dynamic: 'yes',
318
+ orientation: best.proj.t >= 0 ? '+' : '-',
319
+ });
320
+ roadSignals.set(best.roadId, list);
321
+ }
322
+ for (const cw of crosswalks) {
323
+ const rotDeg = cw.rotation || 0;
324
+ const rotRad = (rotDeg * Math.PI) / 180;
325
+ const cosR = Math.cos(rotRad);
326
+ const sinR = Math.sin(rotRad);
327
+ const cxLocal = (cw.props.startX + cw.props.endX) / 2;
328
+ const cyLocal = (cw.props.startY + cw.props.endY) / 2;
329
+ const cxGlobal = cw.x + cxLocal;
330
+ const cyGlobal = cw.y + cyLocal;
331
+ const xG = pxToEnuX(cxGlobal);
332
+ const yG = pxToEnuY(cyGlobal);
333
+ let best = null;
334
+ for (const r of roads) {
335
+ const proj = projectToRoad(r.geom, xG, yG);
336
+ if (!best || proj.distance < best.proj.distance)
337
+ best = { roadId: r.roadId, proj };
338
+ }
339
+ if (!best || best.proj.distance > maxAttachDistanceMeter)
340
+ continue;
341
+ const dxLocal = cw.props.endX - cw.props.startX;
342
+ const dyLocal = cw.props.endY - cw.props.startY;
343
+ const lengthM = pxToMeter(Math.hypot(dxLocal, dyLocal));
344
+ const widthM = pxToMeter(cw.props.crosswalkWidth);
345
+ // Apply shape rotation to the local axis to obtain the global axis.
346
+ const dxPx = dxLocal * cosR - dyLocal * sinR;
347
+ const dyPx = dxLocal * sinR + dyLocal * cosR;
348
+ const cwEnuHdg = Math.atan2(-dyPx, dxPx);
349
+ let relativeHdg = cwEnuHdg - best.proj.hdg;
350
+ while (relativeHdg > Math.PI)
351
+ relativeHdg -= 2 * Math.PI;
352
+ while (relativeHdg < -Math.PI)
353
+ relativeHdg += 2 * Math.PI;
354
+ const list = roadObjects.get(best.roadId) ?? [];
355
+ // The OpenDRIVE crosswalk object renders perpendicular to the road when
356
+ // hdg = π/2 (verified empirically on east-west and north-south roads).
357
+ // Crosswalks are by convention placed across the road, so we always emit
358
+ // π/2 regardless of the user-drawn axis direction.
359
+ void relativeHdg;
360
+ const crosswalkHdg = Math.PI / 2;
361
+ list.push({
362
+ id: objectIdCounter++,
363
+ s: best.proj.s,
364
+ t: best.proj.t,
365
+ zOffset: 0,
366
+ hdg: crosswalkHdg,
367
+ length: lengthM,
368
+ width: widthM,
369
+ height: 0,
370
+ name: 'crosswalk',
371
+ type: 'crosswalk',
372
+ orientation: 'none',
373
+ });
374
+ roadObjects.set(best.roadId, list);
375
+ }
376
+ // Polygons (e.g. intersection patches) are emitted as <object type="patch">
377
+ // + <outlines>/<outline>/<cornerLocal>. The centroid is projected onto the
378
+ // nearest road; vertices are transformed into the road's local (u, v) frame.
379
+ for (const { shape: poly, vertices } of polygons) {
380
+ if (vertices.length < 3)
381
+ continue;
382
+ let cx = 0;
383
+ let cy = 0;
384
+ for (const v of vertices) {
385
+ cx += v.x;
386
+ cy += v.y;
387
+ }
388
+ cx /= vertices.length;
389
+ cy /= vertices.length;
390
+ const xG = pxToEnuX(cx);
391
+ const yG = pxToEnuY(cy);
392
+ let best = null;
393
+ let fallback = null;
394
+ for (const r of roads) {
395
+ const proj = projectToRoad(r.geom, xG, yG);
396
+ if (proj.clampedAtEnd) {
397
+ if (!fallback || proj.distance < fallback.proj.distance)
398
+ fallback = { roadId: r.roadId, proj };
399
+ continue;
400
+ }
401
+ if (!best || proj.distance < best.proj.distance)
402
+ best = { roadId: r.roadId, proj };
403
+ }
404
+ if (!best)
405
+ best = fallback;
406
+ if (!best || best.proj.distance > maxAttachDistanceMeter)
407
+ continue;
408
+ const cosH = Math.cos(best.proj.hdg);
409
+ const sinH = Math.sin(best.proj.hdg);
410
+ const samples = laneToGeom.get([...laneToGeom.keys()].find((k) => laneIdToRoadId.get(k) === best.roadId)).odrSamples;
411
+ const anchorPoint = best.proj.clampedAtEnd && best.proj.s >= samples[samples.length - 1].s - 1e-6
412
+ ? samples[samples.length - 1]
413
+ : samples[0];
414
+ const anchorEnuX = anchorPoint.x;
415
+ const anchorEnuY = anchorPoint.y;
416
+ const anchorS = anchorPoint.s;
417
+ const outline = [];
418
+ for (const v of vertices) {
419
+ const vxG = pxToEnuX(v.x);
420
+ const vyG = pxToEnuY(v.y);
421
+ const dx = vxG - anchorEnuX;
422
+ const dy = vyG - anchorEnuY;
423
+ const u = dx * cosH + dy * sinH;
424
+ const vv = -dx * sinH + dy * cosH;
425
+ outline.push({ u, v: vv });
426
+ }
427
+ const list = roadObjects.get(best.roadId) ?? [];
428
+ const subtype = poly.props.attributes?.subtype;
429
+ list.push({
430
+ id: objectIdCounter++,
431
+ s: anchorS,
432
+ t: 0,
433
+ // Lift 5 cm above the road surface to avoid z-fighting where the
434
+ // patch overlaps multiple roads at z=0.
435
+ zOffset: 0.05,
436
+ hdg: 0,
437
+ length: 0,
438
+ width: 0,
439
+ height: 0,
440
+ name: typeof subtype === 'string' ? subtype : 'polygon',
441
+ type: 'patch',
442
+ orientation: 'none',
443
+ outline,
444
+ });
445
+ roadObjects.set(best.roadId, list);
446
+ }
447
+ return { roadSignals, roadObjects };
448
+ }
449
+ function emitSignals(signals) {
450
+ if (!signals.length)
451
+ return ` <signals/>`;
452
+ const lines = [];
453
+ lines.push(` <signals>`);
454
+ for (const s of signals) {
455
+ lines.push(` <signal id="${s.id}" s="${fmt(s.s)}" t="${fmt(s.t)}" zOffset="${fmt(s.zOffset)}" name="${escapeXml(s.name)}" dynamic="${s.dynamic}" orientation="${s.orientation}" type="${s.type}" subtype="${s.subtype}" country="OpenDRIVE" value="0" height="${fmt(s.height)}" width="${fmt(s.width)}"/>`);
456
+ }
457
+ lines.push(` </signals>`);
458
+ return lines.join('\n');
459
+ }
460
+ function emitObjects(objects) {
461
+ if (!objects.length)
462
+ return ` <objects/>`;
463
+ const lines = [];
464
+ lines.push(` <objects>`);
465
+ for (const o of objects) {
466
+ if (o.outline && o.outline.length >= 3) {
467
+ lines.push(` <object id="${o.id}" s="${fmt(o.s)}" t="${fmt(o.t)}" zOffset="${fmt(o.zOffset)}" hdg="${fmt(o.hdg)}" name="${escapeXml(o.name)}" type="${o.type}" orientation="${o.orientation}" length="0" width="0" height="0">`);
468
+ lines.push(` <outlines>`);
469
+ lines.push(` <outline id="0" closed="true">`);
470
+ o.outline.forEach((p, i) => {
471
+ // height=0.001 (1 mm) gives the patch a tiny vertical thickness so
472
+ // its top and bottom faces sit on different z planes (avoids z-fighting).
473
+ lines.push(` <cornerLocal id="${i}" u="${fmt(p.u)}" v="${fmt(p.v)}" z="0" height="0.001"/>`);
474
+ });
475
+ lines.push(` </outline>`);
476
+ lines.push(` </outlines>`);
477
+ lines.push(` </object>`);
478
+ }
479
+ else {
480
+ lines.push(` <object id="${o.id}" s="${fmt(o.s)}" t="${fmt(o.t)}" zOffset="${fmt(o.zOffset)}" hdg="${fmt(o.hdg)}" name="${escapeXml(o.name)}" type="${o.type}" orientation="${o.orientation}" length="${fmt(o.length)}" width="${fmt(o.width)}" height="${fmt(o.height)}"/>`);
481
+ }
482
+ }
483
+ lines.push(` </objects>`);
484
+ return lines.join('\n');
485
+ }
486
+ function emitRoad(lane, geom, roadId, laneIdToRoadId, signals, objects) {
487
+ const speed = lane.props.attributes?.speed_limit;
488
+ const name = escapeXml(lane.props.attributes?.subtype || 'road');
489
+ const hasPrev = !!(lane.props.prev?.[0] && laneIdToRoadId.has(lane.props.prev[0]));
490
+ const hasNext = !!(lane.props.next?.[0] && laneIdToRoadId.has(lane.props.next[0]));
491
+ const lines = [];
492
+ lines.push(` <road name="${name}" length="${fmt(geom.length)}" id="${roadId}" junction="-1">`);
493
+ lines.push(emitLink(lane, laneIdToRoadId));
494
+ if (speed) {
495
+ lines.push(` <type s="0" type="town">`);
496
+ lines.push(` <speed max="${escapeXml(speed)}" unit="km/h"/>`);
497
+ lines.push(` </type>`);
498
+ }
499
+ lines.push(emitPlanView(geom));
500
+ lines.push(` <elevationProfile/>`);
501
+ lines.push(` <lateralProfile/>`);
502
+ lines.push(emitLanes(geom, hasPrev, hasNext));
503
+ lines.push(emitObjects(objects));
504
+ lines.push(emitSignals(signals));
505
+ lines.push(` </road>`);
506
+ return lines.join('\n');
507
+ }
508
+ /**
509
+ * Build an OpenDRIVE 1.8 XML document from a snapshot.
510
+ */
511
+ export function exportToOpenDrive(snapshot) {
512
+ const shapes = snapshot.shapes;
513
+ const shapeMap = buildShapeMap(shapes);
514
+ const lanes = [];
515
+ const trafficLights = [];
516
+ const crosswalks = [];
517
+ const polygons = [];
518
+ for (const s of shapes) {
519
+ if (s.type === 'lane')
520
+ lanes.push(s);
521
+ else if (s.type === 'traffic_light')
522
+ trafficLights.push(s);
523
+ else if (s.type === 'crosswalk')
524
+ crosswalks.push(s);
525
+ else if (s.type === 'polygon') {
526
+ const poly = s;
527
+ const vertices = [];
528
+ for (const pid of poly.props.pointIds) {
529
+ const p = shapeMap.get(pid);
530
+ if (p)
531
+ vertices.push({ x: p.x, y: p.y });
532
+ }
533
+ if (vertices.length >= 3)
534
+ polygons.push({ shape: poly, vertices });
535
+ }
536
+ }
537
+ // Assign sequential road ids.
538
+ const laneIdToRoadId = new Map();
539
+ lanes.forEach((lane, i) => laneIdToRoadId.set(lane.id, i + 1));
540
+ const dateStr = new Date().toISOString();
541
+ const lines = [];
542
+ lines.push(`<?xml version="1.0" encoding="UTF-8"?>`);
543
+ lines.push(`<OpenDRIVE>`);
544
+ lines.push(` <header revMajor="1" revMinor="8" name="drawtonomy" version="1.0" date="${dateStr}" north="0" south="0" east="0" west="0" vendor="drawtonomy"/>`);
545
+ const pointOverrides = buildBoundaryAlignmentOverrides(shapeMap, lanes);
546
+ const laneToGeom = new Map();
547
+ for (const lane of lanes) {
548
+ const geom = buildRoadGeometry(shapeMap, lane, pointOverrides);
549
+ if (geom)
550
+ laneToGeom.set(lane.id, geom);
551
+ }
552
+ const { roadSignals, roadObjects } = attachShapesToRoads(trafficLights, crosswalks, polygons, laneToGeom, laneIdToRoadId);
553
+ for (const lane of lanes) {
554
+ const geom = laneToGeom.get(lane.id);
555
+ if (!geom)
556
+ continue;
557
+ const roadId = laneIdToRoadId.get(lane.id);
558
+ const signals = roadSignals.get(roadId) ?? [];
559
+ const objects = roadObjects.get(roadId) ?? [];
560
+ lines.push(emitRoad(lane, geom, roadId, laneIdToRoadId, signals, objects));
561
+ }
562
+ lines.push(`</OpenDRIVE>`);
563
+ return lines.join('\n');
564
+ }
565
+ //# sourceMappingURL=opendrive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opendrive.js","sourceRoot":"","sources":["../../src/exporter/opendrive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { DrawtonomySnapshot } from '../types';
2
+ /**
3
+ * Hook for callers that want to override pedestrian / category resolution
4
+ * (e.g. when their host knows about custom templates not bundled with the
5
+ * SDK).
6
+ */
7
+ export interface TemplateResolver {
8
+ /** Normalize a template id, applying any legacy rewrites. */
9
+ resolveTemplateId?: (templateId: string) => string;
10
+ /** True if the resolved id refers to a pedestrian template. */
11
+ isPedestrianTemplate?: (templateId: string) => boolean;
12
+ }
13
+ /**
14
+ * Map a vehicle template id to an OpenSCENARIO vehicleCategory.
15
+ * Spec values: car, van, truck, trailer, semitrailer, bus, motorbike, bicycle, train, tram.
16
+ */
17
+ export declare function templateIdToVehicleCategory(templateId: string, resolver?: TemplateResolver): string;
18
+ export interface OpenScenarioExportOptions {
19
+ /** Filename of the paired .xodr (referenced by <LogicFile>). Empty if absent. */
20
+ xodrFilename?: string;
21
+ /** Scenario name. */
22
+ scenarioName?: string;
23
+ /** Optional template resolver hook. */
24
+ templateResolver?: TemplateResolver;
25
+ }
26
+ /**
27
+ * Build an OpenSCENARIO 1.3 XML document from a snapshot.
28
+ */
29
+ export declare function exportToOpenScenario(snapshot: DrawtonomySnapshot, options?: OpenScenarioExportOptions): string;
30
+ //# sourceMappingURL=openscenario.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openscenario.d.ts","sourceRoot":"","sources":["../../src/exporter/openscenario.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAEV,kBAAkB,EAInB,MAAM,UAAU,CAAA;AAgBjB;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAA;IAClD,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAA;CACvD;AAWD;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,MAAM,CAoBR;AA+MD,MAAM,WAAW,yBAAyB;IACxC,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,uCAAuC;IACvC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC;AAuID;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,yBAA8B,GACtC,MAAM,CA8DR"}