@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.
- package/compiled/examples/browser-bundled.cjs +27 -1
- package/compiled/examples/cli-bundled.cjs +27 -1
- package/compiled/examples/cli-step-bundled.cjs +1 -1
- package/compiled/examples/validator-bundled.cjs +27 -1
- package/compiled/src/compat/web-ifc/ifc_api.d.ts +20 -0
- package/compiled/src/compat/web-ifc/ifc_api.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api.js +7 -0
- package/compiled/src/compat/web-ifc/ifc_api_deferred_open.test.js +25 -9
- package/compiled/src/compat/web-ifc/ifc_api_preview_channel.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/ifc_api_preview_channel.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/ifc_api_preview_channel.test.js +185 -0
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts +40 -8
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.js +115 -28
- package/compiled/src/compat/web-ifc/streamed_preview_channel.d.ts +130 -0
- package/compiled/src/compat/web-ifc/streamed_preview_channel.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/streamed_preview_channel.js +335 -0
- package/compiled/src/step/parsing/columnar_index.d.ts +22 -0
- package/compiled/src/step/parsing/columnar_index.d.ts.map +1 -1
- package/compiled/src/step/parsing/columnar_index.js +26 -0
- package/compiled/src/version/version.js +1 -1
- package/compiled/tsconfig.tsbuildinfo +1 -1
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,IAAI,mBAAmB,EAEjE,MAAM,aAAa,CAAA;AAGrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAEnD,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
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 @@
|
|
|
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
|
|
397
|
-
*
|
|
398
|
-
*
|
|
399
|
-
*
|
|
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
|
|
404
|
-
*
|
|
435
|
+
* @param meshCallback Receives one delta FlatMesh per entity that
|
|
436
|
+
* gained instances this call.
|
|
405
437
|
*/
|
|
406
|
-
private
|
|
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":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EACf,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,YAAY,MAAM,0BAA0B,CAAA;AACnD,OAAO,EACL,QAAQ,EACR,WAAW,EACX,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,MAAM,EACP,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;
|
|
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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"}
|