@bldrs-ai/conway 1.424.1275 → 1.425.1281

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.
@@ -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.424.1275";
33
+ var versionString = "Conway v1.425.1281";
34
34
 
35
35
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
36
36
  var wasmType = "";
@@ -70969,6 +70969,23 @@ var ColumnarIndexSink = class {
70969
70969
  this.expressIdsSorted_ = true;
70970
70970
  this.previousExpressID_ = 0;
70971
70971
  }
70972
+ /**
70973
+ * Snapshot the columns pushed SO FAR into a self-contained prefix index,
70974
+ * without disturbing the sink — the parse can keep pushing afterwards and
70975
+ * a later snapshot/finalize sees the full data. Safe to call between the
70976
+ * cooperative parse's yields (the parser only suspends at top-level
70977
+ * record boundaries, where the sink is consistent). Top-level localIDs
70978
+ * are stable across snapshots (dense parse order), so consumers can carry
70979
+ * per-localID cursors from one snapshot to the next; inline-range
70980
+ * localIDs are NOT stable (the inline tail re-packs after the growing
70981
+ * top-level range) and must not be carried across snapshots.
70982
+ *
70983
+ * @return {StepIndexColumns} A prefix columnar index over the records
70984
+ * pushed so far.
70985
+ */
70986
+ snapshot() {
70987
+ return this.assemble_();
70988
+ }
70972
70989
  /**
70973
70990
  * Assemble the final columns: concatenate the top-level segments (one
70974
70991
  * column at a time, bounding transient overhead to a single column's
@@ -70978,6 +70995,15 @@ var ColumnarIndexSink = class {
70978
70995
  * @return {StepIndexColumns} The finished columnar index.
70979
70996
  */
70980
70997
  finalize() {
70998
+ return this.assemble_();
70999
+ }
71000
+ /**
71001
+ * Shared assembly behind {@link snapshot} and {@link finalize} — pure
71002
+ * over the sink's current state.
71003
+ *
71004
+ * @return {StepIndexColumns} The assembled columnar index.
71005
+ */
71006
+ assemble_() {
70981
71007
  const topLevel = this.count_;
70982
71008
  const unfolded = [];
70983
71009
  for (const entry of this.retained_.values()) {
@@ -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.424.1275";
14968
+ var versionString = "Conway v1.425.1281";
14969
14969
 
14970
14970
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
14971
14971
  function pThreadsAllowed() {
@@ -86814,6 +86814,23 @@ var ColumnarIndexSink = class {
86814
86814
  this.expressIdsSorted_ = true;
86815
86815
  this.previousExpressID_ = 0;
86816
86816
  }
86817
+ /**
86818
+ * Snapshot the columns pushed SO FAR into a self-contained prefix index,
86819
+ * without disturbing the sink — the parse can keep pushing afterwards and
86820
+ * a later snapshot/finalize sees the full data. Safe to call between the
86821
+ * cooperative parse's yields (the parser only suspends at top-level
86822
+ * record boundaries, where the sink is consistent). Top-level localIDs
86823
+ * are stable across snapshots (dense parse order), so consumers can carry
86824
+ * per-localID cursors from one snapshot to the next; inline-range
86825
+ * localIDs are NOT stable (the inline tail re-packs after the growing
86826
+ * top-level range) and must not be carried across snapshots.
86827
+ *
86828
+ * @return {StepIndexColumns} A prefix columnar index over the records
86829
+ * pushed so far.
86830
+ */
86831
+ snapshot() {
86832
+ return this.assemble_();
86833
+ }
86817
86834
  /**
86818
86835
  * Assemble the final columns: concatenate the top-level segments (one
86819
86836
  * column at a time, bounding transient overhead to a single column's
@@ -86823,6 +86840,15 @@ var ColumnarIndexSink = class {
86823
86840
  * @return {StepIndexColumns} The finished columnar index.
86824
86841
  */
86825
86842
  finalize() {
86843
+ return this.assemble_();
86844
+ }
86845
+ /**
86846
+ * Shared assembly behind {@link snapshot} and {@link finalize} — pure
86847
+ * over the sink's current state.
86848
+ *
86849
+ * @return {StepIndexColumns} The assembled columnar index.
86850
+ */
86851
+ assemble_() {
86826
86852
  const topLevel = this.count_;
86827
86853
  const unfolded = [];
86828
86854
  for (const entry of this.retained_.values()) {
@@ -15943,7 +15943,7 @@ var ParsingBuffer = class {
15943
15943
  };
15944
15944
 
15945
15945
  // compiled/src/version/version.js
15946
- var versionString = "Conway v1.424.1275";
15946
+ var versionString = "Conway v1.425.1281";
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.424.1275";
947
+ var versionString = "Conway v1.425.1281";
948
948
 
949
949
  // compiled/dependencies/conway-geom/interface/conway_geometry.js
950
950
  var wasmType = "";
@@ -70967,6 +70967,23 @@ var ColumnarIndexSink = class {
70967
70967
  this.expressIdsSorted_ = true;
70968
70968
  this.previousExpressID_ = 0;
70969
70969
  }
70970
+ /**
70971
+ * Snapshot the columns pushed SO FAR into a self-contained prefix index,
70972
+ * without disturbing the sink — the parse can keep pushing afterwards and
70973
+ * a later snapshot/finalize sees the full data. Safe to call between the
70974
+ * cooperative parse's yields (the parser only suspends at top-level
70975
+ * record boundaries, where the sink is consistent). Top-level localIDs
70976
+ * are stable across snapshots (dense parse order), so consumers can carry
70977
+ * per-localID cursors from one snapshot to the next; inline-range
70978
+ * localIDs are NOT stable (the inline tail re-packs after the growing
70979
+ * top-level range) and must not be carried across snapshots.
70980
+ *
70981
+ * @return {StepIndexColumns} A prefix columnar index over the records
70982
+ * pushed so far.
70983
+ */
70984
+ snapshot() {
70985
+ return this.assemble_();
70986
+ }
70970
70987
  /**
70971
70988
  * Assemble the final columns: concatenate the top-level segments (one
70972
70989
  * column at a time, bounding transient overhead to a single column's
@@ -70976,6 +70993,15 @@ var ColumnarIndexSink = class {
70976
70993
  * @return {StepIndexColumns} The finished columnar index.
70977
70994
  */
70978
70995
  finalize() {
70996
+ return this.assemble_();
70997
+ }
70998
+ /**
70999
+ * Shared assembly behind {@link snapshot} and {@link finalize} — pure
71000
+ * over the sink's current state.
71001
+ *
71002
+ * @return {StepIndexColumns} The assembled columnar index.
71003
+ */
71004
+ assemble_() {
70979
71005
  const topLevel = this.count_;
70980
71006
  const unfolded = [];
70981
71007
  for (const entry of this.retained_.values()) {
@@ -5,6 +5,8 @@ import * as glmatrix from "gl-matrix";
5
5
  import { StepExternalByteStore } from "../../step/step_buffer_provider.js";
6
6
  import { IfcApiModelPassthrough } from "./ifc_api_model_passthrough.js";
7
7
  import { Properties } from "./properties.js";
8
+ import type { PreviewMeshPayload } from "./streamed_preview_channel.js";
9
+ export type { PreviewMeshPayload } from "./streamed_preview_channel.js";
8
10
  export * from "./ifc2x4.js";
9
11
  export declare const UNKNOWN = 0;
10
12
  export declare const STRING = 1;
@@ -47,6 +49,17 @@ export interface Loadersettings {
47
49
  * classic open paths and by the internal streamed→classic fallback.
48
50
  */
49
51
  DEFER_GEOMETRY?: boolean;
52
+ /**
53
+ * Conway extension (OpenModelStreamed + DEFER_GEOMETRY only; demand/tiled
54
+ * rendering slice A2): receive PREVIEW mesh payloads while the parse is
55
+ * still running — self-contained (geometry copied out of the wasm heap),
56
+ * so they can be uploaded before the model exists. Preview quality:
57
+ * relationship records (voids, materials) live near the end of real IFC
58
+ * files, so previews can miss openings/materials; the durable batch pump
59
+ * re-extracts every product after the parse and REPLACES the preview.
60
+ * Consumers must treat these as disposable. Ignored everywhere else.
61
+ */
62
+ ON_PREVIEW_MESH?: (mesh: PreviewMeshPayload) => void;
50
63
  }
51
64
  /**
52
65
  * web-ifc compatible log levels (numeric values match web-ifc's enum so an
@@ -359,6 +372,13 @@ export declare class IfcAPI {
359
372
  * `typeof api.ExtractGeometryBatch === 'function'`; call repeatedly
360
373
  * until `remaining` is 0.
361
374
  *
375
+ * DELTA CONTRACT: an entity may be emitted again in a LATER call with
376
+ * a FlatMesh containing only its NEW placed instances (shared/mapped
377
+ * geometry attributes instances to an entity from other products'
378
+ * extractions). Consumers must render/accumulate deltas additively —
379
+ * never key emissions by expressID with overwrite semantics. Each
380
+ * placed instance is emitted exactly once across all calls.
381
+ *
362
382
  * @param modelID handle retrieved by OpenModelStreamed
363
383
  * @param batchSize max products to extract this call
364
384
  * @param meshCallback receives each newly-extracted product's mesh
@@ -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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"}
@@ -555,6 +555,13 @@ export class IfcAPI {
555
555
  * `typeof api.ExtractGeometryBatch === 'function'`; call repeatedly
556
556
  * until `remaining` is 0.
557
557
  *
558
+ * DELTA CONTRACT: an entity may be emitted again in a LATER call with
559
+ * a FlatMesh containing only its NEW placed instances (shared/mapped
560
+ * geometry attributes instances to an entity from other products'
561
+ * extractions). Consumers must render/accumulate deltas additively —
562
+ * never key emissions by expressID with overwrite semantics. Each
563
+ * placed instance is emitted exactly once across all calls.
564
+ *
558
565
  * @param modelID handle retrieved by OpenModelStreamed
559
566
  * @param batchSize max products to extract this call
560
567
  * @param meshCallback receives each newly-extracted product's mesh
@@ -17,8 +17,8 @@ let buffer;
17
17
  * @param mesh The mesh.
18
18
  * @return {object} Plain comparable form.
19
19
  */
20
- function flatten(mesh) {
21
- const geometries = [];
20
+ function flatten(mesh, previous) {
21
+ const geometries = previous?.geometries ?? [];
22
22
  for (let where = 0; where < mesh.geometries.size(); ++where) {
23
23
  const placed = mesh.geometries.get(where);
24
24
  geometries.push({
@@ -44,19 +44,15 @@ describe("OpenModelStreamed + DEFER_GEOMETRY", () => {
44
44
  expect(classic.size).toBeGreaterThan(0);
45
45
  const deferredID = await api.OpenModelStreamed(buffer, { ...SETTINGS, DEFER_GEOMETRY: true });
46
46
  expect(deferredID).toBeGreaterThanOrEqual(0);
47
- // Nothing extracted yet: the scene walk yields no meshes.
48
- const before = [];
49
- api.StreamAllMeshes(deferredID, (mesh) => {
50
- before.push(mesh.expressID);
51
- });
52
- expect(before).toHaveLength(0);
53
47
  // Pump in deliberately small batches; collect incremental meshes.
48
+ // (Deltas: an entity may re-emit with only its NEW instances —
49
+ // `flatten` accumulation in the map below must be additive.)
54
50
  const streamed = new Map();
55
51
  let firstBatchCount = 0;
56
52
  let rounds = 0;
57
53
  for (;;) {
58
54
  const { extracted, remaining } = api.ExtractGeometryBatch(deferredID, 7, (mesh) => {
59
- streamed.set(mesh.expressID, flatten(mesh));
55
+ streamed.set(mesh.expressID, flatten(mesh, streamed.get(mesh.expressID)));
60
56
  });
61
57
  if (rounds === 0) {
62
58
  firstBatchCount = streamed.size;
@@ -77,6 +73,26 @@ describe("OpenModelStreamed + DEFER_GEOMETRY", () => {
77
73
  api.CloseModel(classicID);
78
74
  api.CloseModel(deferredID);
79
75
  }, 240000);
76
+ test("StreamAllMeshes on a deferred model drains the pump and matches classic", async () => {
77
+ const classicID = api.OpenModel(buffer, SETTINGS);
78
+ const classic = new Map();
79
+ api.StreamAllMeshes(classicID, (mesh) => {
80
+ classic.set(mesh.expressID, flatten(mesh));
81
+ });
82
+ const deferredID = await api.OpenModelStreamed(buffer, { ...SETTINGS, DEFER_GEOMETRY: true });
83
+ // No pump calls at all — the whole-model consumer must still get
84
+ // the complete mesh set (the shim drains internally).
85
+ const drained = new Map();
86
+ api.StreamAllMeshes(deferredID, (mesh) => {
87
+ drained.set(mesh.expressID, flatten(mesh));
88
+ });
89
+ expect(drained.size).toBe(classic.size);
90
+ for (const [expressID, mesh] of classic) {
91
+ expect(drained.get(expressID)).toEqual(mesh);
92
+ }
93
+ api.CloseModel(classicID);
94
+ api.CloseModel(deferredID);
95
+ }, 240000);
80
96
  test("ExtractGeometryBatch is a safe no-op on non-deferred models", async () => {
81
97
  const modelID = await api.OpenModelStreamed(buffer, SETTINGS);
82
98
  expect(api.ExtractGeometryBatch(modelID, 8))
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ifc_api_preview_channel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifc_api_preview_channel.test.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_preview_channel.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,185 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ // Parse-time preview channel (demand/tiled rendering slice A2): prefix
3
+ // snapshots of the live columnar sink must be exact prefixes of the final
4
+ // columns, and a full drain of the channel (prefix == whole file) must
5
+ // reproduce the classic StreamAllMeshes instance set — same entities,
6
+ // same geometry ids, same placed transforms — since the durable pump the
7
+ // preview hands over to is already pinned to classic parity.
8
+ import * as fs from "fs";
9
+ import { beforeAll, describe, expect, test } from "@jest/globals";
10
+ import { ConwayGeometry } from "../../../dependencies/conway-geom/index.js";
11
+ import IfcStepParser from "../../ifc/ifc_step_parser.js";
12
+ import { BufferByteSource } from "../../step/parsing/byte_source.js";
13
+ import { ColumnarIndexSink, } from "../../step/parsing/columnar_index.js";
14
+ import { ParseResult } from "../../step/parsing/step_parser.js";
15
+ import { buildIndexStreaming } from "../../step/parsing/streaming_index_builder.js";
16
+ import { IfcAPI } from "./ifc_api.js";
17
+ import { StreamedPreviewChannel, } from "./streamed_preview_channel.js";
18
+ const SETTINGS = { COORDINATE_TO_ORIGIN: true, USE_FAST_BOOLS: true };
19
+ const POOL = 1024 * 1024;
20
+ let api;
21
+ let conwayGeometry;
22
+ let data;
23
+ /**
24
+ * Parse index.ifc's data block into a fresh columnar sink.
25
+ *
26
+ * @param wrap Optional sink wrapper (snapshot triggers).
27
+ * @return {ColumnarIndexSink} The filled sink.
28
+ */
29
+ function buildSink(wrap) {
30
+ const sink = new ColumnarIndexSink();
31
+ const { result } = buildIndexStreaming(new BufferByteSource(data), IfcStepParser.Instance, POOL, void 0, wrap !== void 0 ? wrap(sink) : sink);
32
+ expect(result).toBe(ParseResult.COMPLETE);
33
+ return sink;
34
+ }
35
+ /**
36
+ * Classic reference: expressID -> list of placed instances.
37
+ *
38
+ * @param modelID An open classic model.
39
+ * @return {Map} expressID -> {geometryExpressID, flatTransformation}[].
40
+ */
41
+ function classicInstances(modelID) {
42
+ const instances = new Map();
43
+ api.StreamAllMeshes(modelID, (mesh) => {
44
+ const list = instances.get(mesh.expressID) ?? [];
45
+ for (let where = 0; where < mesh.geometries.size(); ++where) {
46
+ const placed = mesh.geometries.get(where);
47
+ list.push({
48
+ geometryExpressID: placed.geometryExpressID,
49
+ flatTransformation: [...placed.flatTransformation],
50
+ });
51
+ }
52
+ instances.set(mesh.expressID, list);
53
+ });
54
+ return instances;
55
+ }
56
+ beforeAll(async () => {
57
+ api = new IfcAPI();
58
+ await api.Init();
59
+ conwayGeometry = new ConwayGeometry();
60
+ expect(await conwayGeometry.initialize()).toBe(true);
61
+ data = new Uint8Array(fs.readFileSync("data/index.ifc"));
62
+ }, 120000);
63
+ describe("ColumnarIndexSink.snapshot", () => {
64
+ test("a mid-parse snapshot is an exact prefix of the final columns", () => {
65
+ const snapshotAt = 50;
66
+ let snapshot;
67
+ const sink = buildSink((inner) => ({
68
+ pushTopLevel: (entry) => {
69
+ inner.pushTopLevel(entry);
70
+ if (inner.topLevelCount === snapshotAt) {
71
+ snapshot = inner.snapshot();
72
+ }
73
+ },
74
+ reset: () => inner.reset(),
75
+ }));
76
+ const full = sink.finalize();
77
+ expect(snapshot).toBeDefined();
78
+ expect(snapshot.firstInlineElement).toBe(snapshotAt);
79
+ expect(full.firstInlineElement).toBeGreaterThan(snapshotAt);
80
+ for (let where = 0; where < snapshotAt; ++where) {
81
+ expect(snapshot.address[where]).toBe(full.address[where]);
82
+ expect(snapshot.length[where]).toBe(full.length[where]);
83
+ expect(snapshot.typeID[where]).toBe(full.typeID[where]);
84
+ expect(snapshot.expressID[where]).toBe(full.expressID[where]);
85
+ }
86
+ });
87
+ test("snapshotting does not disturb the sink (finalize sees everything)", () => {
88
+ const undisturbed = buildSink().finalize();
89
+ const snapshotted = buildSink((inner) => ({
90
+ pushTopLevel: (entry) => {
91
+ inner.pushTopLevel(entry);
92
+ // Snapshot aggressively — every 25 records.
93
+ if (inner.topLevelCount % 25 === 0) {
94
+ inner.snapshot();
95
+ }
96
+ },
97
+ reset: () => inner.reset(),
98
+ })).finalize();
99
+ expect(snapshotted.count).toBe(undisturbed.count);
100
+ expect(snapshotted.firstInlineElement).toBe(undisturbed.firstInlineElement);
101
+ expect([...snapshotted.address]).toEqual([...undisturbed.address]);
102
+ expect([...snapshotted.expressID]).toEqual([...undisturbed.expressID]);
103
+ });
104
+ });
105
+ describe("StreamedPreviewChannel", () => {
106
+ test("a full drain reproduces the classic instance set exactly", async () => {
107
+ const classicID = api.OpenModel(data, SETTINGS);
108
+ const classic = classicInstances(classicID);
109
+ let classicTotal = 0;
110
+ for (const list of classic.values()) {
111
+ classicTotal += list.length;
112
+ }
113
+ expect(classicTotal).toBeGreaterThan(0);
114
+ // Channel over a finished sink: the "prefix" is the whole file, so a
115
+ // drain must be a complete, classic-parity extraction.
116
+ const sink = buildSink();
117
+ const payloads = [];
118
+ const channel = new StreamedPreviewChannel(data, conwayGeometry, sink, true, (mesh) => payloads.push(mesh), void 0, void 0, 1);
119
+ channel.drainForTest();
120
+ expect(payloads.length).toBe(classicTotal);
121
+ // Every payload matches a classic instance of the same entity and
122
+ // geometry, with the same placed transform.
123
+ const unmatched = new Map();
124
+ for (const [expressID, list] of classic) {
125
+ unmatched.set(expressID, list.map((entry) => ({ ...entry })));
126
+ }
127
+ for (const payload of payloads) {
128
+ const candidates = unmatched.get(payload.expressID);
129
+ expect(candidates).toBeDefined();
130
+ const matchIndex = candidates.findIndex((candidate) => candidate.geometryExpressID === payload.geometryExpressID &&
131
+ candidate.flatTransformation.every((value, where) => Math.abs(value - payload.flatTransformation[where]) < 0.000001));
132
+ expect(matchIndex).toBeGreaterThanOrEqual(0);
133
+ candidates.splice(matchIndex, 1);
134
+ }
135
+ // Geometry payloads: exactly one carrier per distinct geometry, each
136
+ // carrying a sane interleaved buffer.
137
+ const carriers = payloads.filter((payload) => payload.vertexData !== void 0);
138
+ const distinctGeometry = new Set(payloads.map((p) => p.geometryExpressID));
139
+ expect(carriers.length).toBe(distinctGeometry.size);
140
+ for (const carrier of carriers) {
141
+ expect(carrier.vertexData.length % 6).toBe(0);
142
+ expect(carrier.vertexData.length).toBeGreaterThan(0);
143
+ expect(carrier.indexData.length % 3).toBe(0);
144
+ expect(carrier.indexData.length).toBeGreaterThan(0);
145
+ }
146
+ // The channel derived and pinned a coordination frame (proved
147
+ // equivalent to classic's by the transform parity above), and the
148
+ // deferred open must keep the classic GetCoordinationMatrix
149
+ // contract: identity, because placed transforms are premultiplied
150
+ // and consumers stamp the result onto assembled models — a
151
+ // non-identity return would coordinate twice.
152
+ expect(channel.coordinationMatrix).toBeDefined();
153
+ const deferredID = await api.OpenModelStreamed(data, { ...SETTINGS, DEFER_GEOMETRY: true });
154
+ api.StreamAllMeshes(deferredID, () => { });
155
+ const classicCoordination = api.GetCoordinationMatrix(classicID);
156
+ const deferredCoordination = api.GetCoordinationMatrix(deferredID);
157
+ expect(deferredCoordination).toEqual(classicCoordination);
158
+ api.CloseModel(classicID);
159
+ api.CloseModel(deferredID);
160
+ }, 240000);
161
+ test("ON_PREVIEW_MESH on a deferred streamed open never breaks the durable path", async () => {
162
+ const classicID = api.OpenModel(data, SETTINGS);
163
+ const classic = classicInstances(classicID);
164
+ const payloads = [];
165
+ const deferredID = await api.OpenModelStreamed(data, {
166
+ ...SETTINGS,
167
+ DEFER_GEOMETRY: true,
168
+ ON_PREVIEW_MESH: (mesh) => payloads.push(mesh),
169
+ });
170
+ expect(deferredID).toBeGreaterThanOrEqual(0);
171
+ // index.ifc parses inside one cooperative slice, so the timer-driven
172
+ // channel usually never fires — the contract here is that its presence
173
+ // changes nothing about the durable pump's output.
174
+ const drained = new Map();
175
+ api.StreamAllMeshes(deferredID, (mesh) => {
176
+ drained.set(mesh.expressID, (drained.get(mesh.expressID) ?? 0) + mesh.geometries.size());
177
+ });
178
+ expect(drained.size).toBe(classic.size);
179
+ for (const [expressID, list] of classic) {
180
+ expect(drained.get(expressID)).toBe(list.length);
181
+ }
182
+ api.CloseModel(classicID);
183
+ api.CloseModel(deferredID);
184
+ }, 240000);
185
+ });
@@ -20,6 +20,9 @@ interface IfcProxyLoadState {
20
20
  conwaywasm: ConwayGeometry;
21
21
  /** True when opened without extraction (createDeferred). */
22
22
  deferred?: boolean;
23
+ /** Coordination matrix the parse-time preview channel derived (slice
24
+ * A2) — adopted by the durable capture so both share one frame. */
25
+ previewCoordinationMatrix?: glmatrix.mat4;
23
26
  allTimeStart: number;
24
27
  stepHeader: StepHeader;
25
28
  model: IfcStepModel;
@@ -57,8 +60,28 @@ export declare class IfcApiProxyIfc implements IfcApiModelPassthrough {
57
60
  private deferredMode_;
58
61
  /** Deferred-mode product worklist (file order), lazily enumerated. */
59
62
  private demandProducts_?;
63
+ /**
64
+ * Deferred capture watermarks: entity localID -> how many of its
65
+ * placed instances (in scene-walk order) have been captured. Shared
66
+ * (mapped) geometry attributes instances to an entity from OTHER
67
+ * products' extractions, so an entity's instance set grows across
68
+ * batches - the watermark makes each instance captured exactly once,
69
+ * in the same order the classic single walk would process it.
70
+ */
71
+ private readonly demandCapturedCounts_;
60
72
  /** Cursor into demandProducts_ — products before it are extracted. */
61
73
  private demandCursor_;
74
+ /**
75
+ * Coordination matrix the deferred capture derived (or adopted from
76
+ * the parse-time preview channel). Kept OFF the model tuple's slot 5
77
+ * deliberately: classic streamAllMeshes derives its coordination into
78
+ * a local and getCoordinationMatrix therefore returns identity —
79
+ * consumers (Share) stamp that result onto the assembled model, so a
80
+ * deferred open must present the same identity or coordination would
81
+ * apply twice. This field is only the pump's internal multi-call
82
+ * memory.
83
+ */
84
+ private demandCoordination_?;
62
85
  _isCoordinated: boolean;
63
86
  linearScalingFactor: number;
64
87
  identity: number[];
@@ -393,17 +416,26 @@ export declare class IfcApiProxyIfc implements IfcApiModelPassthrough {
393
416
  remaining: number;
394
417
  };
395
418
  /**
396
- * Walk the scene and emit FlatMeshes for the given entities only —
397
- * the filtered core of streamAllMeshes with identical placed-geometry
398
- * math. Also fixes a latent multi-call bug: the derived coordination
399
- * matrix is stored back to the model tuple, so later batches place
419
+ * Walk the scene and emit every not-yet-captured placed instance as
420
+ * per-entity DELTA FlatMeshes the incremental core of
421
+ * streamAllMeshes with identical placed-geometry math, processed in
422
+ * walk order exactly once per instance (per-entity watermarks). An
423
+ * entity re-emits with only its NEW instances when shared/mapped
424
+ * geometry attributes more to it in later batches; consumers render
425
+ * deltas additively (the shared meshMap still accumulates each
426
+ * entity's FULL vector, so getFlatMesh stays whole-model correct).
427
+ *
428
+ * Also fixes a latent multi-call bug: the derived coordination
429
+ * matrix is remembered (demandCoordination_), so later batches place
400
430
  * with the SAME coordination the first batch established
401
- * (streamAllMeshes never needed this — it runs once).
431
+ * (streamAllMeshes never needed this — it runs once). It is NOT
432
+ * exposed through getCoordinationMatrix, which keeps the classic
433
+ * identity contract consumers stamp onto assembled models.
402
434
  *
403
- * @param entityFilter Entity localIDs whose meshes to emit.
404
- * @param meshCallback Receives one FlatMesh per matched entity.
435
+ * @param meshCallback Receives one delta FlatMesh per entity that
436
+ * gained instances this call.
405
437
  */
406
- private streamMeshesForEntities_;
438
+ private streamNewMeshes_;
407
439
  /**
408
440
  *
409
441
  * @param modelID
@@ -1 +1 @@
1
- {"version":3,"file":"ifc_api_proxy_ifc.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_proxy_ifc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ifc_api_proxy_ifc.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/ifc_api_proxy_ifc.ts"],"names":[],"mappings":"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"}