@ifc-lite/renderer 1.36.0 → 1.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contribution-cull.d.ts +19 -0
- package/dist/contribution-cull.d.ts.map +1 -1
- package/dist/contribution-cull.js +48 -0
- package/dist/contribution-cull.js.map +1 -1
- package/dist/device.d.ts +22 -0
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js +35 -2
- package/dist/device.js.map +1 -1
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +99 -5
- package/dist/index.js.map +1 -1
- package/dist/instanced-render.d.ts +31 -0
- package/dist/instanced-render.d.ts.map +1 -1
- package/dist/instanced-render.js +45 -0
- package/dist/instanced-render.js.map +1 -1
- package/dist/render-stats.d.ts +10 -0
- package/dist/render-stats.d.ts.map +1 -1
- package/dist/render-stats.js.map +1 -1
- package/dist/scene.d.ts +25 -1
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +74 -8
- package/dist/scene.js.map +1 -1
- package/package.json +3 -3
package/dist/render-stats.d.ts
CHANGED
|
@@ -30,6 +30,16 @@ export interface FrameStats {
|
|
|
30
30
|
batchesNotResident: number;
|
|
31
31
|
/** Batches drawn at their simplified LOD1 index range this frame. */
|
|
32
32
|
batchesAtLod1: number;
|
|
33
|
+
/** GPU-instanced templates drawn this frame (one draw call each). */
|
|
34
|
+
instancedDrawn: number;
|
|
35
|
+
/** Instanced templates rejected by the frustum test (union world AABB). */
|
|
36
|
+
instancedFrustumCulled: number;
|
|
37
|
+
/**
|
|
38
|
+
* Instanced templates rejected by contribution culling: even the largest
|
|
39
|
+
* single occurrence, projected at the union box's nearest view depth,
|
|
40
|
+
* fell below the pixel threshold.
|
|
41
|
+
*/
|
|
42
|
+
instancedContributionCulled: number;
|
|
33
43
|
/** `performance.now()` timestamp taken at the end of the render call. */
|
|
34
44
|
timestamp: number;
|
|
35
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-stats.d.ts","sourceRoot":"","sources":["../src/render-stats.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,yBAAyB,EAAE,MAAM,CAAC;IAClC;;;;OAIG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,SAAS;IACjB,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,iEAAiE;IACjE,eAAe,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,UAAU,YAAa,SAAQ,SAAS;IACtC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE;AAED,UAAU,aAAa;IACrB,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,WAAW,CAAC;CAC7B;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAKD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC7B,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjC,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;CACpC,GAAG,gBAAgB,CAoBnB"}
|
|
1
|
+
{"version":3,"file":"render-stats.d.ts","sourceRoot":"","sources":["../src/render-stats.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,yBAAyB,EAAE,MAAM,CAAC;IAClC;;;;OAIG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,2BAA2B,EAAE,MAAM,CAAC;IACpC,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,SAAS;IACjB,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,iEAAiE;IACjE,eAAe,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,UAAU,YAAa,SAAQ,SAAS;IACtC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE;AAED,UAAU,aAAa;IACrB,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,WAAW,CAAC;CAC7B;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAKD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC7B,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjC,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;CACpC,GAAG,gBAAgB,CAoBnB"}
|
package/dist/render-stats.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-stats.js","sourceRoot":"","sources":["../src/render-stats.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"render-stats.js","sourceRoot":"","sources":["../src/render-stats.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAqF/D,MAAM,QAAQ,GAAG,CAAC,CAAY,EAAU,EAAE,CACxC,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;AAE3G;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAMnC;IACC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc;QAAE,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE7D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/B,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,GAAG,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,SAAS,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;IAChF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,EAAE,CAAC;AAClG,CAAC"}
|
package/dist/scene.d.ts
CHANGED
|
@@ -47,6 +47,21 @@ export interface InstancedTemplateGPU {
|
|
|
47
47
|
indexCount: number;
|
|
48
48
|
instanceBuffer: GPUBuffer;
|
|
49
49
|
instanceCount: number;
|
|
50
|
+
/** Union of the occurrences' world AABBs (null when no occurrence has a
|
|
51
|
+
* finite box — such templates are never culled). Same tuple layout as
|
|
52
|
+
* BatchedMesh.bounds so the render loop's frustum test is shared. */
|
|
53
|
+
bounds: {
|
|
54
|
+
min: [number, number, number];
|
|
55
|
+
max: [number, number, number];
|
|
56
|
+
} | null;
|
|
57
|
+
/** Largest single-occurrence bounding-sphere radius (world units). Upper
|
|
58
|
+
* bound for the contribution cull: no occurrence can project larger than
|
|
59
|
+
* this radius at the union box's nearest view depth. */
|
|
60
|
+
maxOccRadius: number;
|
|
61
|
+
/** Occurrences currently selected (highlight flag set). A template with a
|
|
62
|
+
* selected occurrence is exempt from contribution culling so the highlight
|
|
63
|
+
* can't vanish while the entity is the user's focus. */
|
|
64
|
+
selectedCount: number;
|
|
50
65
|
}
|
|
51
66
|
export declare class Scene {
|
|
52
67
|
private meshes;
|
|
@@ -652,7 +667,8 @@ export declare class Scene {
|
|
|
652
667
|
addInstancedShard(device: GPUDevice, shard: DecodedInstancedShard): void;
|
|
653
668
|
/** Transform a template's local AABB by an occurrence's column-major mat4 (read
|
|
654
669
|
* from the packed instance record at `matOffset`) and union the world box into
|
|
655
|
-
* boundingBoxes[eid].
|
|
670
|
+
* boundingBoxes[eid]. Returns the occurrence's world box so the caller can also
|
|
671
|
+
* fold it into the template's cull metadata. */
|
|
656
672
|
private unionInstancedWorldAabb;
|
|
657
673
|
/** True if `expressId` is a GPU-instanced occurrence (lives only in the instanced
|
|
658
674
|
* shard, not the flat meshDataMap). CPU consumers use this to decide whether to
|
|
@@ -661,6 +677,10 @@ export declare class Scene {
|
|
|
661
677
|
/** All instanced occurrence express_ids (for CPU consumers that enumerate geometry,
|
|
662
678
|
* e.g. the raycast-engine and exporters). */
|
|
663
679
|
getInstancedEntityIds(): IterableIterator<number>;
|
|
680
|
+
/** Number of distinct GPU-instanced entities. O(1) — for size heuristics
|
|
681
|
+
* (e.g. the orbit-pivot raycast skip) that must not miss instanced-heavy
|
|
682
|
+
* models where the flat mesh/batch census reads deceptively small. */
|
|
683
|
+
getInstancedEntityCount(): number;
|
|
664
684
|
/** Materialize EVERY instanced occurrence as world-space MeshData. Transient + not
|
|
665
685
|
* retained — for one-shot full-geometry consumers (glTF / IFC5 export) that must
|
|
666
686
|
* include the instanced occurrences absent from geometryResult.meshes. Returns []
|
|
@@ -681,6 +701,10 @@ export declare class Scene {
|
|
|
681
701
|
* re-draw is needed. No-op until a shard has been uploaded.
|
|
682
702
|
*/
|
|
683
703
|
setInstancedSelection(expressIds: ReadonlySet<number>): void;
|
|
704
|
+
/** Keep each template's selectedCount in sync with selection flips so the
|
|
705
|
+
* render loop can exempt templates with selected occurrences from
|
|
706
|
+
* contribution culling (the highlight must not vanish on the user's focus). */
|
|
707
|
+
private bumpTemplateSelectedCount;
|
|
684
708
|
/**
|
|
685
709
|
* Per-instance VISIBILITY (hide / isolate): set the hidden flag bit on occurrences
|
|
686
710
|
* that should not render, mirroring the flat path's hiddenIds/isolatedIds filter.
|
package/dist/scene.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EAKhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAwC,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEjG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EAKhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAwC,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEjG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAmBhE;;;;;;;;;;GAUG;AACH;;0EAE0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,SAAS,CAAC;IACzB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,EAAE,YAAY,CAAC;IACxB,iFAAiF;IACjF,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAWD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB;;0EAEsE;IACtE,MAAM,EAAE;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF;;6DAEyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB;;6DAEyD;IACzD,aAAa,EAAE,MAAM,CAAC;CACvB;AA4BD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,cAAc,CAAC,CAAY;IACnC,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,kBAAkB,CAAiD;IAC3E,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,eAAe,CAAC,CAAY;IACpC,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,mBAAmB,CAA0B;IACrD,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,sBAAsB,CAAoC;IAClE,OAAO,CAAC,wBAAwB,CAAoC;IACpE,OAAO,CAAC,wBAAwB,CAAS;IAMzC,OAAO,CAAC,eAAe,CAAkC;IAIzD,OAAO,CAAC,eAAe,CAAsC;IAK7D,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,yBAAyB,CAAS;IAK1C,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,oBAAoB,CAAyC;IACrE,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,oBAAoB,CAAK;IAEjC,OAAO,CAAC,gBAAgB,CAAS;IAGjC,OAAO,CAAC,uBAAuB,CAAS;IAKxC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAa;IAKhC,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,mBAAmB,CAAa;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAW;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mCAAmC,CAAmB;IAK9E,OAAO,CAAC,iBAAiB,CAAuC;IAChE,OAAO,CAAC,qBAAqB,CAAkC;IAK/D,OAAO,CAAC,eAAe,CAAqB;IAG5C,OAAO,CAAC,cAAc,CAA+E;IAGrG,OAAO,CAAC,gBAAgB,CAA0B;IAGlD,OAAO,CAAC,kBAAkB,CAAqB;IAM/C,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,kBAAkB,CAAa;IAMvC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,sBAAsB,CAAkB;IAEhD;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIzB;;OAEG;IACH,SAAS,IAAI,IAAI,EAAE;IAInB;;OAEG;IACH,gBAAgB,IAAI,WAAW,EAAE;IAIjC;;6EAEyE;IACzE,oBAAoB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAIvD;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI;IAQ9D,kBAAkB,IAAI,qBAAqB,GAAG,IAAI;IAYlD,wDAAwD;IACxD,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IASjD,qBAAqB,IAAI,MAAM,GAAG,IAAI;IAItC;yEACqE;IACrE,mBAAmB,IAAI,IAAI;IAI3B,4DAA4D;IAC5D,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAK1C;;;;;OAKG;IACH,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAS/C,uBAAuB,IAAI,OAAO;IAIlC;;;;OAIG;IACH,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM;IAmCnG,+EAA+E;IAC/E,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI;IAIpE;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI3C;;;;;;;;;OASG;IACH,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI3C;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAO5C,uEAAuE;IACvE,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IASlD,yEAAyE;IACzE,mBAAmB,IAAI,MAAM;IAU7B;;2DAEuD;IACvD,OAAO,CAAC,eAAe;IAIvB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAkEzB;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpC;gFAC4E;IAC5E,OAAO,CAAC,gBAAgB;IA0CxB;;;;;;;OAOG;IACH,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM;IAmBtE;;;;;;OAMG;IACH,gBAAgB,IAAI,IAAI;IAuDxB;;6BAEyB;IACzB,OAAO,CAAC,wBAAwB;IAahC;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAIrB;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IA0BrC;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAuGzE;;;;OAIG;IACH;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IA6DnC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO;IAQ5D;;;OAGG;IACH;;;;;;;;;OASG;IACH,eAAe,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAqBpD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,SAAS;IAwBjF;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IAUhB;;;;;;;;OAQG;IACH,eAAe,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,GAAE,OAAe,GAAG,IAAI;IAqE3H;;;;;;OAMG;IACH,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAmCxE;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAkFjD;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;;;;OAKG;IACH,uBAAuB,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM;IAQ7D;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO;IAerF;;;OAGG;IACH;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,4BAA4B;IAgEpC;;;;;;;;;;;;;;;;OAgBG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO;IAyCrF;;0FAEsF;IACtF,OAAO,CAAC,wBAAwB;IAuBhC;;;;6CAIyC;IACzC,OAAO,CAAC,oBAAoB;IAU5B,kDAAkD;IAClD,0BAA0B,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM;IAQlF;;;;;;;;;;;;;;OAcG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO;IAmEpG,+CAA+C;IAC/C,uBAAuB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,GAAG,MAAM;IAUzG;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI;IASrC,+CAA+C;IAC/C,eAAe,IAAI,OAAO;IAI1B;;;;qEAIiE;IACjE,qBAAqB,IAAI,OAAO;IAIhC;;4DAEwD;IACxD,oBAAoB,IAAI,OAAO;IAI/B;;2EAEuE;IACvE,oBAAoB,IAAI,OAAO;IAI/B,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIjD;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO;IA2DlE;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAgChC,OAAO,CAAC,qBAAqB;IAgE7B;;;;;;;;;;OAUG;IACH,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAUpE,OAAO,CAAC,sBAAsB;IAqE9B;;;;;;;;;;OAUG;IACH,sBAAsB,CACpB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,cAAc,EACxB,QAAQ,GAAE,MAAU,GACnB,OAAO,CAAC,IAAI,CAAC;IAiHhB,wBAAwB,IAAI,IAAI;IA2DhC;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,IAAI,IAAI;IA+E3B;;OAEG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;;;;;OAMG;IACH,gBAAgB,CACd,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EACtD,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,cAAc,GACvB,IAAI;IAuGP;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAmIzB;;;OAGG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAInC;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAsC3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;;;;;;;;;;;OAYG;IACH,uBAAuB,CACrB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,cAAc,GACvB,WAAW,GAAG,SAAS;IA4E1B;;;;;;;OAOG;IACH,iBAAiB,CACf,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EACxD,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,cAAc,GACvB,IAAI;IA0DP;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAM3B,wCAAwC;IACxC,kBAAkB,IAAI,WAAW,EAAE;IAInC,0CAA0C;IAC1C,iBAAiB,IAAI,OAAO;IAI5B;;;;;;;;;;;;;OAaG;IACH,iBAAiB,IAAI,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI;IAI1F,gDAAgD;IAChD,OAAO,CAAC,sBAAsB;IAK9B;;OAEG;IACH,6EAA6E;IAC7E,iBAAiB,IAAI,SAAS,YAAY,EAAE;IAI5C;;;;;;;;;OASG;IACH,mBAAmB,IAAI,gBAAgB;IAYvC;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI3C;8DAC0D;IAC1D,qBAAqB,IAAI,SAAS,oBAAoB,EAAE;IAKxD;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAkJxE;;;qDAGiD;IACjD,OAAO,CAAC,uBAAuB;IAkC/B;;sDAEkD;IAClD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;kDAC8C;IAC9C,qBAAqB,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIjD;;2EAEuE;IACvE,uBAAuB,IAAI,MAAM;IAIjC;;;wFAGoF;IACpF,uBAAuB,IAAI,QAAQ,EAAE;IASrC;+EAC2E;IAC3E,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAK/D;;;iEAG6D;IAC7D,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,SAAS;IA6CrE;;;;;OAKG;IACH,qBAAqB,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAmC5D;;oFAEgF;IAChF,OAAO,CAAC,yBAAyB;IASjC;;;;;;;OAOG;IACH,sBAAsB,CACpB,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACjD,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,GAClD,IAAI;IAgDP;;;;OAIG;IACH,0BAA0B,CACxB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAC/E,IAAI;IAmBP;yEACqE;IACrE,uBAAuB,IAAI,OAAO;IAIlC;;8EAE0E;IAC1E,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,oBAAoB;IAS5B;;;;;;OAMG;IACH;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;IA+BlC,OAAO,CAAC,kBAAkB;IA2D1B,KAAK,IAAI,IAAI;IAwDb;;OAEG;IACH,SAAS,IAAI;QAAE,GAAG,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,GAAG,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,IAAI;IA8D1G;;;OAGG;IACH,wBAAwB,IAAI,MAAM,EAAE;IAcpC;;;;;OAKG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAwC3D;;;;;;;;;;;;;;;;;;OAkBG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI;IA6ChH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IA8B1D;;;;OAIG;IACH,OAAO,CACL,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,IAAI,EACZ,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAChC,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,GAC1B,UAAU,GAAG,IAAI;CAwDrB"}
|
package/dist/scene.js
CHANGED
|
@@ -10,7 +10,7 @@ import { quantizeInterleaved } from './quantize.js';
|
|
|
10
10
|
import { bucketBaseKeyFor } from './chunk-grid.js';
|
|
11
11
|
import { selectEvictions } from './residency.js';
|
|
12
12
|
import { OPAQUE_ALPHA_CUTOFF } from './overlay-routing.js';
|
|
13
|
-
import { prepareInstancedRender, INSTANCE_STRIDE_BYTES, INSTANCE_COLOR_OFFSET, INSTANCE_FLAGS_OFFSET, INSTANCE_FLAG_SELECTED, INSTANCE_FLAG_HIDDEN, } from './instanced-render.js';
|
|
13
|
+
import { prepareInstancedRender, foldOccurrenceWorldBox, INSTANCE_STRIDE_BYTES, INSTANCE_COLOR_OFFSET, INSTANCE_FLAGS_OFFSET, INSTANCE_FLAG_SELECTED, INSTANCE_FLAG_HIDDEN, } from './instanced-render.js';
|
|
14
14
|
function destroyGpuResources(m) {
|
|
15
15
|
m.vertexBuffer.destroy();
|
|
16
16
|
m.indexBuffer.destroy();
|
|
@@ -1105,6 +1105,12 @@ export class Scene {
|
|
|
1105
1105
|
this.instancedHidden.add(expressId);
|
|
1106
1106
|
this.writeInstanceFlags(device, expressId);
|
|
1107
1107
|
}
|
|
1108
|
+
// Release the contribution-cull exemption BEFORE forgetting the occurrence
|
|
1109
|
+
// locations — deleting the map entry first would leak selectedCount and
|
|
1110
|
+
// leave the templates permanently uncullable.
|
|
1111
|
+
if (this.instancedSelected.has(expressId)) {
|
|
1112
|
+
this.bumpTemplateSelectedCount(expressId, -1);
|
|
1113
|
+
}
|
|
1108
1114
|
this.instancedEntityMap.delete(expressId);
|
|
1109
1115
|
this.instancedSelected.delete(expressId);
|
|
1110
1116
|
this.instancedHidden.delete(expressId);
|
|
@@ -1346,7 +1352,15 @@ export class Scene {
|
|
|
1346
1352
|
if (!cpu)
|
|
1347
1353
|
continue;
|
|
1348
1354
|
const dv = new DataView(cpu.instanceData);
|
|
1349
|
-
this.unionInstancedWorldAabb(expressId, dv, occ.byteOffset, cpu.localMin[0], cpu.localMin[1], cpu.localMin[2], cpu.localMax[0], cpu.localMax[1], cpu.localMax[2]);
|
|
1355
|
+
const w = this.unionInstancedWorldAabb(expressId, dv, occ.byteOffset, cpu.localMin[0], cpu.localMin[1], cpu.localMin[2], cpu.localMax[0], cpu.localMax[1], cpu.localMax[2]);
|
|
1356
|
+
// GROW the template's cull union so a moved occurrence (Exploded mode,
|
|
1357
|
+
// #1289) can't be frustum/contribution-culled by its pre-move bounds.
|
|
1358
|
+
// The pre-move region stays in the union — monotonic growth only ever
|
|
1359
|
+
// culls LESS — and translation never changes an occurrence's size, so
|
|
1360
|
+
// maxOccRadius needs no update.
|
|
1361
|
+
const template = this.instancedTemplates[occ.templateIndex];
|
|
1362
|
+
if (template)
|
|
1363
|
+
foldOccurrenceWorldBox(template, w);
|
|
1350
1364
|
}
|
|
1351
1365
|
}
|
|
1352
1366
|
/** Drop the per-entity selection-highlight meshes for `expressId` (frozen
|
|
@@ -2535,6 +2549,9 @@ export class Scene {
|
|
|
2535
2549
|
addInstancedShard(device, shard) {
|
|
2536
2550
|
this.instancedDevice = device; // cached for per-instance selection/overlay writeBuffer
|
|
2537
2551
|
const prepared = prepareInstancedRender(shard);
|
|
2552
|
+
// Selected ids whose occurrences arrived in THIS shard (selection recorded
|
|
2553
|
+
// before the shard streamed in) — their flags are written after upload.
|
|
2554
|
+
const lateSelectedEids = new Set();
|
|
2538
2555
|
for (const t of prepared) {
|
|
2539
2556
|
const vcount = Math.floor(t.positions.length / 3);
|
|
2540
2557
|
if (vcount === 0 || t.indices.length === 0 || t.instanceCount === 0)
|
|
@@ -2580,13 +2597,17 @@ export class Scene {
|
|
|
2580
2597
|
new Uint8Array(instanceBuffer.getMappedRange()).set(new Uint8Array(t.instanceBuffer, 0, instSize));
|
|
2581
2598
|
instanceBuffer.unmap();
|
|
2582
2599
|
const templateIndex = this.instancedTemplates.length;
|
|
2583
|
-
|
|
2600
|
+
const template = {
|
|
2584
2601
|
vertexBuffer,
|
|
2585
2602
|
indexBuffer,
|
|
2586
2603
|
indexCount: t.indices.length,
|
|
2587
2604
|
instanceBuffer,
|
|
2588
2605
|
instanceCount: t.instanceCount,
|
|
2589
|
-
|
|
2606
|
+
bounds: null,
|
|
2607
|
+
maxOccRadius: 0,
|
|
2608
|
+
selectedCount: 0,
|
|
2609
|
+
};
|
|
2610
|
+
this.instancedTemplates.push(template);
|
|
2590
2611
|
// Template-local AABB (used to derive per-occurrence world AABBs cheaply).
|
|
2591
2612
|
let lmnx = Infinity, lmny = Infinity, lmnz = Infinity;
|
|
2592
2613
|
let lmxx = -Infinity, lmxy = -Infinity, lmxz = -Infinity;
|
|
@@ -2640,11 +2661,31 @@ export class Scene {
|
|
|
2640
2661
|
this.instancedEntityMap.set(eid, arr);
|
|
2641
2662
|
}
|
|
2642
2663
|
arr.push({ templateIndex, byteOffset, originalColor });
|
|
2664
|
+
// A shard can stream in AFTER a selection was recorded (its ids may
|
|
2665
|
+
// exist in earlier shards or the flat path). setInstancedSelection
|
|
2666
|
+
// diffs by id and would early-return on the unchanged set, so seed the
|
|
2667
|
+
// late occurrences here: count them for the contribution-cull
|
|
2668
|
+
// exemption and remember the id to write its selected flag below.
|
|
2669
|
+
if (this.instancedSelected.has(eid)) {
|
|
2670
|
+
template.selectedCount++;
|
|
2671
|
+
lateSelectedEids.add(eid);
|
|
2672
|
+
}
|
|
2643
2673
|
if (haveBox) {
|
|
2644
|
-
this.unionInstancedWorldAabb(eid, cdv, byteOffset, lmnx, lmny, lmnz, lmxx, lmxy, lmxz);
|
|
2674
|
+
const w = this.unionInstancedWorldAabb(eid, cdv, byteOffset, lmnx, lmny, lmnz, lmxx, lmxy, lmxz);
|
|
2675
|
+
// Fold the occurrence's world box into the template's cull metadata
|
|
2676
|
+
// (union bounds + largest occurrence bounding-sphere radius) for the
|
|
2677
|
+
// per-frame instanced frustum/contribution culls. Non-finite boxes
|
|
2678
|
+
// poison the template so it fails OPEN (never culled).
|
|
2679
|
+
foldOccurrenceWorldBox(template, w);
|
|
2645
2680
|
}
|
|
2646
2681
|
}
|
|
2647
2682
|
}
|
|
2683
|
+
// Write the selected flag for ids whose occurrences arrived after the
|
|
2684
|
+
// selection was recorded (idempotent for their pre-existing occurrences),
|
|
2685
|
+
// so the highlight shows on late-streamed geometry too.
|
|
2686
|
+
for (const eid of lateSelectedEids) {
|
|
2687
|
+
this.writeInstanceFlags(device, eid);
|
|
2688
|
+
}
|
|
2648
2689
|
// New occurrences default to flags=0 (visible). Force the next setInstancedVisibility
|
|
2649
2690
|
// to recompute so an already-active isolate/hide also applies to geometry that
|
|
2650
2691
|
// streamed in after the visibility was set.
|
|
@@ -2652,7 +2693,8 @@ export class Scene {
|
|
|
2652
2693
|
}
|
|
2653
2694
|
/** Transform a template's local AABB by an occurrence's column-major mat4 (read
|
|
2654
2695
|
* from the packed instance record at `matOffset`) and union the world box into
|
|
2655
|
-
* boundingBoxes[eid].
|
|
2696
|
+
* boundingBoxes[eid]. Returns the occurrence's world box so the caller can also
|
|
2697
|
+
* fold it into the template's cull metadata. */
|
|
2656
2698
|
unionInstancedWorldAabb(eid, dv, matOffset, lmnx, lmny, lmnz, lmxx, lmxy, lmxz) {
|
|
2657
2699
|
const m0 = dv.getFloat32(matOffset + 0, true), m1 = dv.getFloat32(matOffset + 4, true), m2 = dv.getFloat32(matOffset + 8, true);
|
|
2658
2700
|
const m4 = dv.getFloat32(matOffset + 16, true), m5 = dv.getFloat32(matOffset + 20, true), m6 = dv.getFloat32(matOffset + 24, true);
|
|
@@ -2689,6 +2731,7 @@ export class Scene {
|
|
|
2689
2731
|
else {
|
|
2690
2732
|
this.boundingBoxes.set(eid, { min: { x: minX, y: minY, z: minZ }, max: { x: maxX, y: maxY, z: maxZ } });
|
|
2691
2733
|
}
|
|
2734
|
+
return { minX, minY, minZ, maxX, maxY, maxZ };
|
|
2692
2735
|
}
|
|
2693
2736
|
/** True if `expressId` is a GPU-instanced occurrence (lives only in the instanced
|
|
2694
2737
|
* shard, not the flat meshDataMap). CPU consumers use this to decide whether to
|
|
@@ -2701,6 +2744,12 @@ export class Scene {
|
|
|
2701
2744
|
getInstancedEntityIds() {
|
|
2702
2745
|
return this.instancedEntityMap.keys();
|
|
2703
2746
|
}
|
|
2747
|
+
/** Number of distinct GPU-instanced entities. O(1) — for size heuristics
|
|
2748
|
+
* (e.g. the orbit-pivot raycast skip) that must not miss instanced-heavy
|
|
2749
|
+
* models where the flat mesh/batch census reads deceptively small. */
|
|
2750
|
+
getInstancedEntityCount() {
|
|
2751
|
+
return this.instancedEntityMap.size;
|
|
2752
|
+
}
|
|
2704
2753
|
/** Materialize EVERY instanced occurrence as world-space MeshData. Transient + not
|
|
2705
2754
|
* retained — for one-shot full-geometry consumers (glTF / IFC5 export) that must
|
|
2706
2755
|
* include the instanced occurrences absent from geometryResult.meshes. Returns []
|
|
@@ -2805,12 +2854,29 @@ export class Scene {
|
|
|
2805
2854
|
const prev = this.instancedSelected;
|
|
2806
2855
|
this.instancedSelected = new Set(expressIds);
|
|
2807
2856
|
for (const eid of prev) {
|
|
2808
|
-
if (!expressIds.has(eid))
|
|
2857
|
+
if (!expressIds.has(eid)) {
|
|
2809
2858
|
this.writeInstanceFlags(device, eid);
|
|
2859
|
+
this.bumpTemplateSelectedCount(eid, -1);
|
|
2860
|
+
}
|
|
2810
2861
|
}
|
|
2811
2862
|
for (const eid of expressIds) {
|
|
2812
|
-
if (!prev.has(eid))
|
|
2863
|
+
if (!prev.has(eid)) {
|
|
2813
2864
|
this.writeInstanceFlags(device, eid);
|
|
2865
|
+
this.bumpTemplateSelectedCount(eid, +1);
|
|
2866
|
+
}
|
|
2867
|
+
}
|
|
2868
|
+
}
|
|
2869
|
+
/** Keep each template's selectedCount in sync with selection flips so the
|
|
2870
|
+
* render loop can exempt templates with selected occurrences from
|
|
2871
|
+
* contribution culling (the highlight must not vanish on the user's focus). */
|
|
2872
|
+
bumpTemplateSelectedCount(eid, delta) {
|
|
2873
|
+
const occurrences = this.instancedEntityMap.get(eid);
|
|
2874
|
+
if (!occurrences)
|
|
2875
|
+
return;
|
|
2876
|
+
for (const occ of occurrences) {
|
|
2877
|
+
const t = this.instancedTemplates[occ.templateIndex];
|
|
2878
|
+
if (t)
|
|
2879
|
+
t.selectedCount = Math.max(0, t.selectedCount + delta);
|
|
2814
2880
|
}
|
|
2815
2881
|
}
|
|
2816
2882
|
/**
|