@bldrs-ai/conway 1.536.1507 → 1.538.1511

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 (28) hide show
  1. package/compiled/examples/browser-bundled.cjs +1 -1
  2. package/compiled/examples/cli-bundled.cjs +109 -16
  3. package/compiled/examples/cli-step-bundled.cjs +1 -1
  4. package/compiled/examples/validator-bundled.cjs +1 -1
  5. package/compiled/src/compat/web-ifc/geometry_shard_coordination.test.d.ts +2 -0
  6. package/compiled/src/compat/web-ifc/geometry_shard_coordination.test.d.ts.map +1 -0
  7. package/compiled/src/compat/web-ifc/geometry_shard_coordination.test.js +236 -0
  8. package/compiled/src/compat/web-ifc/ifc_api.d.ts +26 -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 +33 -0
  11. package/compiled/src/compat/web-ifc/ifc_api_model_passthrough.d.ts +6 -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_proxy_ifc.d.ts +116 -5
  14. package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts.map +1 -1
  15. package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.js +256 -85
  16. package/compiled/src/ifc/geometry_dispatch.d.ts +74 -3
  17. package/compiled/src/ifc/geometry_dispatch.d.ts.map +1 -1
  18. package/compiled/src/ifc/geometry_dispatch.js +261 -5
  19. package/compiled/src/ifc/geometry_dispatch.test.js +147 -1
  20. package/compiled/src/ifc/ifc_geometry_extraction.d.ts +48 -0
  21. package/compiled/src/ifc/ifc_geometry_extraction.d.ts.map +1 -1
  22. package/compiled/src/ifc/ifc_geometry_extraction.js +124 -20
  23. package/compiled/src/index.d.ts +1 -1
  24. package/compiled/src/index.d.ts.map +1 -1
  25. package/compiled/src/index.js +1 -1
  26. package/compiled/src/version/version.js +1 -1
  27. package/compiled/tsconfig.tsbuildinfo +1 -1
  28. 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.536.1507";
33
+ var versionString = "Conway v1.538.1511";
34
34
 
35
35
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
36
36
  var wasmType = "";
@@ -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.536.1507";
14968
+ var versionString = "Conway v1.538.1511";
14969
14969
 
14970
14970
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
14971
14971
  function pThreadsAllowed() {
@@ -89228,6 +89228,7 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
89228
89228
  this.deferDanglingPlacements = false;
89229
89229
  this.freeVectorPolygonalFaces_ = [];
89230
89230
  this.extractionMapsPrepared_ = false;
89231
+ this.aggregateTargetsPaged_ = false;
89231
89232
  this.csgMemoization = !this.lowMemoryMode;
89232
89233
  this.quietRecoverableLogging = false;
89233
89234
  this.materials = model.materials;
@@ -93440,27 +93441,118 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
93440
93441
  const targets = /* @__PURE__ */ new Set();
93441
93442
  const productTypes = new Set(IfcProduct.query);
93442
93443
  for (const relAggregate of this.model.types(IfcRelAggregates)) {
93444
+ this.addAggregateTargets_(relAggregate, targets, productTypes);
93445
+ }
93446
+ this.aggregateTargetLocalIDs_ = targets;
93447
+ return targets;
93448
+ }
93449
+ /**
93450
+ * Windowed twin of {@link aggregateTargetLocalIDs}: page each
93451
+ * relationship record before scanning it, so the set is COMPLETE rather
93452
+ * than whatever this instance's LRU happened to still hold.
93453
+ *
93454
+ * **This is a correctness fix, not a prefetch.** The sync walk reads each
93455
+ * `IfcRelAggregates` record's bytes, and on a windowed source those pages
93456
+ * are routinely gone by the first pump — the parse walked past them
93457
+ * hundreds of megabytes ago. The per-record catch then swallows the
93458
+ * non-resident read, the incomplete set is **cached for the model's
93459
+ * life**, and every child it failed to record stays in the per-product
93460
+ * worklist *as well as* in the aggregates pass. That product is then
93461
+ * emitted twice: once with the uncut/placeholder content the deferral
93462
+ * exists to suppress, and again from the aggregates pass. Measured on
93463
+ * `aggregate_master_voids.ifc` behind 512-byte windows: 0 targets against
93464
+ * a resident open's 1, and 3 demand products against 2.
93465
+ *
93466
+ * Paged in bounded waves, and the scan happens INSIDE each wave rather
93467
+ * than after all of them: a model with many assemblies would otherwise
93468
+ * need every relationship record resident at once, which is the residency
93469
+ * ceiling this is supposed to respect.
93470
+ *
93471
+ * A non-resident read still throws from here — after this has paged the
93472
+ * record, that is a defect in the paging, not a property of the file.
93473
+ *
93474
+ * @param waveSize Relationship records paged and scanned at once.
93475
+ * @return {Promise<Set<number>>} The same set the sync twin caches.
93476
+ */
93477
+ async ensureAggregateTargetLocalIDs(waveSize = _IfcGeometryExtraction.AGGREGATE_TARGET_WAVE_SIZE_) {
93478
+ if (!this.model.isSourceExternal) {
93479
+ return this.aggregateTargetLocalIDs();
93480
+ }
93481
+ if (this.aggregateTargetsPaged_) {
93482
+ return this.aggregateTargetLocalIDs_;
93483
+ }
93484
+ const targets = /* @__PURE__ */ new Set();
93485
+ const productTypes = new Set(IfcProduct.query);
93486
+ const wave = Math.max(1, Math.floor(waveSize));
93487
+ let pending = [];
93488
+ const drain = async () => {
93489
+ const pinned = /* @__PURE__ */ new Set();
93443
93490
  try {
93444
- relAggregate.forEachReferenceInField(REL_AGGREGATES_RELATED_OFFSET, REL_AGGREGATES_RELATED_BASE, REL_AGGREGATES_RELATED_DEPTH, (expressID) => {
93445
- if (expressID === void 0) {
93446
- return true;
93447
- }
93448
- const relatedLocalID = this.model.resolveExpressID(expressID);
93449
- if (relatedLocalID === void 0) {
93450
- return true;
93451
- }
93452
- const typeID = this.model.typeIDOf(relatedLocalID);
93453
- if (typeID !== void 0 && productTypes.has(typeID)) {
93454
- targets.add(relatedLocalID);
93455
- }
93456
- return true;
93457
- });
93458
- } catch {
93491
+ for (const relAggregate of pending) {
93492
+ pinned.add(relAggregate.localID);
93493
+ this.model.pinByLocalID(relAggregate.localID);
93494
+ }
93495
+ await Promise.all([...pinned].map((localID) => this.model.ensureResidentByLocalID(localID)));
93496
+ for (const relAggregate of pending) {
93497
+ this.addAggregateTargets_(relAggregate, targets, productTypes, true);
93498
+ }
93499
+ } finally {
93500
+ this.model.releaseSourceViews(pinned);
93501
+ this.model.unpinLocalIDs(pinned);
93502
+ pending = [];
93503
+ }
93504
+ };
93505
+ for (const relAggregate of this.model.types(IfcRelAggregates)) {
93506
+ pending.push(relAggregate);
93507
+ if (pending.length >= wave) {
93508
+ await drain();
93459
93509
  }
93460
93510
  }
93511
+ if (pending.length > 0) {
93512
+ await drain();
93513
+ }
93461
93514
  this.aggregateTargetLocalIDs_ = targets;
93515
+ this.aggregateTargetsPaged_ = true;
93462
93516
  return targets;
93463
93517
  }
93518
+ /**
93519
+ * Record one relationship's product children.
93520
+ *
93521
+ * Shared by the sync and paged walks so there is a single definition of
93522
+ * what an aggregate target is. Reads only this relationship's own record:
93523
+ * children resolve through the express map and the typeID column, so the
93524
+ * scan never hydrates a child product (doing so paged most of the file
93525
+ * during demand prep).
93526
+ *
93527
+ * @param relAggregate The relationship to scan.
93528
+ * @param targets Accumulator.
93529
+ * @param productTypes The IfcProduct type set.
93530
+ * @param strictResidency When set, a non-resident read propagates instead
93531
+ * of being tolerated — for the paged walk, which has already made the
93532
+ * record resident and so can only reach that error through a defect.
93533
+ */
93534
+ addAggregateTargets_(relAggregate, targets, productTypes, strictResidency = false) {
93535
+ try {
93536
+ relAggregate.forEachReferenceInField(REL_AGGREGATES_RELATED_OFFSET, REL_AGGREGATES_RELATED_BASE, REL_AGGREGATES_RELATED_DEPTH, (expressID) => {
93537
+ if (expressID === void 0) {
93538
+ return true;
93539
+ }
93540
+ const relatedLocalID = this.model.resolveExpressID(expressID);
93541
+ if (relatedLocalID === void 0) {
93542
+ return true;
93543
+ }
93544
+ const typeID = this.model.typeIDOf(relatedLocalID);
93545
+ if (typeID !== void 0 && productTypes.has(typeID)) {
93546
+ targets.add(relatedLocalID);
93547
+ }
93548
+ return true;
93549
+ });
93550
+ } catch (error) {
93551
+ if (strictResidency && error instanceof StepBufferNotResidentError) {
93552
+ throw error;
93553
+ }
93554
+ }
93555
+ }
93464
93556
  /**
93465
93557
  * One-time extraction setup shared by the whole-model walk and the
93466
93558
  * per-product demand path (Phase B2): linear scaling factor and the
@@ -94084,6 +94176,7 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
94084
94176
  }
94085
94177
  }
94086
94178
  };
94179
+ IfcGeometryExtraction.AGGREGATE_TARGET_WAVE_SIZE_ = 512;
94087
94180
 
94088
94181
  // compiled/src/ifc/ifc_property_extraction.js
94089
94182
  var PropertyExtractResult;
@@ -15943,7 +15943,7 @@ var ParsingBuffer = class {
15943
15943
  };
15944
15944
 
15945
15945
  // compiled/src/version/version.js
15946
- var versionString = "Conway v1.536.1507";
15946
+ var versionString = "Conway v1.538.1511";
15947
15947
 
15948
15948
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
15949
15949
  function pThreadsAllowed() {
@@ -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.536.1507";
947
+ var versionString = "Conway v1.538.1511";
948
948
 
949
949
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
950
950
  var wasmType = "";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=geometry_shard_coordination.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry_shard_coordination.test.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/geometry_shard_coordination.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,236 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ // A sharded model that recentres — the second of M3's two shard blockers.
3
+ //
4
+ // COORDINATE_TO_ORIGIN derives its anchor from the FIRST geometry an instance
5
+ // captures, so N workers starting on different products derive N frames and
6
+ // reassemble a model shifted between shards. SetCoordinationFrame makes the
7
+ // frame an input instead, so every worker applies the same one.
8
+ //
9
+ // The fixture is georeferenced (~1.6e6, ~8.2e6 m) AND spans several recentre
10
+ // cells, both on purpose, because a weaker one makes these tests unable to
11
+ // fail. Every other IFC fixture in `data/` sits at the origin, where a
12
+ // derived frame and a wrong one both compose to roughly zero. And a
13
+ // georeferenced model inside ONE cell is barely better: recentring snaps to a
14
+ // 1 km grid (COORDINATION_SNAP_M), so shards whose first products sit 80 m
15
+ // apart quantize to the same frame and agree by accident. Spreading the
16
+ // products across cells is what makes a per-shard anchor observable — which
17
+ // is exactly the condition the original refusal named.
18
+ import * as fs from "fs";
19
+ import { beforeAll, describe, expect, test } from "@jest/globals";
20
+ import { InMemoryStepByteStore } from "../../step/step_buffer_provider.js";
21
+ import { COORDINATION_SNAP_M } from "./coordination_f64.js";
22
+ import { IfcAPI } from "./ifc_api.js";
23
+ const DEFERRED_RECENTRED = {
24
+ COORDINATE_TO_ORIGIN: true,
25
+ USE_FAST_BOOLS: true,
26
+ DEFER_GEOMETRY: true,
27
+ };
28
+ /* A frame no derivation would produce for this model: the Z-up -> Y-up
29
+ * normalize with a kilometre bolted on where the georeference belongs. Used
30
+ * only to show that a supplied frame is not quietly ignored. */
31
+ const ARBITRARY_FRAME = [
32
+ 1,
33
+ 0,
34
+ 0,
35
+ 0,
36
+ 0,
37
+ 0,
38
+ -1,
39
+ 0,
40
+ 0,
41
+ 1,
42
+ 0,
43
+ 0,
44
+ 1000,
45
+ 2000,
46
+ 3000,
47
+ 1,
48
+ ];
49
+ let fixture;
50
+ beforeAll(() => {
51
+ fixture = new Uint8Array(fs.readFileSync("data/index_georeferenced_multicell.ifc"));
52
+ });
53
+ /**
54
+ * One model, on its own engine instance, opened the way Share opens —
55
+ * store-backed, windowed, deferred, recentred.
56
+ *
57
+ * A fresh IfcAPI per model rather than one shared across the file: reusing an
58
+ * instance for a second deferred model returns garbage native transforms
59
+ * today, which flush to zero and collapse every placement onto the origin
60
+ * (conway#537 — reproduces on main, unrelated to this change). These tests
61
+ * compare placement sets between models, so a shared instance would compare
62
+ * two sets of zeros and pass no matter what this code did.
63
+ *
64
+ * @return {Promise<object>} An initialised API and its open model.
65
+ */
66
+ async function openIsolated() {
67
+ const api = new IfcAPI();
68
+ await api.Init();
69
+ const modelID = await api.OpenModelStream(new InMemoryStepByteStore(fixture), DEFERRED_RECENTRED);
70
+ return { api, modelID };
71
+ }
72
+ /**
73
+ * Drain a model's pump, keyed by express ID.
74
+ *
75
+ * @param api The model's engine.
76
+ * @param modelID An open deferred model.
77
+ * @return {Promise<Map>} expressID -> each placement's flat transform.
78
+ */
79
+ async function pumpPlacements(api, modelID) {
80
+ const placements = new Map();
81
+ for (;;) {
82
+ const { extracted, remaining } = await api.ExtractGeometryBatchAsync(modelID, 8, (mesh) => {
83
+ const transforms = placements.get(mesh.expressID) ?? [];
84
+ for (let where = 0; where < mesh.geometries.size(); ++where) {
85
+ transforms.push(Array.from(mesh.geometries.get(where).flatTransformation));
86
+ }
87
+ placements.set(mesh.expressID, transforms);
88
+ });
89
+ if (remaining === 0 && extracted === 0) {
90
+ break;
91
+ }
92
+ }
93
+ return placements;
94
+ }
95
+ /**
96
+ * The frame a single unsharded instance derives for the fixture, plus the
97
+ * placements it produces — the reference every case below is measured
98
+ * against, and what a real coordinator would hand its pool.
99
+ *
100
+ * @return {Promise<object>} The derived frame and its placements.
101
+ */
102
+ async function deriveReference() {
103
+ const { api, modelID } = await openIsolated();
104
+ const placements = await pumpPlacements(api, modelID);
105
+ const frame = api.GetAppliedCoordinationMatrix(modelID);
106
+ // Both fixture properties the tests below depend on, checked rather than
107
+ // trusted — an edit to the fixture that quietly lost either would otherwise
108
+ // leave these tests passing while measuring nothing.
109
+ //
110
+ // It recentres at all:
111
+ expect(Math.abs(frame[12]) + Math.abs(frame[14]))
112
+ .toBeGreaterThan(COORDINATION_SNAP_M);
113
+ // ...and it spans more than one recentre cell, so shards that derived their
114
+ // own anchors would land on DIFFERENT frames rather than agreeing by
115
+ // quantization.
116
+ const spans = [...placements.values()].flat().map((each) => each[12]);
117
+ expect(Math.max(...spans) - Math.min(...spans))
118
+ .toBeGreaterThan(COORDINATION_SNAP_M);
119
+ expect(placements.size).toBeGreaterThan(1);
120
+ api.CloseModel(modelID);
121
+ return { frame, placements };
122
+ }
123
+ describe("SetCoordinationFrame", () => {
124
+ test("is what lets a recentred model be sharded at all", async () => {
125
+ // The refusal that blocked Share specifically: its opens set
126
+ // COORDINATE_TO_ORIGIN, so before this seam existed no Share-shaped open
127
+ // could claim a shard, on any source.
128
+ const { api, modelID } = await openIsolated();
129
+ expect(() => api.SetGeometryShard(modelID, { index: 0, count: 4 }))
130
+ .toThrow(/SetCoordinationFrame/);
131
+ expect(api.SetCoordinationFrame(modelID, ARBITRARY_FRAME)).toBe(true);
132
+ expect(() => api.SetGeometryShard(modelID, { index: 0, count: 4 }))
133
+ .not.toThrow();
134
+ // The pump re-checks the same preconditions from scratch (the settings
135
+ // object belongs to the caller and can change under it), so lifting the
136
+ // claim-time refusal alone would still refuse at the first batch.
137
+ await expect(api.ExtractGeometryBatchAsync(modelID, 4))
138
+ .resolves.toBeDefined();
139
+ api.CloseModel(modelID);
140
+ }, 240000);
141
+ test("applies the frame it is given, exactly", async () => {
142
+ // The coordinator's real workflow: derive once, hand the frame out.
143
+ // Supplying an instance the frame another instance derived must place
144
+ // identically to that instance — that is what makes N workers agree.
145
+ const reference = await deriveReference();
146
+ const supplied = await openIsolated();
147
+ supplied.api.SetCoordinationFrame(supplied.modelID, reference.frame);
148
+ const placements = await pumpPlacements(supplied.api, supplied.modelID);
149
+ expect(supplied.api.GetAppliedCoordinationMatrix(supplied.modelID))
150
+ .toEqual(reference.frame);
151
+ expect(placements.size).toBe(reference.placements.size);
152
+ for (const [expressID, transforms] of reference.placements) {
153
+ expect(placements.get(expressID)).toEqual(transforms);
154
+ }
155
+ supplied.api.CloseModel(supplied.modelID);
156
+ // And a DIFFERENT frame must move the model, or the equality above would
157
+ // hold just as well for an implementation that dropped the frame on the
158
+ // floor and derived its own.
159
+ const arbitrary = await openIsolated();
160
+ arbitrary.api.SetCoordinationFrame(arbitrary.modelID, ARBITRARY_FRAME);
161
+ const moved = await pumpPlacements(arbitrary.api, arbitrary.modelID);
162
+ for (const [expressID, transforms] of reference.placements) {
163
+ expect(moved.get(expressID)).not.toEqual(transforms);
164
+ }
165
+ arbitrary.api.CloseModel(arbitrary.modelID);
166
+ }, 240000);
167
+ test("shards under one frame union to exactly the single instance", async () => {
168
+ // M3's exit condition for this half: recentring ON, sharded, windowed
169
+ // — Share's own open settings — and the union is the whole model with
170
+ // nothing duplicated, dropped, or shifted between shards.
171
+ const reference = await deriveReference();
172
+ const shardCount = 3;
173
+ const union = new Map();
174
+ for (let index = 0; index < shardCount; ++index) {
175
+ const shard = await openIsolated();
176
+ shard.api.SetCoordinationFrame(shard.modelID, reference.frame);
177
+ shard.api.SetGeometryShard(shard.modelID, { index, count: shardCount });
178
+ for (const [expressID, transforms] of await pumpPlacements(shard.api, shard.modelID)) {
179
+ // A key already present means two shards claimed one product —
180
+ // the duplication half of a bad partition, which comparing
181
+ // merged sets at the end would hide.
182
+ expect(union.has(expressID)).toBe(false);
183
+ union.set(expressID, transforms);
184
+ }
185
+ shard.api.CloseModel(shard.modelID);
186
+ }
187
+ expect(union.size).toBe(reference.placements.size);
188
+ for (const [expressID, transforms] of reference.placements) {
189
+ expect(union.get(expressID)).toEqual(transforms);
190
+ }
191
+ }, 240000);
192
+ test("can be cleared, handing the model back to deriving", async () => {
193
+ // The undefined-matrix arm, which is the coordinator's way out: a pool
194
+ // that decides not to shard after all should not be stuck in a frame it
195
+ // supplied for shards that will never exist.
196
+ const { api, modelID } = await openIsolated();
197
+ api.SetCoordinationFrame(modelID, ARBITRARY_FRAME);
198
+ api.SetCoordinationFrame(modelID, void 0);
199
+ // The claim refusal is back, so the supplied-frame flag really cleared
200
+ // rather than merely the matrix.
201
+ expect(() => api.SetGeometryShard(modelID, { index: 0, count: 2 }))
202
+ .toThrow(/SetCoordinationFrame/);
203
+ await pumpPlacements(api, modelID);
204
+ // ...and the model derived its own frame, so the adopted one cleared too.
205
+ const derived = api.GetAppliedCoordinationMatrix(modelID);
206
+ expect(derived).not.toEqual(ARBITRARY_FRAME);
207
+ expect(Math.abs(derived[12]) + Math.abs(derived[14]))
208
+ .toBeGreaterThan(COORDINATION_SNAP_M);
209
+ api.CloseModel(modelID);
210
+ }, 240000);
211
+ test("refuses a frame it cannot honour", async () => {
212
+ const { api, modelID } = await openIsolated();
213
+ expect(() => api.SetCoordinationFrame(modelID, [1, 2, 3]))
214
+ .toThrow(/column-major mat4/);
215
+ expect(() => api.SetCoordinationFrame(modelID, [...ARBITRARY_FRAME.slice(0, 15), NaN]))
216
+ .toThrow(/column-major mat4/);
217
+ api.SetCoordinationFrame(modelID, ARBITRARY_FRAME);
218
+ await api.ExtractGeometryBatchAsync(modelID, 4);
219
+ // Too late: placements already emitted carry the frame in force when they
220
+ // were captured and are never re-placed, so a second frame would leave
221
+ // one model in two coordinate systems.
222
+ expect(() => api.SetCoordinationFrame(modelID, ARBITRARY_FRAME))
223
+ .toThrow(/before the first ExtractGeometryBatch/);
224
+ api.CloseModel(modelID);
225
+ }, 240000);
226
+ test("refuses on a classic open, which has already placed everything", async () => {
227
+ const api = new IfcAPI();
228
+ await api.Init();
229
+ const modelID = await api.OpenModelStream(new InMemoryStepByteStore(fixture), { COORDINATE_TO_ORIGIN: true, USE_FAST_BOOLS: true });
230
+ // Same shape as SetGeometryShard's DEFER_GEOMETRY refusal: a frame
231
+ // supplied now would be accepted and then ignored.
232
+ expect(() => api.SetCoordinationFrame(modelID, ARBITRARY_FRAME))
233
+ .toThrow(/DEFER_GEOMETRY/);
234
+ api.CloseModel(modelID);
235
+ }, 240000);
236
+ });
@@ -482,6 +482,10 @@ export declare class IfcAPI {
482
482
  * first ExtractGeometryBatch — after that the worklists exist and narrowing
483
483
  * them would drop products already reported as pending, so it throws.
484
484
  *
485
+ * **Order matters against {@link SetCoordinationFrame}.** A model opened
486
+ * with COORDINATE_TO_ORIGIN is refused here unless a frame has already
487
+ * been supplied, so supply the frame first. The refusal names it.
488
+ *
485
489
  * @param modelID handle from a DEFER_GEOMETRY open
486
490
  * @param shard `{index, count}`, or omitted for the whole model
487
491
  * @return {boolean} false for unknown models and for passthroughs with no
@@ -491,6 +495,28 @@ export declare class IfcAPI {
491
495
  index: number;
492
496
  count: number;
493
497
  }): boolean;
498
+ /**
499
+ * Conway extension (M3): supply the recentre frame a deferred model
500
+ * applies, instead of letting it derive one from its own first geometry.
501
+ *
502
+ * This is what makes COORDINATE_TO_ORIGIN and {@link SetGeometryShard}
503
+ * combinable. A derived frame is anchored on whichever product the
504
+ * instance extracts first, so N workers derive N frames and a model
505
+ * spanning more than one recentre cell reassembles with its shards offset
506
+ * by whole cells — individually plausible placements, a wrong picture.
507
+ * One frame handed to every worker removes the disagreement at the source.
508
+ *
509
+ * Typical use: the coordinator opens once (its parse-time preview channel
510
+ * derives a frame), reads it back with {@link GetAppliedCoordinationMatrix}, and
511
+ * passes it to every worker before their first batch.
512
+ *
513
+ * @param modelID handle from a DEFER_GEOMETRY open
514
+ * @param matrix column-major mat4 of 16 finite numbers, or omitted to drop
515
+ * a previously supplied frame
516
+ * @return {boolean} false for unknown models and for passthroughs with no
517
+ * deferred pump (AP214/STEP), which have no frame to supply
518
+ */
519
+ SetCoordinationFrame(modelID: number, matrix?: number[]): boolean;
494
520
  ExtractGeometryBatch(modelID: number, batchSize: number, meshCallback?: (mesh: FlatMesh) => void): {
495
521
  extracted: number;
496
522
  remaining: number;
@@ -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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"}
@@ -669,6 +669,10 @@ export class IfcAPI {
669
669
  * first ExtractGeometryBatch — after that the worklists exist and narrowing
670
670
  * them would drop products already reported as pending, so it throws.
671
671
  *
672
+ * **Order matters against {@link SetCoordinationFrame}.** A model opened
673
+ * with COORDINATE_TO_ORIGIN is refused here unless a frame has already
674
+ * been supplied, so supply the frame first. The refusal names it.
675
+ *
672
676
  * @param modelID handle from a DEFER_GEOMETRY open
673
677
  * @param shard `{index, count}`, or omitted for the whole model
674
678
  * @return {boolean} false for unknown models and for passthroughs with no
@@ -682,6 +686,35 @@ export class IfcAPI {
682
686
  result.setGeometryShard(shard);
683
687
  return true;
684
688
  }
689
+ /**
690
+ * Conway extension (M3): supply the recentre frame a deferred model
691
+ * applies, instead of letting it derive one from its own first geometry.
692
+ *
693
+ * This is what makes COORDINATE_TO_ORIGIN and {@link SetGeometryShard}
694
+ * combinable. A derived frame is anchored on whichever product the
695
+ * instance extracts first, so N workers derive N frames and a model
696
+ * spanning more than one recentre cell reassembles with its shards offset
697
+ * by whole cells — individually plausible placements, a wrong picture.
698
+ * One frame handed to every worker removes the disagreement at the source.
699
+ *
700
+ * Typical use: the coordinator opens once (its parse-time preview channel
701
+ * derives a frame), reads it back with {@link GetAppliedCoordinationMatrix}, and
702
+ * passes it to every worker before their first batch.
703
+ *
704
+ * @param modelID handle from a DEFER_GEOMETRY open
705
+ * @param matrix column-major mat4 of 16 finite numbers, or omitted to drop
706
+ * a previously supplied frame
707
+ * @return {boolean} false for unknown models and for passthroughs with no
708
+ * deferred pump (AP214/STEP), which have no frame to supply
709
+ */
710
+ SetCoordinationFrame(modelID, matrix) {
711
+ const result = this.models.get(modelID);
712
+ if (result?.setCoordinationFrame === void 0) {
713
+ return false;
714
+ }
715
+ result.setCoordinationFrame(matrix);
716
+ return true;
717
+ }
685
718
  ExtractGeometryBatch(modelID, batchSize, meshCallback) {
686
719
  const result = this.models.get(modelID);
687
720
  if (result?.extractGeometryBatch === void 0) {
@@ -25,6 +25,12 @@ export interface IfcApiModelPassthrough {
25
25
  index: number;
26
26
  count: number;
27
27
  }): void;
28
+ /**
29
+ * Supply the recentre frame instead of deriving one (conway extension,
30
+ * M3) — see IfcAPI.SetCoordinationFrame. Optional: passthroughs with no
31
+ * deferred pump (AP214/STEP) have no frame to supply.
32
+ */
33
+ setCoordinationFrame?(matrix?: number[]): void;
28
34
  /**
29
35
  * Set the resident-geometry budget in bytes (conway extension, M3) —
30
36
  * see IfcAPI.SetGeometryBudget. Optional so non-IFC passthroughs, whose
@@ -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":"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"}
1
+ {"version":3,"file":"ifc_api_model_passthrough.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_model_passthrough.ts"],"names":[],"mappings":"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"}