@bldrs-ai/conway 1.444.1334 → 1.445.1339

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 (36) hide show
  1. package/compiled/examples/browser-bundled.cjs +42 -1
  2. package/compiled/examples/cli-bundled.cjs +116 -15
  3. package/compiled/examples/cli-step-bundled.cjs +42 -1
  4. package/compiled/examples/validator-bundled.cjs +42 -1
  5. package/compiled/src/compat/web-ifc/coordination_f64.d.ts +12 -0
  6. package/compiled/src/compat/web-ifc/coordination_f64.d.ts.map +1 -1
  7. package/compiled/src/compat/web-ifc/coordination_f64.js +13 -0
  8. package/compiled/src/compat/web-ifc/ifc_api.d.ts +13 -0
  9. package/compiled/src/compat/web-ifc/ifc_api.d.ts.map +1 -1
  10. package/compiled/src/compat/web-ifc/ifc_api.js +19 -0
  11. package/compiled/src/compat/web-ifc/ifc_api_model_passthrough.d.ts +9 -0
  12. package/compiled/src/compat/web-ifc/ifc_api_model_passthrough.d.ts.map +1 -1
  13. package/compiled/src/compat/web-ifc/ifc_api_preview_coordination.test.d.ts +2 -0
  14. package/compiled/src/compat/web-ifc/ifc_api_preview_coordination.test.d.ts.map +1 -0
  15. package/compiled/src/compat/web-ifc/ifc_api_preview_coordination.test.js +124 -0
  16. package/compiled/src/compat/web-ifc/ifc_api_proxy_ap214.d.ts +10 -0
  17. package/compiled/src/compat/web-ifc/ifc_api_proxy_ap214.d.ts.map +1 -1
  18. package/compiled/src/compat/web-ifc/ifc_api_proxy_ap214.js +35 -2
  19. package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts +20 -0
  20. package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts.map +1 -1
  21. package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.js +56 -2
  22. package/compiled/src/ifc/ifc_geometry_extraction.d.ts +5 -4
  23. package/compiled/src/ifc/ifc_geometry_extraction.d.ts.map +1 -1
  24. package/compiled/src/ifc/ifc_geometry_extraction.js +60 -16
  25. package/compiled/src/step/parsing/uint32_sink.d.ts +37 -0
  26. package/compiled/src/step/parsing/uint32_sink.d.ts.map +1 -0
  27. package/compiled/src/step/parsing/uint32_sink.js +50 -0
  28. package/compiled/src/step/parsing/uint32_sink.test.d.ts +2 -0
  29. package/compiled/src/step/parsing/uint32_sink.test.d.ts.map +1 -0
  30. package/compiled/src/step/parsing/uint32_sink.test.js +77 -0
  31. package/compiled/src/step/step_entity_base.d.ts +20 -0
  32. package/compiled/src/step/step_entity_base.d.ts.map +1 -1
  33. package/compiled/src/step/step_entity_base.js +42 -1
  34. package/compiled/src/version/version.js +1 -1
  35. package/compiled/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +1 -1
@@ -30,7 +30,7 @@ var import_node_process = require("node:process");
30
30
  var readline = __toESM(require("node:readline"), 1);
31
31
 
32
32
  // compiled/src/version/version.js
33
- var versionString = "Conway v1.444.1334";
33
+ var versionString = "Conway v1.445.1339";
34
34
 
35
35
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
36
36
  var wasmType = "";
@@ -10762,6 +10762,47 @@ var StepEntityBase = class {
10762
10762
  module2.HEAPU8.set(buffer.subarray(cursor, endCursor), dataPtr);
10763
10763
  return true;
10764
10764
  }
10765
+ /**
10766
+ * Append an unsigned-integer list field straight from the STEP buffer
10767
+ * into `sink`, without materialising an intermediate `Array< number >`.
10768
+ *
10769
+ * Semantically identical to the generated array getters (same
10770
+ * optional handling, same element extraction, same "incorrectly
10771
+ * typed" error), but it neither allocates nor caches a per-record
10772
+ * array — the caller owns one reusable sink for the whole batch. On
10773
+ * tessellated models this removes millions of short-lived arrays and
10774
+ * the retained heap that goes with them; see Uint32Sink.
10775
+ *
10776
+ * @param offset The offset in the vtable to extract from.
10777
+ * @param baseOffset The base offset of the class in the vtable.
10778
+ * @param depth The depth in the inheritance hierarchy.
10779
+ * @param sink Receives the appended values.
10780
+ * @return {number} How many values were appended (0 when the field is
10781
+ * unset/optional-null).
10782
+ */
10783
+ extractIntegerArrayInto(offset, baseOffset, depth, sink) {
10784
+ let cursor = this.getOffsetCursor(offset, baseOffset, depth);
10785
+ const buffer = this.buffer;
10786
+ const endCursor = buffer.length;
10787
+ if (stepExtractOptional(buffer, cursor, endCursor) === null) {
10788
+ return 0;
10789
+ }
10790
+ let count = 0;
10791
+ let signedCursor0 = stepExtractArrayBegin(buffer, cursor, endCursor);
10792
+ cursor = Math.abs(signedCursor0);
10793
+ while (signedCursor0 >= 0) {
10794
+ const value = stepExtractNumber(buffer, cursor, endCursor);
10795
+ if (value === void 0) {
10796
+ throw new Error("Value in STEP was incorrectly typed");
10797
+ }
10798
+ cursor = skipValue(buffer, cursor, endCursor);
10799
+ sink.push(value);
10800
+ ++count;
10801
+ signedCursor0 = stepExtractArrayToken(buffer, cursor, endCursor);
10802
+ cursor = Math.abs(signedCursor0);
10803
+ }
10804
+ return count;
10805
+ }
10765
10806
  /**
10766
10807
  * Extract a number at the particular vtable offset (i.e. the position
10767
10808
  * in the matching step object).
@@ -14965,7 +14965,7 @@ ${t5.join("\n")}` : "";
14965
14965
  var import_process = require("process");
14966
14966
 
14967
14967
  // compiled/src/version/version.js
14968
- var versionString = "Conway v1.444.1334";
14968
+ var versionString = "Conway v1.445.1339";
14969
14969
 
14970
14970
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
14971
14971
  function pThreadsAllowed() {
@@ -26576,6 +26576,47 @@ var StepEntityBase = class {
26576
26576
  module2.HEAPU8.set(buffer.subarray(cursor, endCursor), dataPtr);
26577
26577
  return true;
26578
26578
  }
26579
+ /**
26580
+ * Append an unsigned-integer list field straight from the STEP buffer
26581
+ * into `sink`, without materialising an intermediate `Array< number >`.
26582
+ *
26583
+ * Semantically identical to the generated array getters (same
26584
+ * optional handling, same element extraction, same "incorrectly
26585
+ * typed" error), but it neither allocates nor caches a per-record
26586
+ * array — the caller owns one reusable sink for the whole batch. On
26587
+ * tessellated models this removes millions of short-lived arrays and
26588
+ * the retained heap that goes with them; see Uint32Sink.
26589
+ *
26590
+ * @param offset The offset in the vtable to extract from.
26591
+ * @param baseOffset The base offset of the class in the vtable.
26592
+ * @param depth The depth in the inheritance hierarchy.
26593
+ * @param sink Receives the appended values.
26594
+ * @return {number} How many values were appended (0 when the field is
26595
+ * unset/optional-null).
26596
+ */
26597
+ extractIntegerArrayInto(offset, baseOffset, depth, sink) {
26598
+ let cursor = this.getOffsetCursor(offset, baseOffset, depth);
26599
+ const buffer = this.buffer;
26600
+ const endCursor = buffer.length;
26601
+ if (stepExtractOptional(buffer, cursor, endCursor) === null) {
26602
+ return 0;
26603
+ }
26604
+ let count = 0;
26605
+ let signedCursor0 = stepExtractArrayBegin(buffer, cursor, endCursor);
26606
+ cursor = Math.abs(signedCursor0);
26607
+ while (signedCursor0 >= 0) {
26608
+ const value = stepExtractNumber(buffer, cursor, endCursor);
26609
+ if (value === void 0) {
26610
+ throw new Error("Value in STEP was incorrectly typed");
26611
+ }
26612
+ cursor = skipValue(buffer, cursor, endCursor);
26613
+ sink.push(value);
26614
+ ++count;
26615
+ signedCursor0 = stepExtractArrayToken(buffer, cursor, endCursor);
26616
+ cursor = Math.abs(signedCursor0);
26617
+ }
26618
+ return count;
26619
+ }
26579
26620
  /**
26580
26621
  * Extract a number at the particular vtable offset (i.e. the position
26581
26622
  * in the matching step object).
@@ -87125,6 +87166,47 @@ var yargs_default = Yargs;
87125
87166
  // compiled/src/ifc/ifc_command_line_main.js
87126
87167
  var import_fs = __toESM(require("fs"), 1);
87127
87168
 
87169
+ // compiled/src/step/parsing/uint32_sink.js
87170
+ var Uint32Sink = class {
87171
+ /**
87172
+ * @param initialCapacity Initial element capacity.
87173
+ */
87174
+ constructor(initialCapacity = 1024) {
87175
+ this.length_ = 0;
87176
+ this.data_ = new Uint32Array(Math.max(1, initialCapacity));
87177
+ }
87178
+ /** @return {number} Element count appended since the last reset. */
87179
+ get length() {
87180
+ return this.length_;
87181
+ }
87182
+ /**
87183
+ * A view of exactly the appended elements. Only valid until the next
87184
+ * append (which may reallocate) — copy it if it must outlive that.
87185
+ *
87186
+ * @return {Uint32Array} View over [0, length).
87187
+ */
87188
+ get view() {
87189
+ return this.data_.subarray(0, this.length_);
87190
+ }
87191
+ /** Drop all appended elements, keeping the allocated capacity. */
87192
+ reset() {
87193
+ this.length_ = 0;
87194
+ }
87195
+ /**
87196
+ * Append one value, growing geometrically when full.
87197
+ *
87198
+ * @param value The value to append.
87199
+ */
87200
+ push(value) {
87201
+ if (this.length_ === this.data_.length) {
87202
+ const grown = new Uint32Array(this.data_.length * 2);
87203
+ grown.set(this.data_);
87204
+ this.data_ = grown;
87205
+ }
87206
+ this.data_[this.length_++] = value;
87207
+ }
87208
+ };
87209
+
87128
87210
  // compiled/src/core/native_pool.js
87129
87211
  var ObjectPool = class {
87130
87212
  /**
@@ -87705,6 +87787,8 @@ function extractColorOrFactorMultiply(from, surfaceColor, alpha = 1) {
87705
87787
  ];
87706
87788
  }
87707
87789
  }
87790
+ var POLYGONAL_INDEX_SINK_CAPACITY = 65536;
87791
+ var POLYGONAL_FACE_SINK_CAPACITY = 16384;
87708
87792
  var IfcGeometryExtraction = class _IfcGeometryExtraction {
87709
87793
  constructor(conwayModel, model, limitCSGDepth = true, csgDepthLimit = 20, lowMemoryMode = false) {
87710
87794
  this.conwayModel = conwayModel;
@@ -87712,6 +87796,11 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
87712
87796
  this.limitCSGDepth = limitCSGDepth;
87713
87797
  this.csgDepthLimit = csgDepthLimit;
87714
87798
  this.lowMemoryMode = lowMemoryMode;
87799
+ this.polygonalIndexSink_ = new Uint32Sink(POLYGONAL_INDEX_SINK_CAPACITY);
87800
+ this.polygonalStartIndexSink_ = new Uint32Sink(POLYGONAL_FACE_SINK_CAPACITY);
87801
+ this.polygonalFaceOffsetSink_ = new Uint32Sink(POLYGONAL_FACE_SINK_CAPACITY);
87802
+ this.polygonalStartOffsetSink_ = new Uint32Sink(POLYGONAL_FACE_SINK_CAPACITY);
87803
+ this.polygonalSinksInUse_ = false;
87715
87804
  this.TWO_DIMENSIONS = 2;
87716
87805
  this.THREE_DIMENSIONS = 3;
87717
87806
  this.circleSegments = 12;
@@ -88091,10 +88180,18 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
88091
88180
  */
88092
88181
  extractPolygonalFaceSet(entity, temporary = false, isRelVoid = false) {
88093
88182
  const result = ExtractResult.COMPLETE;
88094
- const allIndices = [];
88095
- const allStartIndices = [];
88096
- const polygonalFaceBufferOffsets = [];
88097
- const startIndicesBufferOffsets = [];
88183
+ if (this.polygonalSinksInUse_) {
88184
+ throw new Error("extractPolygonalFaceSet re-entered: the shared index sinks are already in use");
88185
+ }
88186
+ this.polygonalSinksInUse_ = true;
88187
+ const allIndices = this.polygonalIndexSink_;
88188
+ const allStartIndices = this.polygonalStartIndexSink_;
88189
+ const polygonalFaceBufferOffsets = this.polygonalFaceOffsetSink_;
88190
+ const startIndicesBufferOffsets = this.polygonalStartOffsetSink_;
88191
+ allIndices.reset();
88192
+ allStartIndices.reset();
88193
+ polygonalFaceBufferOffsets.reset();
88194
+ startIndicesBufferOffsets.reset();
88098
88195
  let indicesPerFace = -1;
88099
88196
  entity.Faces.forEach((polygonalFace) => {
88100
88197
  polygonalFaceBufferOffsets.push(allIndices.length);
@@ -88104,29 +88201,33 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
88104
88201
  indicesPerFace = polygonalFace.CoordIndex.length;
88105
88202
  allStartIndices.push(0);
88106
88203
  coordIndex += indicesPerFace;
88107
- allIndices.push(...polygonalFace.CoordIndex);
88204
+ for (const index of polygonalFace.CoordIndex) {
88205
+ allIndices.push(index);
88206
+ }
88108
88207
  polygonalFace.InnerCoordIndices.forEach((innerIndices) => {
88109
88208
  allStartIndices.push(coordIndex);
88110
- allIndices.push(...innerIndices);
88209
+ for (const index of innerIndices) {
88210
+ allIndices.push(index);
88211
+ }
88111
88212
  coordIndex += innerIndices.length;
88112
88213
  });
88113
88214
  } else {
88114
- indicesPerFace = polygonalFace.CoordIndex.length;
88215
+ indicesPerFace = polygonalFace.extractIntegerArrayInto(0, 0, 3, allIndices);
88115
88216
  allStartIndices.push(0);
88116
- allIndices.push(...polygonalFace.CoordIndex);
88117
88217
  }
88118
88218
  });
88119
88219
  polygonalFaceBufferOffsets.push(allIndices.length);
88120
88220
  startIndicesBufferOffsets.push(allStartIndices.length);
88121
- const indicesArray = new Uint32Array(allIndices);
88221
+ const indicesArray = allIndices.view;
88122
88222
  const indicesArrayPtr = this.arrayToWasmHeap(indicesArray);
88123
- const startIndicesArray = new Uint32Array(allStartIndices);
88223
+ const startIndicesArray = allStartIndices.view;
88124
88224
  const startIndicesArrayPtr = this.arrayToWasmHeap(startIndicesArray);
88125
- const polygonalFaceBufferOffsetsArray = new Uint32Array(polygonalFaceBufferOffsets);
88225
+ const polygonalFaceBufferOffsetsArray = polygonalFaceBufferOffsets.view;
88126
88226
  const polygonalFaceBufferOffsetsArrayPtr = this.arrayToWasmHeap(polygonalFaceBufferOffsetsArray);
88127
- const startIndicesBufferOffsetsArray = new Uint32Array(startIndicesBufferOffsets);
88227
+ const startIndicesBufferOffsetsArray = startIndicesBufferOffsets.view;
88128
88228
  const startIndicesBufferOffsetsArrayPtr = this.arrayToWasmHeap(startIndicesBufferOffsetsArray);
88129
- const polygonalFaceVector = this.wasmModule.buildIndexedPolygonalFaceVector(indicesArrayPtr, indicesArray.length, startIndicesArrayPtr, polygonalFaceBufferOffsetsArrayPtr, polygonalFaceBufferOffsets.length, startIndicesBufferOffsetsArrayPtr, startIndicesBufferOffsets.length);
88229
+ const polygonalFaceVector = this.wasmModule.buildIndexedPolygonalFaceVector(indicesArrayPtr, indicesArray.length, startIndicesArrayPtr, polygonalFaceBufferOffsetsArrayPtr, polygonalFaceBufferOffsetsArray.length, startIndicesBufferOffsetsArrayPtr, startIndicesBufferOffsetsArray.length);
88230
+ this.polygonalSinksInUse_ = false;
88130
88231
  const pointsParseBuffer = this.conwayModel.nativeParseBuffer();
88131
88232
  if (!entity.Coordinates.extractParseBuffer(0, 0, 0, pointsParseBuffer, this.wasmModule, true)) {
88132
88233
  pointsParseBuffer.resize(0);
@@ -88168,7 +88269,7 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
88168
88269
  const numBytes = array.length * bytesPerElement;
88169
88270
  const arrayPtr = this.wasmModule._malloc(numBytes);
88170
88271
  const arrayWasm = new Uint8Array(this.wasmModule.HEAPU8.buffer, arrayPtr, numBytes);
88171
- arrayWasm.set(new Uint8Array(array.buffer));
88272
+ arrayWasm.set(new Uint8Array(array.buffer, array.byteOffset, numBytes));
88172
88273
  return arrayPtr;
88173
88274
  }
88174
88275
  /**
@@ -15943,7 +15943,7 @@ var ParsingBuffer = class {
15943
15943
  };
15944
15944
 
15945
15945
  // compiled/src/version/version.js
15946
- var versionString = "Conway v1.444.1334";
15946
+ var versionString = "Conway v1.445.1339";
15947
15947
 
15948
15948
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
15949
15949
  function pThreadsAllowed() {
@@ -22550,6 +22550,47 @@ var StepEntityBase = class {
22550
22550
  module2.HEAPU8.set(buffer.subarray(cursor, endCursor), dataPtr);
22551
22551
  return true;
22552
22552
  }
22553
+ /**
22554
+ * Append an unsigned-integer list field straight from the STEP buffer
22555
+ * into `sink`, without materialising an intermediate `Array< number >`.
22556
+ *
22557
+ * Semantically identical to the generated array getters (same
22558
+ * optional handling, same element extraction, same "incorrectly
22559
+ * typed" error), but it neither allocates nor caches a per-record
22560
+ * array — the caller owns one reusable sink for the whole batch. On
22561
+ * tessellated models this removes millions of short-lived arrays and
22562
+ * the retained heap that goes with them; see Uint32Sink.
22563
+ *
22564
+ * @param offset The offset in the vtable to extract from.
22565
+ * @param baseOffset The base offset of the class in the vtable.
22566
+ * @param depth The depth in the inheritance hierarchy.
22567
+ * @param sink Receives the appended values.
22568
+ * @return {number} How many values were appended (0 when the field is
22569
+ * unset/optional-null).
22570
+ */
22571
+ extractIntegerArrayInto(offset, baseOffset, depth, sink) {
22572
+ let cursor = this.getOffsetCursor(offset, baseOffset, depth);
22573
+ const buffer = this.buffer;
22574
+ const endCursor = buffer.length;
22575
+ if (stepExtractOptional(buffer, cursor, endCursor) === null) {
22576
+ return 0;
22577
+ }
22578
+ let count = 0;
22579
+ let signedCursor0 = stepExtractArrayBegin(buffer, cursor, endCursor);
22580
+ cursor = Math.abs(signedCursor0);
22581
+ while (signedCursor0 >= 0) {
22582
+ const value = stepExtractNumber(buffer, cursor, endCursor);
22583
+ if (value === void 0) {
22584
+ throw new Error("Value in STEP was incorrectly typed");
22585
+ }
22586
+ cursor = skipValue(buffer, cursor, endCursor);
22587
+ sink.push(value);
22588
+ ++count;
22589
+ signedCursor0 = stepExtractArrayToken(buffer, cursor, endCursor);
22590
+ cursor = Math.abs(signedCursor0);
22591
+ }
22592
+ return count;
22593
+ }
22553
22594
  /**
22554
22595
  * Extract a number at the particular vtable offset (i.e. the position
22555
22596
  * in the matching step object).
@@ -944,7 +944,7 @@ var EntityTypesIfcCount = 909;
944
944
  var entity_types_ifc_gen_default = EntityTypesIfc;
945
945
 
946
946
  // compiled/src/version/version.js
947
- var versionString = "Conway v1.444.1334";
947
+ var versionString = "Conway v1.445.1339";
948
948
 
949
949
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
950
950
  var wasmType = "";
@@ -10760,6 +10760,47 @@ var StepEntityBase = class {
10760
10760
  module2.HEAPU8.set(buffer.subarray(cursor, endCursor), dataPtr);
10761
10761
  return true;
10762
10762
  }
10763
+ /**
10764
+ * Append an unsigned-integer list field straight from the STEP buffer
10765
+ * into `sink`, without materialising an intermediate `Array< number >`.
10766
+ *
10767
+ * Semantically identical to the generated array getters (same
10768
+ * optional handling, same element extraction, same "incorrectly
10769
+ * typed" error), but it neither allocates nor caches a per-record
10770
+ * array — the caller owns one reusable sink for the whole batch. On
10771
+ * tessellated models this removes millions of short-lived arrays and
10772
+ * the retained heap that goes with them; see Uint32Sink.
10773
+ *
10774
+ * @param offset The offset in the vtable to extract from.
10775
+ * @param baseOffset The base offset of the class in the vtable.
10776
+ * @param depth The depth in the inheritance hierarchy.
10777
+ * @param sink Receives the appended values.
10778
+ * @return {number} How many values were appended (0 when the field is
10779
+ * unset/optional-null).
10780
+ */
10781
+ extractIntegerArrayInto(offset, baseOffset, depth, sink) {
10782
+ let cursor = this.getOffsetCursor(offset, baseOffset, depth);
10783
+ const buffer = this.buffer;
10784
+ const endCursor = buffer.length;
10785
+ if (stepExtractOptional(buffer, cursor, endCursor) === null) {
10786
+ return 0;
10787
+ }
10788
+ let count = 0;
10789
+ let signedCursor0 = stepExtractArrayBegin(buffer, cursor, endCursor);
10790
+ cursor = Math.abs(signedCursor0);
10791
+ while (signedCursor0 >= 0) {
10792
+ const value = stepExtractNumber(buffer, cursor, endCursor);
10793
+ if (value === void 0) {
10794
+ throw new Error("Value in STEP was incorrectly typed");
10795
+ }
10796
+ cursor = skipValue(buffer, cursor, endCursor);
10797
+ sink.push(value);
10798
+ ++count;
10799
+ signedCursor0 = stepExtractArrayToken(buffer, cursor, endCursor);
10800
+ cursor = Math.abs(signedCursor0);
10801
+ }
10802
+ return count;
10803
+ }
10763
10804
  /**
10764
10805
  * Extract a number at the particular vtable offset (i.e. the position
10765
10806
  * in the matching step object).
@@ -71,4 +71,16 @@ export declare function deriveCoordinationF64(placement: ArrayLike<number> | und
71
71
  * ready to hand back as a FlatMesh `flatTransformation`.
72
72
  */
73
73
  export declare function composeTransformF64(coordination: ArrayLike<number>, placement: ArrayLike<number> | undefined, geomCenter?: Point3Like): number[];
74
+ export declare const TRANSLATION_X = 12;
75
+ export declare const TRANSLATION_Y = 13;
76
+ export declare const TRANSLATION_Z = 14;
77
+ /**
78
+ * Placement-magnitude budget (metres) above which a coordination frame
79
+ * has failed to recentre a model: float32 (the GPU vertex format and
80
+ * BatchedMesh matrix texture) quantizes at ~1mm per 1e4 m of
81
+ * coordinate, the visible-jitter threshold established in Share#1631.
82
+ * Used to validate an adopted preview coordination frame against the
83
+ * durable walk's first geometry (Share#1634).
84
+ */
85
+ export declare const LARGE_COORDINATE_BUDGET_M = 10000;
74
86
  //# sourceMappingURL=coordination_f64.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coordination_f64.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/coordination_f64.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAiDH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAkBxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,EACxC,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,EAC/B,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAC/B,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,EAC/B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,EACxC,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAerC"}
1
+ {"version":3,"file":"coordination_f64.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/coordination_f64.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAiDH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAkBxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,EACxC,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,EAC/B,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAC/B,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,EAC/B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,EACxC,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAerC;AAGD,eAAO,MAAM,aAAa,KAAK,CAAA;AAC/B,eAAO,MAAM,aAAa,KAAK,CAAA;AAC/B,eAAO,MAAM,aAAa,KAAK,CAAA;AAE/B;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,QAAM,CAAA"}
@@ -151,3 +151,16 @@ export function composeTransformF64(coordination, placement, geomCenter) {
151
151
  }
152
152
  return out;
153
153
  }
154
+ // Column-major mat4 translation component indices.
155
+ export const TRANSLATION_X = 12;
156
+ export const TRANSLATION_Y = 13;
157
+ export const TRANSLATION_Z = 14;
158
+ /**
159
+ * Placement-magnitude budget (metres) above which a coordination frame
160
+ * has failed to recentre a model: float32 (the GPU vertex format and
161
+ * BatchedMesh matrix texture) quantizes at ~1mm per 1e4 m of
162
+ * coordinate, the visible-jitter threshold established in Share#1631.
163
+ * Used to validate an adopted preview coordination frame against the
164
+ * durable walk's first geometry (Share#1634).
165
+ */
166
+ export const LARGE_COORDINATE_BUDGET_M = 1e4;
@@ -336,6 +336,19 @@ export declare class IfcAPI {
336
336
  * @return {Array<number>}
337
337
  */
338
338
  GetCoordinationMatrix(modelID: number): Array<number>;
339
+ /**
340
+ * Conway extension: the coordination frame the open ACTUALLY applied
341
+ * to emitted placements (the COORDINATE_TO_ORIGIN recenter), identity
342
+ * when none ran. GetCoordinationMatrix keeps its classic identity
343
+ * contract (consumers stamp it onto assembled models); this is the
344
+ * explicit report of the real offset so embedders can map rendered
345
+ * points back to source-world coordinates (Share#1634 acceptance).
346
+ * Feature-detect: typeof api.GetAppliedCoordinationMatrix.
347
+ *
348
+ * @param modelID
349
+ * @return {Array<number>} column-major mat4
350
+ */
351
+ GetAppliedCoordinationMatrix(modelID: number): Array<number>;
339
352
  /**
340
353
  *
341
354
  * @param ptr
@@ -1 +1 @@
1
- {"version":3,"file":"ifc_api.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ifc_api.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api.ts"],"names":[],"mappings":"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"}
@@ -504,6 +504,25 @@ export class IfcAPI {
504
504
  const coordinationMatrix = glmatrix.mat4.create();
505
505
  return Array.from(coordinationMatrix);
506
506
  }
507
+ /**
508
+ * Conway extension: the coordination frame the open ACTUALLY applied
509
+ * to emitted placements (the COORDINATE_TO_ORIGIN recenter), identity
510
+ * when none ran. GetCoordinationMatrix keeps its classic identity
511
+ * contract (consumers stamp it onto assembled models); this is the
512
+ * explicit report of the real offset so embedders can map rendered
513
+ * points back to source-world coordinates (Share#1634 acceptance).
514
+ * Feature-detect: typeof api.GetAppliedCoordinationMatrix.
515
+ *
516
+ * @param modelID
517
+ * @return {Array<number>} column-major mat4
518
+ */
519
+ GetAppliedCoordinationMatrix(modelID) {
520
+ const result = this.models.get(modelID);
521
+ if (result !== void 0 && result.getAppliedCoordination !== void 0) {
522
+ return result.getAppliedCoordination();
523
+ }
524
+ return Array.from(glmatrix.mat4.create());
525
+ }
507
526
  /**
508
527
  *
509
528
  * @param ptr
@@ -21,6 +21,15 @@ export interface IfcApiModelPassthrough {
21
21
  remaining: number;
22
22
  };
23
23
  getCoordinationMatrix(): number[];
24
+ /**
25
+ * Optional: the coordination frame the open ACTUALLY applied to
26
+ * emitted placements (COORDINATE_TO_ORIGIN recenter). Unlike
27
+ * getCoordinationMatrix — whose classic identity contract consumers
28
+ * stamp onto assembled models — this reports the real offset, so
29
+ * embedders can map rendered points back to source-world coordinates
30
+ * (Share#1634 acceptance).
31
+ */
32
+ getAppliedCoordination?(): number[];
24
33
  getAllLines(): Vector<number>;
25
34
  getLineIDsWithType(type: number): Vector<number>;
26
35
  getRawLineData(expressID: number): RawLineData;
@@ -1 +1 @@
1
- {"version":3,"file":"ifc_api_model_passthrough.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_model_passthrough.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAGhE,MAAM,WAAW,sBAAsB;IAErC,UAAU,EAAE,qBAAqB,CAAA;IAEjC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAA;IACxC,eAAe,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;IACnC,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAA;IACvF,eAAe,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAA;IAC7D;;;OAGG;IACH;gEAC4D;IAC5D,eAAe,CAAC,IAAI,OAAO,CAAA;IAE3B,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAE5B,oBAAoB,CAAC,CACnB,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,CAAA;IAClF,qBAAqB,IAAI,MAAM,EAAE,CAAA;IACjC,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;IAC7B,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAChD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAA;IAC9C,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAA;IAC5B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAC5D,WAAW,CAAC,iBAAiB,EAAE,MAAM,GAAG,WAAW,CAAA;IAEnD;;;OAGG;IACH,kBAAkB,CAAC,IAAI,IAAI,CAAA;IAE3B;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAEnC;;;OAGG;IACH,0BAA0B,CAAC,CACzB,KAAK,EAAE,qBAAqB,EAC5B,UAAU,CAAC,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,MAAM,GAAI,IAAI,CAAA;IAEpC;;;OAGG;IACH,kBAAkB,CAAC,CAAE,SAAS,EAAE,MAAM,GAAI,OAAO,CAAE,IAAI,CAAE,CAAA;IAEzD;;;;;OAKG;IACH,cAAc,CAAC,IAAI,gBAAgB,CAAE,MAAM,CAAE,CAAA;CAC9C"}
1
+ {"version":3,"file":"ifc_api_model_passthrough.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_model_passthrough.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAGhE,MAAM,WAAW,sBAAsB;IAErC,UAAU,EAAE,qBAAqB,CAAA;IAEjC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAA;IACxC,eAAe,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;IACnC,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAA;IACvF,eAAe,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAA;IAC7D;;;OAGG;IACH;gEAC4D;IAC5D,eAAe,CAAC,IAAI,OAAO,CAAA;IAE3B,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAE5B,oBAAoB,CAAC,CACnB,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,CAAA;IAClF,qBAAqB,IAAI,MAAM,EAAE,CAAA;IAEjC;;;;;;;OAOG;IACH,sBAAsB,CAAC,IAAI,MAAM,EAAE,CAAA;IACnC,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;IAC7B,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAChD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAA;IAC9C,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAA;IAC5B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAC5D,WAAW,CAAC,iBAAiB,EAAE,MAAM,GAAG,WAAW,CAAA;IAEnD;;;OAGG;IACH,kBAAkB,CAAC,IAAI,IAAI,CAAA;IAE3B;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAEnC;;;OAGG;IACH,0BAA0B,CAAC,CACzB,KAAK,EAAE,qBAAqB,EAC5B,UAAU,CAAC,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,MAAM,GAAI,IAAI,CAAA;IAEpC;;;OAGG;IACH,kBAAkB,CAAC,CAAE,SAAS,EAAE,MAAM,GAAI,OAAO,CAAE,IAAI,CAAE,CAAA;IAEzD;;;;;OAKG;IACH,cAAc,CAAC,IAAI,gBAAgB,CAAE,MAAM,CAAE,CAAA;CAC9C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ifc_api_preview_coordination.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifc_api_preview_coordination.test.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_preview_coordination.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,124 @@
1
+ /* eslint-disable no-magic-numbers, dot-notation */
2
+ // Adopted preview-channel coordination frames must be validated against
3
+ // the durable walk's first geometry (Share#1634): a model can carry
4
+ // geometry in more than one frame, so a preview anchored on a
5
+ // local-scale unit hands the deferred pump a ~identity frame and the
6
+ // georeferenced body streams out raw. The deferred pump now re-derives
7
+ // from its own first geometry when the adopted frame leaves it beyond
8
+ // the large-coordinate budget.
9
+ //
10
+ // The adoption is injected directly (tiny fixtures parse in one tick,
11
+ // so the parse-time preview channel never fires on them); the injected
12
+ // identity frame is exactly what a wrong-frame preview anchor produces.
13
+ import * as fs from "fs";
14
+ import { beforeAll, describe, expect, test } from "@jest/globals";
15
+ import { LARGE_COORDINATE_BUDGET_M } from "./coordination_f64.js";
16
+ import { IfcAPI } from "./ifc_api.js";
17
+ const SETTINGS = {
18
+ COORDINATE_TO_ORIGIN: true,
19
+ USE_FAST_BOOLS: true,
20
+ DEFER_GEOMETRY: true,
21
+ };
22
+ const IDENTITY = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
23
+ let api;
24
+ let georeferenced;
25
+ let local;
26
+ /**
27
+ * Pump a deferred model to completion and collect every placement
28
+ * translation.
29
+ *
30
+ * @param modelID The deferred model.
31
+ * @return {number[][]} One [x, y, z] per placed geometry.
32
+ */
33
+ function pumpTranslations(modelID) {
34
+ const translations = [];
35
+ for (;;) {
36
+ const batch = [];
37
+ const { extracted, remaining } = api.ExtractGeometryBatch(modelID, 4, (mesh) => batch.push(mesh));
38
+ for (const mesh of batch) {
39
+ for (let where = 0; where < mesh.geometries.size(); ++where) {
40
+ const placed = mesh.geometries.get(where);
41
+ translations.push([
42
+ placed.flatTransformation[12],
43
+ placed.flatTransformation[13],
44
+ placed.flatTransformation[14],
45
+ ]);
46
+ }
47
+ }
48
+ if (remaining === 0 || extracted === 0) {
49
+ break;
50
+ }
51
+ }
52
+ return translations;
53
+ }
54
+ /**
55
+ * @param translations Placement translations.
56
+ * @return {number} Largest absolute component.
57
+ */
58
+ function maxComponent(translations) {
59
+ return translations.reduce((max, t) => Math.max(max, ...t.map(Math.abs)), 0);
60
+ }
61
+ /**
62
+ * Simulate a preview channel that anchored in the wrong frame: adopt an
63
+ * identity coordination exactly the way createDeferred does.
64
+ *
65
+ * @param modelID The deferred model.
66
+ */
67
+ function injectIdentityPreviewFrame(modelID) {
68
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
+ const proxy = api.models.get(modelID);
70
+ expect(proxy).toBeDefined();
71
+ proxy["demandCoordination_"] = [...IDENTITY];
72
+ proxy["_isCoordinated"] = true;
73
+ proxy["demandCoordinationFromPreview_"] = true;
74
+ }
75
+ beforeAll(async () => {
76
+ api = new IfcAPI();
77
+ await api.Init();
78
+ georeferenced = new Uint8Array(fs.readFileSync("data/index_georeferenced.ifc"));
79
+ local = new Uint8Array(fs.readFileSync("data/index.ifc"));
80
+ }, 120000);
81
+ describe("deferred pump preview-frame validation (Share#1634)", () => {
82
+ test("wrong-frame adopted coordination is re-derived on a georeferenced model", async () => {
83
+ // Control: no preview involvement — the pump derives its own frame.
84
+ const controlID = await api.OpenModelStreamed(georeferenced, { ...SETTINGS });
85
+ const control = pumpTranslations(controlID);
86
+ expect(control.length).toBeGreaterThan(0);
87
+ expect(maxComponent(control)).toBeLessThan(LARGE_COORDINATE_BUDGET_M);
88
+ // Explicit applied-frame report (Share#1634 acceptance): the real
89
+ // recenter offset — while GetCoordinationMatrix keeps its classic
90
+ // identity contract for assembled-model stamping.
91
+ const applied = api.GetAppliedCoordinationMatrix(controlID);
92
+ expect(Math.max(...applied.map(Math.abs)))
93
+ .toBeGreaterThan(LARGE_COORDINATE_BUDGET_M);
94
+ expect(api.GetCoordinationMatrix(controlID)).toEqual(IDENTITY);
95
+ // Adopting an identity frame (wrong-frame preview anchor) must not
96
+ // leave the body raw: the first durable geometry fails the budget
97
+ // check and the frame re-derives.
98
+ const adoptedID = await api.OpenModelStreamed(georeferenced, { ...SETTINGS });
99
+ injectIdentityPreviewFrame(adoptedID);
100
+ const adopted = pumpTranslations(adoptedID);
101
+ expect(adopted.length).toEqual(control.length);
102
+ expect(maxComponent(adopted)).toBeLessThan(LARGE_COORDINATE_BUDGET_M);
103
+ for (let where = 0; where < control.length; ++where) {
104
+ expect(adopted[where][0]).toBeCloseTo(control[where][0], 6);
105
+ expect(adopted[where][1]).toBeCloseTo(control[where][1], 6);
106
+ expect(adopted[where][2]).toBeCloseTo(control[where][2], 6);
107
+ }
108
+ }, 120000);
109
+ test("a within-budget adopted frame is kept (no false-positive re-derive)", async () => {
110
+ // On a local-scale model an identity frame is a VALID preview
111
+ // frame — validation must keep it, preserving preview/durable
112
+ // agreement, rather than re-deriving to the first-geometry anchor.
113
+ const adoptedID = await api.OpenModelStreamed(local, { ...SETTINGS });
114
+ injectIdentityPreviewFrame(adoptedID);
115
+ const adopted = pumpTranslations(adoptedID);
116
+ expect(adopted.length).toBeGreaterThan(0);
117
+ expect(maxComponent(adopted)).toBeLessThan(LARGE_COORDINATE_BUDGET_M);
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ const proxy = api.models.get(adoptedID);
120
+ // Frame survived untouched: still exactly the injected identity.
121
+ expect([...proxy["demandCoordination_"]]).toEqual(IDENTITY);
122
+ expect(proxy["demandCoordinationFromPreview_"]).toBe(false);
123
+ }, 120000);
124
+ });