@selvajs/visualization 1.3.0 → 1.4.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/gpu-dispose-CCO5Grel.cjs +2 -0
- package/dist/gpu-dispose-CCO5Grel.cjs.map +1 -0
- package/dist/gpu-dispose-Cl2f9lUC.js +2 -0
- package/dist/gpu-dispose-Cl2f9lUC.js.map +1 -0
- package/dist/merged-draw-B75jHIzV.cjs +2 -0
- package/dist/merged-draw-B75jHIzV.cjs.map +1 -0
- package/dist/merged-draw-BPhBYH-v.js +2 -0
- package/dist/merged-draw-BPhBYH-v.js.map +1 -0
- package/dist/parse.cjs +3 -3
- package/dist/parse.cjs.map +1 -1
- package/dist/parse.d.cts +24 -8
- package/dist/parse.d.ts +24 -8
- package/dist/parse.js +3 -3
- package/dist/parse.js.map +1 -1
- package/dist/render.cjs +4 -4
- package/dist/render.cjs.map +1 -1
- package/dist/render.d.cts +20 -20
- package/dist/render.d.ts +20 -20
- package/dist/render.js +4 -4
- package/dist/render.js.map +1 -1
- package/dist/scene.cjs +1 -1
- package/dist/scene.cjs.map +1 -1
- package/dist/scene.d.cts +6 -6
- package/dist/scene.d.ts +6 -6
- package/dist/scene.js +1 -1
- package/dist/scene.js.map +1 -1
- package/package.json +10 -10
- package/dist/gpu-dispose-Dkj-BKt4.js +0 -2
- package/dist/gpu-dispose-Dkj-BKt4.js.map +0 -1
- package/dist/gpu-dispose-DrN-ryj5.cjs +0 -2
- package/dist/gpu-dispose-DrN-ryj5.cjs.map +0 -1
package/dist/parse.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ import { a as MaterialAppearanceOptions } from "./types-C0V-dIU-.cjs";
|
|
|
2
2
|
import * as THREE from "three";
|
|
3
3
|
//#region src/parse/mesh-policy.d.ts
|
|
4
4
|
/** Structurally, not nominally, typed as `@selvajs/solve/client`'s `MeshPolicy<THREE.Object3D>` — avoids a dependency on solve. */
|
|
5
|
-
declare const meshPolicy: {
|
|
5
|
+
export declare const meshPolicy: {
|
|
6
6
|
clone(meshes: THREE.Object3D[]): THREE.Object3D[];
|
|
7
7
|
release(meshes: THREE.Object3D[]): void;
|
|
8
8
|
};
|
|
@@ -84,6 +84,22 @@ interface SerializableMaterial {
|
|
|
84
84
|
* When set, the mesh blob also carries per-vertex UVs (FLAG_HAS_UVS) for meshes using it.
|
|
85
85
|
*/
|
|
86
86
|
map?: string;
|
|
87
|
+
/** Roughness texture (green channel), same reference forms as `map`. */
|
|
88
|
+
roughnessMap?: string;
|
|
89
|
+
/** Tangent-space normal texture, same reference forms as `map`. */
|
|
90
|
+
normalMap?: string;
|
|
91
|
+
/** Wins over the look's `envMapIntensity` (except in looks that override materials). */
|
|
92
|
+
envMapIntensity?: number;
|
|
93
|
+
/** Omitted: metallic materials get a satin coat, others none. */
|
|
94
|
+
clearcoat?: number;
|
|
95
|
+
clearcoatRoughness?: number;
|
|
96
|
+
/**
|
|
97
|
+
* Stretches highlights along texture U, the grain of brushed or rolled sheet. Ignored when the
|
|
98
|
+
* batch carries no UVs: three builds the tangent from UV derivatives.
|
|
99
|
+
*/
|
|
100
|
+
anisotropy?: number;
|
|
101
|
+
/** Radians, counter-clockwise from texture U. */
|
|
102
|
+
anisotropyRotation?: number;
|
|
87
103
|
}
|
|
88
104
|
/**
|
|
89
105
|
* `vertexStart`/`vertexCount` and `indexStart`/`indexCount` are in **element units** of the
|
|
@@ -165,7 +181,7 @@ interface MeshExtractionOptions {
|
|
|
165
181
|
* response). Imperial factors are the exact international definitions. Units missing from this
|
|
166
182
|
* table scale by 1 and log a one-time warning — see {@link getScaleFactor}.
|
|
167
183
|
*/
|
|
168
|
-
declare const SCALE_FACTORS: Record<string, number>;
|
|
184
|
+
export declare const SCALE_FACTORS: Record<string, number>;
|
|
169
185
|
/**
|
|
170
186
|
* Extracts display meshes and items from a Grasshopper WebDisplay compute response: decompresses,
|
|
171
187
|
* scales to meters, and optionally grounds them. Requires the VektorNode Rhino.Compute fork.
|
|
@@ -175,7 +191,7 @@ declare const SCALE_FACTORS: Record<string, number>;
|
|
|
175
191
|
*
|
|
176
192
|
* @throws Rethrows unexpected errors after attempting to dispose any created meshes.
|
|
177
193
|
*/
|
|
178
|
-
declare function getThreeObjectsFromComputeResponse(data: GrasshopperComputeResponse, options?: MeshExtractionOptions): Promise<THREE.Object3D[]>;
|
|
194
|
+
export declare function getThreeObjectsFromComputeResponse(data: GrasshopperComputeResponse, options?: MeshExtractionOptions): Promise<THREE.Object3D[]>;
|
|
179
195
|
//#endregion
|
|
180
196
|
//#region src/parse/webdisplay/batch-parser.d.ts
|
|
181
197
|
interface ParseTelemetry {
|
|
@@ -190,7 +206,7 @@ interface ParseTelemetry {
|
|
|
190
206
|
*
|
|
191
207
|
* @throws {VisualizationError} On a corrupt/truncated/unsupported mesh blob or malformed group metadata.
|
|
192
208
|
*/
|
|
193
|
-
declare function parseMeshBatchObject(batch: DisplayBatch, options?: MeshBatchParsingOptions,
|
|
209
|
+
export declare function parseMeshBatchObject(batch: DisplayBatch, options?: MeshBatchParsingOptions,
|
|
194
210
|
/** @internal Timings threaded from an outer entry point — not a caller option. */
|
|
195
211
|
telemetry?: ParseTelemetry): Promise<THREE.Mesh[]>;
|
|
196
212
|
/**
|
|
@@ -202,7 +218,7 @@ telemetry?: ParseTelemetry): Promise<THREE.Mesh[]>;
|
|
|
202
218
|
*
|
|
203
219
|
* @throws {VisualizationError} On a corrupt/truncated/unsupported mesh blob or malformed group metadata.
|
|
204
220
|
*/
|
|
205
|
-
declare function parseMeshBatchBlob(blob: ArrayBuffer | Uint8Array, options?: MeshBatchParsingOptions): Promise<THREE.Mesh[]>;
|
|
221
|
+
export declare function parseMeshBatchBlob(blob: ArrayBuffer | Uint8Array, options?: MeshBatchParsingOptions): Promise<THREE.Mesh[]>;
|
|
206
222
|
//#endregion
|
|
207
223
|
//#region src/parse/webdisplay/apply-texture.d.ts
|
|
208
224
|
/**
|
|
@@ -210,7 +226,7 @@ declare function parseMeshBatchBlob(blob: ArrayBuffer | Uint8Array, options?: Me
|
|
|
210
226
|
* host embedding a foreign renderer that wants to set it directly. Applies to textures loaded from
|
|
211
227
|
* here on — textures already decoded keep the value they were given.
|
|
212
228
|
*/
|
|
213
|
-
declare function setTextureAnisotropy(value: number): void;
|
|
229
|
+
export declare function setTextureAnisotropy(value: number): void;
|
|
214
230
|
//#endregion
|
|
215
231
|
//#region src/parse/display-items/display-items-parser.d.ts
|
|
216
232
|
/**
|
|
@@ -220,7 +236,7 @@ declare function setTextureAnisotropy(value: number): void;
|
|
|
220
236
|
* surfaces as an actionable error instead of a scene quietly missing its curves. Every other
|
|
221
237
|
* unrenderable item is logged and skipped.
|
|
222
238
|
*/
|
|
223
|
-
declare function parseDisplayItems(items: DisplayItem[] | undefined): THREE.Object3D[];
|
|
239
|
+
export declare function parseDisplayItems(items: DisplayItem[] | undefined): THREE.Object3D[];
|
|
224
240
|
//#endregion
|
|
225
|
-
export {
|
|
241
|
+
export type { DisplayBatch, DisplayCurve, DisplayIdentity, DisplayItem, DisplayItemBase, DisplayPoint, DisplayPosition, MaterialGroup, MeshBatchParsingOptions, MeshExtractionOptions, MeshMetadata, SerializableMaterial };
|
|
226
242
|
//# sourceMappingURL=parse.d.cts.map
|
package/dist/parse.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { a as MaterialAppearanceOptions } from "./types-C0V-dIU-.js";
|
|
|
2
2
|
import * as THREE from "three";
|
|
3
3
|
//#region src/parse/mesh-policy.d.ts
|
|
4
4
|
/** Structurally, not nominally, typed as `@selvajs/solve/client`'s `MeshPolicy<THREE.Object3D>` — avoids a dependency on solve. */
|
|
5
|
-
declare const meshPolicy: {
|
|
5
|
+
export declare const meshPolicy: {
|
|
6
6
|
clone(meshes: THREE.Object3D[]): THREE.Object3D[];
|
|
7
7
|
release(meshes: THREE.Object3D[]): void;
|
|
8
8
|
};
|
|
@@ -84,6 +84,22 @@ interface SerializableMaterial {
|
|
|
84
84
|
* When set, the mesh blob also carries per-vertex UVs (FLAG_HAS_UVS) for meshes using it.
|
|
85
85
|
*/
|
|
86
86
|
map?: string;
|
|
87
|
+
/** Roughness texture (green channel), same reference forms as `map`. */
|
|
88
|
+
roughnessMap?: string;
|
|
89
|
+
/** Tangent-space normal texture, same reference forms as `map`. */
|
|
90
|
+
normalMap?: string;
|
|
91
|
+
/** Wins over the look's `envMapIntensity` (except in looks that override materials). */
|
|
92
|
+
envMapIntensity?: number;
|
|
93
|
+
/** Omitted: metallic materials get a satin coat, others none. */
|
|
94
|
+
clearcoat?: number;
|
|
95
|
+
clearcoatRoughness?: number;
|
|
96
|
+
/**
|
|
97
|
+
* Stretches highlights along texture U, the grain of brushed or rolled sheet. Ignored when the
|
|
98
|
+
* batch carries no UVs: three builds the tangent from UV derivatives.
|
|
99
|
+
*/
|
|
100
|
+
anisotropy?: number;
|
|
101
|
+
/** Radians, counter-clockwise from texture U. */
|
|
102
|
+
anisotropyRotation?: number;
|
|
87
103
|
}
|
|
88
104
|
/**
|
|
89
105
|
* `vertexStart`/`vertexCount` and `indexStart`/`indexCount` are in **element units** of the
|
|
@@ -165,7 +181,7 @@ interface MeshExtractionOptions {
|
|
|
165
181
|
* response). Imperial factors are the exact international definitions. Units missing from this
|
|
166
182
|
* table scale by 1 and log a one-time warning — see {@link getScaleFactor}.
|
|
167
183
|
*/
|
|
168
|
-
declare const SCALE_FACTORS: Record<string, number>;
|
|
184
|
+
export declare const SCALE_FACTORS: Record<string, number>;
|
|
169
185
|
/**
|
|
170
186
|
* Extracts display meshes and items from a Grasshopper WebDisplay compute response: decompresses,
|
|
171
187
|
* scales to meters, and optionally grounds them. Requires the VektorNode Rhino.Compute fork.
|
|
@@ -175,7 +191,7 @@ declare const SCALE_FACTORS: Record<string, number>;
|
|
|
175
191
|
*
|
|
176
192
|
* @throws Rethrows unexpected errors after attempting to dispose any created meshes.
|
|
177
193
|
*/
|
|
178
|
-
declare function getThreeObjectsFromComputeResponse(data: GrasshopperComputeResponse, options?: MeshExtractionOptions): Promise<THREE.Object3D[]>;
|
|
194
|
+
export declare function getThreeObjectsFromComputeResponse(data: GrasshopperComputeResponse, options?: MeshExtractionOptions): Promise<THREE.Object3D[]>;
|
|
179
195
|
//#endregion
|
|
180
196
|
//#region src/parse/webdisplay/batch-parser.d.ts
|
|
181
197
|
interface ParseTelemetry {
|
|
@@ -190,7 +206,7 @@ interface ParseTelemetry {
|
|
|
190
206
|
*
|
|
191
207
|
* @throws {VisualizationError} On a corrupt/truncated/unsupported mesh blob or malformed group metadata.
|
|
192
208
|
*/
|
|
193
|
-
declare function parseMeshBatchObject(batch: DisplayBatch, options?: MeshBatchParsingOptions,
|
|
209
|
+
export declare function parseMeshBatchObject(batch: DisplayBatch, options?: MeshBatchParsingOptions,
|
|
194
210
|
/** @internal Timings threaded from an outer entry point — not a caller option. */
|
|
195
211
|
telemetry?: ParseTelemetry): Promise<THREE.Mesh[]>;
|
|
196
212
|
/**
|
|
@@ -202,7 +218,7 @@ telemetry?: ParseTelemetry): Promise<THREE.Mesh[]>;
|
|
|
202
218
|
*
|
|
203
219
|
* @throws {VisualizationError} On a corrupt/truncated/unsupported mesh blob or malformed group metadata.
|
|
204
220
|
*/
|
|
205
|
-
declare function parseMeshBatchBlob(blob: ArrayBuffer | Uint8Array, options?: MeshBatchParsingOptions): Promise<THREE.Mesh[]>;
|
|
221
|
+
export declare function parseMeshBatchBlob(blob: ArrayBuffer | Uint8Array, options?: MeshBatchParsingOptions): Promise<THREE.Mesh[]>;
|
|
206
222
|
//#endregion
|
|
207
223
|
//#region src/parse/webdisplay/apply-texture.d.ts
|
|
208
224
|
/**
|
|
@@ -210,7 +226,7 @@ declare function parseMeshBatchBlob(blob: ArrayBuffer | Uint8Array, options?: Me
|
|
|
210
226
|
* host embedding a foreign renderer that wants to set it directly. Applies to textures loaded from
|
|
211
227
|
* here on — textures already decoded keep the value they were given.
|
|
212
228
|
*/
|
|
213
|
-
declare function setTextureAnisotropy(value: number): void;
|
|
229
|
+
export declare function setTextureAnisotropy(value: number): void;
|
|
214
230
|
//#endregion
|
|
215
231
|
//#region src/parse/display-items/display-items-parser.d.ts
|
|
216
232
|
/**
|
|
@@ -220,7 +236,7 @@ declare function setTextureAnisotropy(value: number): void;
|
|
|
220
236
|
* surfaces as an actionable error instead of a scene quietly missing its curves. Every other
|
|
221
237
|
* unrenderable item is logged and skipped.
|
|
222
238
|
*/
|
|
223
|
-
declare function parseDisplayItems(items: DisplayItem[] | undefined): THREE.Object3D[];
|
|
239
|
+
export declare function parseDisplayItems(items: DisplayItem[] | undefined): THREE.Object3D[];
|
|
224
240
|
//#endregion
|
|
225
|
-
export {
|
|
241
|
+
export type { DisplayBatch, DisplayCurve, DisplayIdentity, DisplayItem, DisplayItemBase, DisplayPoint, DisplayPosition, MaterialGroup, MeshBatchParsingOptions, MeshExtractionOptions, MeshMetadata, SerializableMaterial };
|
|
226
242
|
//# sourceMappingURL=parse.d.ts.map
|
package/dist/parse.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{a as e,c as t,d as n,i as r,n as i,o as a,t as o,u as s}from"./gpu-dispose-Dkj-BKt4.js";import*as c from"three";import{Line2 as l}from"three/addons/lines/Line2.js";import{LineGeometry as u}from"three/addons/lines/LineGeometry.js";import{LineMaterial as d}from"three/addons/lines/LineMaterial.js";import{inflateSync as f}from"fflate";function p(){let e=globalThis.Buffer;return typeof e==`function`?e:void 0}function m(e){let t=e.replace(/[\t\n\f\r ]/g,``);if(t.length%4==0&&(t=t.replace(/={1,2}$/,``)),t.length%4==1||!/^[A-Za-z0-9+/]*$/.test(t))throw new n(`Invalid base64 input.`,s.ENCODING_ERROR,{context:{inputLength:e.length}});let r=p();if(r)return new Uint8Array(r.from(t,`base64`));if(typeof globalThis.atob==`function`){let e=globalThis.atob(t),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t)&255;return n}throw new n(`Base64 decoding not supported in this environment.`,s.INVALID_STATE,{context:{environmentInfo:`atob or Buffer not available`}})}function h(e){return e.map(e=>{let t=e.clone(!0),n=[];e.traverse(e=>n.push(e));let r=0;return t.traverse(e=>{let t=n[r++],i=e;t.geometry&&(i.geometry=t.geometry.clone())}),t})}function g(e){e.forEach(e=>o(e,{materials:!1}))}const _={clone:h,release:g};function v(e,t){let n=t??1;return{color:new c.Color(e??`#ffffff`),transparent:n<1,opacity:n}}function y(e){let t=b(e);if(!t)return null;let n=new u;n.setPositions(t);let r=v(e.color,e.opacity),i=new d({color:r.color}),a=i;a.linewidth=e.width??2,a.transparent=r.transparent,a.opacity=r.opacity;let o=new l(n,i);return o.computeLineDistances(),o.name=e.name,o.userData={source:`compute`,id:e.id,layer:e.layer,kind:`curve`,metadata:e.metadata},o}function b(e){if(!e.points)throw new n(`Curve display item '${e.id}' has no tessellated points. It was produced by an outdated Display component — upgrade it in Grasshopper (Solution → Upgrade obsolete components) and re-save the definition.`,s.INVALID_CONFIG,{context:{itemId:e.id,kind:e.kind}});return e.points.length>=6?e.points:null}function x(e){let{position:n}=e;if(!n||typeof n.X!=`number`||!Number.isFinite(n.X)||typeof n.Y!=`number`||!Number.isFinite(n.Y)||typeof n.Z!=`number`||!Number.isFinite(n.Z))return t().warn(`Skipping point display item with missing or non-finite position (id: ${String(e.id)}).`),null;let r=new c.BufferGeometry;r.setAttribute(`position`,new c.Float32BufferAttribute([n.X,n.Y,n.Z],3));let i=new c.PointsMaterial({...v(e.color,e.opacity),size:6,sizeAttenuation:!1}),a=new c.Points(r,i);return a.name=e.name,a.userData={source:`compute`,id:e.id,layer:e.layer,kind:`point`,metadata:e.metadata},a}function S(e){if(!e||e.length===0)return[];let n=[];for(let r of e)switch(r.kind){case`curve`:{let e=y(r);e&&n.push(e);break}case`point`:{let e=x(r);e&&n.push(e);break}default:{let e=r;t().warn(`Skipping unknown display item kind: ${String(e.kind)}`);break}}return n}const ee=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;function te(e){return typeof e==`string`?m(e):e instanceof Uint8Array?e:new Uint8Array(e)}function C(e){if(e.byteLength<8)return e;let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(t.getUint32(0,!0)!==1515605075)return e;let n=t.getUint32(4,!0),r=e.subarray(8),i=Math.max(r.byteLength*1032+1024,1<<20);if(n>i)throw P(`SLVZ header declares an implausible uncompressed length`,{uncompressedLen:n,deflatedBytes:r.byteLength,maxPlausibleLen:i});let a;try{a=f(r,{out:new Uint8Array(n+1)})}catch(e){throw P(`Failed to inflate SLVZ blob: ${e instanceof Error?e.message:String(e)}`,{uncompressedLen:n,deflatedBytes:r.byteLength})}if(a.byteLength!==n)throw P(`SLVZ payload inflated to a different size than the header declares.`,{declaredLen:n,actualLen:a.byteLength,deflatedBytes:r.byteLength});return a}function w(e){if(typeof TextDecoder<`u`)return new TextDecoder(`utf-8`).decode(e);if(globalThis.Buffer!==void 0)return globalThis.Buffer.from(e).toString(`utf-8`);throw new n(`No UTF-8 decoder available in this environment.`,s.INVALID_STATE)}function ne(e,t,n){if(n===0)return new Int16Array;if(t%2==0)return new Int16Array(e,t,n);let r=new Uint8Array(n*2);return r.set(new Uint8Array(e,t,n*2)),new Int16Array(r.buffer)}function re(e,t,n){if(n===0)return new Float32Array;if(t%4==0)return new Float32Array(e,t,n);let r=new Uint8Array(n*4);return r.set(new Uint8Array(e,t,n*4)),new Float32Array(r.buffer)}function T(e,t,n){if(n===0)return new Uint16Array;if(t%2==0)return new Uint16Array(e,t,n);let r=new Uint8Array(n*2);return r.set(new Uint8Array(e,t,n*2)),new Uint16Array(r.buffer)}function ie(e,t,n){if(n===0)return new Uint32Array;if(t%4==0)return new Uint32Array(e,t,n);let r=new Uint8Array(n*4);return r.set(new Uint8Array(e,t,n*4)),new Uint32Array(r.buffer)}function E(e,t){if(e.length!==0&&!(e instanceof Uint16Array&&t>65535)){for(let n=0;n<e.length;n++)if(e[n]>=t)throw P(`Index out of range of vertexCount.`,{indexPosition:n,indexValue:e[n],vertexCount:t})}}function D(e){return e>>>1^-(e&1)}function O(e){let t=new Int16Array(e.length),n=0,r=0,i=0;for(let a=0;a<e.length;a+=3)n=n+D(e[a])<<16>>16,r=r+D(e[a+1])<<16>>16,i=i+D(e[a+2])<<16>>16,t[a]=n,t[a+1]=r,t[a+2]=i;return t}function k(e,t){let n=new Int16Array(t*3),r=t,i=0,a=0,o=0;for(let t=0;t<r;t++)i=i+D(e[t]|e[r*3+t]<<8)<<16>>16,a=a+D(e[r+t]|e[r*4+t]<<8)<<16>>16,o=o+D(e[r*2+t]|e[r*5+t]<<8)<<16>>16,n[t*3]=i,n[t*3+1]=a,n[t*3+2]=o;return n}function A(e,t){let n=new Uint16Array(t),r=0;for(let i=0;i<t;i++)r=r+D(e[i]|e[t+i]<<8)&65535,n[i]=r;return n}function j(e,t){let n=new Uint32Array(t),r=0;for(let i=0;i<t;i++){let a=(e[i]|e[t+i]<<8|e[t*2+i]<<16|e[t*3+i]<<24)>>>0;r=r+D(a)>>>0,n[i]=r}return n}function M(e){let t=new Uint16Array(e.length),n=0;for(let r=0;r<e.length;r++)n=n+D(e[r])&65535,t[r]=n;return t}function N(e){let t=new Uint32Array(e.length),n=0;for(let r=0;r<e.length;r++)n=n+D(e[r])>>>0,t[r]=n;return t}function P(e,t){return new n(e,s.VALIDATION_ERROR,{context:t})}function ae(e,t,n,r,i,a=!1){if(n+36>e.byteLength)throw P(`Insufficient data to read UV chunk header.`,{expectedBytes:36,availableBytes:e.byteLength-n,offset:n});let o=t.getUint32(n,!0);n+=4;let s=t.getFloat64(n,!0);n+=8;let c=t.getFloat64(n,!0);n+=8;let l=t.getFloat64(n,!0);n+=8;let u=t.getFloat64(n,!0);n+=8;let d=r*2,f=o===1,p=d*(f?4:2);if(n+p>e.byteLength)throw P(`Insufficient data to read UV chunk.`,{expectedBytes:p,availableBytes:e.byteLength-n,offset:n,uvFormat:o,vertexCount:r});let m=e.byteOffset+n,h;if(f)h=re(e.buffer,m,d).slice();else if(a){let t=e.subarray(n,n+p),i=r;h=new Float32Array(d);let a=0,o=0;for(let e=0;e<i;e++)a=a+D(t[e]|t[i*2+e]<<8)&65535,o=o+D(t[i+e]|t[i*3+e]<<8)&65535,h[e*2]=s+a*l,h[e*2+1]=c+o*u}else{let t=T(e.buffer,m,d);h=new Float32Array(d);let n=0,r=0;for(let e=0;e<d;e+=2)i?(n=n+D(t[e])&65535,r=r+D(t[e+1])&65535):(n=t[e],r=t[e+1]),h[e]=s+n*l,h[e+1]=c+r*u}return{uvs:h,offset:n+p}}function oe(e,t,n,r){let i=n*3;if(t+i>e.byteLength)throw P(`Insufficient data to read vertex-color chunk.`,{expectedBytes:i,availableBytes:e.byteLength-t,offset:t,vertexCount:n});let a=e.subarray(t,t+i);if(!r)return a.slice();let o=new Uint8Array(i),s=0,c=0,l=0;for(let e=0;e<i;e+=3)s=s+D(a[e])&255,c=c+D(a[e+1])&255,l=l+D(a[e+2])&255,o[e]=s,o[e+1]=c,o[e+2]=l;return o}function se(e){return e.byteLength>=4&&new DataView(e.buffer,e.byteOffset,4).getUint32(0,!0)===1297501267}function ce(e){let t=F(e),n=null,r=null,i=null,a=[];for(let{type:e,payload:o}of t)switch(e){case 1297040711:n=o;break;case 1279410516:r=C(o);break;case 1280590157:i=w(o);break;case 1381516628:a.push(o)}if(n===null)throw P(`SLVM container has no GEOM chunk.`,{chunkCount:t.length});if(r===null)throw P(`SLVM container has no TABL chunk.`,{chunkCount:t.length});let{groups:o}=le(r),s=ue(i,a);return{geometryBlob:n,metadata:{materials:s,groups:o}}}function F(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.byteLength<12||t.getUint32(0,!0)!==1297501267)throw P(`Not an SLVM container (bad magic).`,{byteLength:e.byteLength});let n=t.getUint32(4,!0);if(n!==3)throw P(`Unsupported SLVM version: ${n}`,{expectedVersion:3});let r=t.getUint32(8,!0),i=[],a=12;for(let n=0;n<r;n++){if(a+8>e.byteLength)throw P(`Truncated SLVM chunk header.`,{offset:a,chunkIndex:n});let r=t.getUint32(a,!0),o=t.getUint32(a+4,!0);if(a+=8,a+o>e.byteLength)throw P(`Truncated SLVM chunk payload.`,{offset:a,chunkIndex:n,byteLen:o});i.push({type:r,payload:e.subarray(a,a+o)}),a+=o+(4-o%4)%4}return i}function I(e){let t=0,n=0;for(;;){if(e.pos>=e.bytes.byteLength||n>28)throw P(`Malformed varint in SLVM table.`,{pos:e.pos});let r=e.bytes[e.pos++];if(t|=(r&127)<<n,!(r&128))return t>>>0;n+=7}}function L(e,t,n){let r=e.bytes[e.pos++],i=Array(t);switch(r){case 0:i.fill(``);break;case 1:for(let e=0;e<t;e++)i[e]=String(e+1);break;case 2:for(let r=0;r<t;r++)i[r]=n[I(e)]??``;break;default:throw P(`Unknown SLVM string column mode: ${r}`,{pos:e.pos})}return i}function le(e){let t={bytes:e,pos:0},n=I(t),r=I(t),i=I(t),a=n+r+i,o=I(t),s=Array(o);for(let n=0;n<o;n++){let r=I(t);s[n]=w(e.subarray(t.pos,t.pos+r)),t.pos+=r}let c=Array(n),l=Array(n);for(let e=0;e<n;e++)c[e]=I(t),l[e]=I(t);for(let e=0;e<r;e++)I(t);let u=I(t),d=[];for(let e=0;e<u;e++)d.push({materialId:I(t),meshCount:I(t)});let f=L(t,a,s),p=L(t,a,s),m=Array(a),h=I(t);for(let e=0;e<h;e++){let e=s[I(t)]??``,n=I(t),r=Array(n),i=0;for(let e=0;e<n;e++)i+=I(t),r[e]=i;for(let i=0;i<n;i++){let n=s[I(t)]??``,a=r[i];(m[a]??={})[e]=n}}let g=d.length>0||n===0?d:[{materialId:0,meshCount:n}],_=[],v=0,y=0,b=0;for(let e of g){let t=[];for(let r=0;r<e.meshCount&&v<n;r++,v++){let e=m[v],n=e?.id;e!==void 0&&delete e.id,t.push({id:n,name:f[v],layer:p[v],vertexCount:c[v],indexCount:l[v]*3,vertexStart:y,indexStart:b,metadata:e??{}}),y+=c[v],b+=l[v]*3}_.push({materialId:e.materialId,meshes:t})}return{groups:_}}function ue(e,t){if(e===null)return[];let n;try{n=JSON.parse(e).materials??[]}catch(t){throw P(`Failed to parse SLVM materials JSON: ${t instanceof Error?t.message:String(t)}`,{byteLength:e.length})}for(let e of n)if(e.map?.startsWith(`slvm:tex:`)){let n=t[Number(e.map.slice(9))];n!==void 0&&(e.map=de(n))}return n}function de(e){let t={bytes:e,pos:0},n=I(t),r=w(e.subarray(t.pos,t.pos+n)),i=e.subarray(t.pos+n),a=``,o=32768;for(let e=0;e<i.byteLength;e+=o)a+=String.fromCharCode(...i.subarray(e,e+o));return`data:${r};base64,${btoa(a)}`}function R(e){let t=z(e),n;n=t.isFloat32?t.vertexData:t.planarByteSplit?k(t.vertexData,t.vertexCount):t.deltaEncoded?O(t.vertexData):t.vertexData;let r;if(t.planarByteSplit){let e=t.indexData;r=t.uint16Indices?A(e,e.length/2):j(e,e.length/4)}else r=t.deltaEncoded?t.indexData instanceof Uint16Array?M(t.indexData):N(t.indexData):t.indexData;return E(r,t.vertexCount),{metadata:t.metadata,flags:t.flags,vertices:n,indices:r,origin:t.origin,scale:t.scale,uvs:t.uvs,colors:t.colors}}function z(e){if(!ee)throw new n(`SLVA parsing requires a little-endian host: the zero-copy geometry readers view the wire bytes in host byte order.`,s.ENVIRONMENT_ERROR);let t=te(e);if(se(t)){let e=ce(t),n=z(e.geometryBlob);return n.metadata=e.metadata,n}let r=C(t),i=new DataView(r.buffer,r.byteOffset,r.byteLength);if(r.byteLength<12)throw P(`Blob too small to contain SLVA header.`,{expectedBytes:12,availableBytes:r.byteLength});let a=0,o=i.getUint32(a,!0);if(a+=4,o!==1096174675)throw P(`Invalid SLVA magic: 0x${o.toString(16)}`,{expectedMagic:`0x41564c53`,actualMagic:`0x${o.toString(16)}`});let c=i.getUint32(a,!0);if(a+=4,c<1||c>4)throw P(`Unsupported SLVA version: ${c}`,{minSupportedVersion:1,maxSupportedVersion:4,actualVersion:c});let l=i.getUint32(a,!0);if(a+=4,a+l>r.byteLength)throw P(`Insufficient data to read metadata JSON.`,{expectedBytes:l,availableBytes:r.byteLength-a,offset:a});let u=r.subarray(a,a+l);a+=l;let d;try{d=l===0?{}:JSON.parse(w(u))}catch(e){throw P(`Failed to parse metadata JSON: ${e instanceof Error?e.message:String(e)}`,{metadataLen:l})}if(a+56>r.byteLength)throw P(`Insufficient data to read geometry header.`,{expectedBytes:56,availableBytes:r.byteLength-a,offset:a});let f=i.getUint32(a,!0);a+=4;let p=i.getFloat64(a,!0);a+=8;let m=i.getFloat64(a,!0);a+=8;let h=i.getFloat64(a,!0);a+=8;let g=i.getFloat64(a,!0);a+=8;let _=i.getFloat64(a,!0);a+=8;let v=i.getFloat64(a,!0);a+=8;let y=i.getUint32(a,!0);a+=4;let b=!!(f&1),x=!!(f&4),S=!!(f&32),E=y*3,D=E*(b?4:2);if(a+D>r.byteLength)throw P(`Insufficient data to read vertices.`,{expectedBytes:D,availableBytes:r.byteLength-a,offset:a,useFloat32:b,vertexCount:y});let O=r.byteOffset+a,k;if(k=b?re(r.buffer,O,E):S?r.subarray(a,a+D):x?T(r.buffer,O,E):ne(r.buffer,O,E),a+=D,a+4>r.byteLength)throw P(`Insufficient data to read index count.`,{expectedBytes:4,availableBytes:r.byteLength-a,offset:a});let A=i.getUint32(a,!0);a+=4;let j=!!(f&2),M=A*(j?2:4);if(a+M>r.byteLength)throw P(`Insufficient data to read indices.`,{expectedBytes:M,availableBytes:r.byteLength-a,offset:a,indexCount:A,useUint16Indices:j});let N=S?r.subarray(a,a+M):j?T(r.buffer,r.byteOffset+a,A):ie(r.buffer,r.byteOffset+a,A);a+=M;let F=null;if(f&8){let e=ae(r,i,a,y,x,S);F=e.uvs,a=e.offset}let I=null;return f&16&&(I=oe(r,a,y,x)),{metadata:d,flags:f,vertexData:k,indexData:N,isFloat32:b,deltaEncoded:x,planarByteSplit:S,uint16Indices:j,vertexCount:y,origin:[p,m,h],scale:[g,_,v],uvs:F,colors:I}}function fe(e){let{isFloat32:t,deltaEncoded:n,planarByteSplit:r,uint16Indices:i,origin:a,scale:o,uvs:s,colors:c,jobs:l}=e,u=e=>e>>>1^-(e&1),d;if(t)d=e.vertexData;else{let t;if(r){let n=e.vertexData,r=n.length/6;t=new Int16Array(r*3);let i=0,a=0,o=0;for(let e=0;e<r;e++)i=i+u(n[e]|n[r*3+e]<<8)<<16>>16,a=a+u(n[r+e]|n[r*4+e]<<8)<<16>>16,o=o+u(n[r*2+e]|n[r*5+e]<<8)<<16>>16,t[e*3]=i,t[e*3+1]=a,t[e*3+2]=o}else if(n){let n=e.vertexData;t=new Int16Array(n.length);let r=0,i=0,a=0;for(let e=0;e<n.length;e+=3)r=r+u(n[e])<<16>>16,i=i+u(n[e+1])<<16>>16,a=a+u(n[e+2])<<16>>16,t[e]=r,t[e+1]=i,t[e+2]=a}else t=e.vertexData;d=new Float32Array(t.length);let i=a[0],s=a[1],c=a[2],l=o[0],f=o[1],p=o[2];for(let e=0;e<t.length;e+=3)d[e]=i+(t[e]+32767)*l,d[e+1]=s+(t[e+1]+32767)*f,d[e+2]=c+(t[e+2]+32767)*p}let f;if(r){let t=e.indexData;if(i){let e=t.length/2,n=new Uint16Array(e),r=0;for(let i=0;i<e;i++)r=r+u(t[i]|t[e+i]<<8)&65535,n[i]=r;f=n}else{let e=t.length/4,n=new Uint32Array(e),r=0;for(let i=0;i<e;i++){let a=(t[i]|t[e+i]<<8|t[e*2+i]<<16|t[e*3+i]<<24)>>>0;r=r+u(a)>>>0,n[i]=r}f=n}}else if(n){let t=e.indexData;if(t instanceof Uint16Array){let e=new Uint16Array(t.length),n=0;for(let r=0;r<t.length;r++)n=n+u(t[r])&65535,e[r]=n;f=e}else{let e=new Uint32Array(t.length),n=0;for(let r=0;r<t.length;r++)n=n+u(t[r])>>>0,e[r]=n;f=e}}else f=e.indexData;let p=d.length/3;for(let e=0;e<f.length;e++)if(f[e]>=p)throw Error(`Index ${f[e]} out of range of vertexCount ${p}`);let m=[];for(let e of l){let t=0,n=0;for(let r of e.windows)t+=r.vertexCount,n+=r.indexCount;let r=new Float32Array(t*3),i=new Uint32Array(n),a=s?new Float32Array(t*2):null,o=c?new Uint8Array(t*3):null,l=0,u=0;for(let t of e.windows){let e=t.vertexStart*3;r.set(d.subarray(e,e+t.vertexCount*3),l*3),a&&s&&a.set(s.subarray(t.vertexStart*2,(t.vertexStart+t.vertexCount)*2),l*2),o&&c&&o.set(c.subarray(e,e+t.vertexCount*3),l*3);let n=t.vertexStart,p=t.vertexStart+t.vertexCount,m=l-t.vertexStart;for(let e=0;e<t.indexCount;e++){let r=f[t.indexStart+e];if(r<n||r>=p)throw Error(`Index ${r} outside vertex window [${n}, ${p})`);i[u+e]=r+m}l+=t.vertexCount,u+=t.indexCount}let p=new Float32Array(t*3);for(let e=0;e<i.length;e+=3){let t=i[e]*3,n=i[e+1]*3,a=i[e+2]*3,o=r[a]-r[n],s=r[a+1]-r[n+1],c=r[a+2]-r[n+2],l=r[t]-r[n],u=r[t+1]-r[n+1],d=r[t+2]-r[n+2],f=s*d-c*u,m=c*l-o*d,h=o*u-s*l;p[t]+=f,p[t+1]+=m,p[t+2]+=h,p[n]+=f,p[n+1]+=m,p[n+2]+=h,p[a]+=f,p[a+1]+=m,p[a+2]+=h}for(let e=0;e<p.length;e+=3){let t=p[e],n=p[e+1],r=p[e+2],i=Math.sqrt(t*t+n*n+r*r)||1;p[e]=t/i,p[e+1]=n/i,p[e+2]=r/i}m.push({positions:r,normals:p,indices:i,uvs:a,colors:o})}return m}function pe(){return[`const assemble = ${fe.toString()};`,`self.onmessage = (event) => {`,` const { id, input } = event.data;`,` try {`,` const geometries = assemble(input);`,` const transfer = [];`,` for (const g of geometries) {`,` transfer.push(g.positions.buffer, g.normals.buffer, g.indices.buffer);`,` if (g.uvs) transfer.push(g.uvs.buffer);`,` if (g.colors) transfer.push(g.colors.buffer);`,` }`,` self.postMessage({ id, geometries }, transfer);`,` } catch (error) {`,` self.postMessage({ id, error: String((error && error.message) || error) });`,` }`,`};`].join(`
|
|
2
|
-
`)}let B;const V=new Map;let
|
|
1
|
+
import{a as e,f as t,h as n,i as r,l as i,m as a,n as o,o as s,t as c}from"./gpu-dispose-Cl2f9lUC.js";import*as l from"three";import{Line2 as u}from"three/addons/lines/Line2.js";import{LineGeometry as d}from"three/addons/lines/LineGeometry.js";import{LineMaterial as f}from"three/addons/lines/LineMaterial.js";import{inflateSync as p}from"fflate";function m(){let e=globalThis.Buffer;return typeof e==`function`?e:void 0}function h(e){let t=e.replace(/[\t\n\f\r ]/g,``);if(t.length%4==0&&(t=t.replace(/={1,2}$/,``)),t.length%4==1||!/^[A-Za-z0-9+/]*$/.test(t))throw new n(`Invalid base64 input.`,a.ENCODING_ERROR,{context:{inputLength:e.length}});let r=m();if(r)return new Uint8Array(r.from(t,`base64`));if(typeof globalThis.atob==`function`){let e=globalThis.atob(t),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t)&255;return n}throw new n(`Base64 decoding not supported in this environment.`,a.INVALID_STATE,{context:{environmentInfo:`atob or Buffer not available`}})}function g(e){return e.map(e=>{let t=e.clone(!0),n=[];e.traverse(e=>n.push(e));let r=0;return t.traverse(e=>{let t=n[r++],i=e;t.geometry&&(i.geometry=t.geometry.clone())}),t})}function _(e){e.forEach(e=>c(e,{materials:!1}))}const v={clone:g,release:_};function y(e,t){let n=t??1;return{color:new l.Color(e??`#ffffff`),transparent:n<1,opacity:n}}function b(e){let t=x(e);if(!t)return null;let n=new d;n.setPositions(t);let r=y(e.color,e.opacity),i=new f({color:r.color}),a=i;a.linewidth=e.width??2,a.transparent=r.transparent,a.opacity=r.opacity;let o=new u(n,i);return o.computeLineDistances(),o.name=e.name,o.userData={source:`compute`,id:e.id,layer:e.layer,kind:`curve`,metadata:e.metadata},o}function x(e){if(!e.points)throw new n(`Curve display item '${e.id}' has no tessellated points. It was produced by an outdated Display component — upgrade it in Grasshopper (Solution → Upgrade obsolete components) and re-save the definition.`,a.INVALID_CONFIG,{context:{itemId:e.id,kind:e.kind}});return e.points.length>=6?e.points:null}function S(e){let{position:n}=e;if(!n||typeof n.X!=`number`||!Number.isFinite(n.X)||typeof n.Y!=`number`||!Number.isFinite(n.Y)||typeof n.Z!=`number`||!Number.isFinite(n.Z))return t().warn(`Skipping point display item with missing or non-finite position (id: ${String(e.id)}).`),null;let r=new l.BufferGeometry;r.setAttribute(`position`,new l.Float32BufferAttribute([n.X,n.Y,n.Z],3));let i=new l.PointsMaterial({...y(e.color,e.opacity),size:6,sizeAttenuation:!1}),a=new l.Points(r,i);return a.name=e.name,a.userData={source:`compute`,id:e.id,layer:e.layer,kind:`point`,metadata:e.metadata},a}function C(e){if(!e||e.length===0)return[];let n=[];for(let r of e)switch(r.kind){case`curve`:{let e=b(r);e&&n.push(e);break}case`point`:{let e=S(r);e&&n.push(e);break}default:{let e=r;t().warn(`Skipping unknown display item kind: ${String(e.kind)}`);break}}return n}const ee=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;function te(e){return typeof e==`string`?h(e):e instanceof Uint8Array?e:new Uint8Array(e)}function w(e){if(e.byteLength<8)return e;let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(t.getUint32(0,!0)!==1515605075)return e;let n=t.getUint32(4,!0),r=e.subarray(8),i=Math.max(r.byteLength*1032+1024,1<<20);if(n>i)throw F(`SLVZ header declares an implausible uncompressed length`,{uncompressedLen:n,deflatedBytes:r.byteLength,maxPlausibleLen:i});let a;try{a=p(r,{out:new Uint8Array(n+1)})}catch(e){throw F(`Failed to inflate SLVZ blob: ${e instanceof Error?e.message:String(e)}`,{uncompressedLen:n,deflatedBytes:r.byteLength})}if(a.byteLength!==n)throw F(`SLVZ payload inflated to a different size than the header declares.`,{declaredLen:n,actualLen:a.byteLength,deflatedBytes:r.byteLength});return a}function T(e){if(typeof TextDecoder<`u`)return new TextDecoder(`utf-8`).decode(e);if(globalThis.Buffer!==void 0)return globalThis.Buffer.from(e).toString(`utf-8`);throw new n(`No UTF-8 decoder available in this environment.`,a.INVALID_STATE)}function ne(e,t,n){if(n===0)return new Int16Array;if(t%2==0)return new Int16Array(e,t,n);let r=new Uint8Array(n*2);return r.set(new Uint8Array(e,t,n*2)),new Int16Array(r.buffer)}function re(e,t,n){if(n===0)return new Float32Array;if(t%4==0)return new Float32Array(e,t,n);let r=new Uint8Array(n*4);return r.set(new Uint8Array(e,t,n*4)),new Float32Array(r.buffer)}function E(e,t,n){if(n===0)return new Uint16Array;if(t%2==0)return new Uint16Array(e,t,n);let r=new Uint8Array(n*2);return r.set(new Uint8Array(e,t,n*2)),new Uint16Array(r.buffer)}function ie(e,t,n){if(n===0)return new Uint32Array;if(t%4==0)return new Uint32Array(e,t,n);let r=new Uint8Array(n*4);return r.set(new Uint8Array(e,t,n*4)),new Uint32Array(r.buffer)}function D(e,t){if(e.length!==0&&!(e instanceof Uint16Array&&t>65535)){for(let n=0;n<e.length;n++)if(e[n]>=t)throw F(`Index out of range of vertexCount.`,{indexPosition:n,indexValue:e[n],vertexCount:t})}}function O(e){return e>>>1^-(e&1)}function k(e){let t=new Int16Array(e.length),n=0,r=0,i=0;for(let a=0;a<e.length;a+=3)n=n+O(e[a])<<16>>16,r=r+O(e[a+1])<<16>>16,i=i+O(e[a+2])<<16>>16,t[a]=n,t[a+1]=r,t[a+2]=i;return t}function A(e,t){let n=new Int16Array(t*3),r=t,i=0,a=0,o=0;for(let t=0;t<r;t++)i=i+O(e[t]|e[r*3+t]<<8)<<16>>16,a=a+O(e[r+t]|e[r*4+t]<<8)<<16>>16,o=o+O(e[r*2+t]|e[r*5+t]<<8)<<16>>16,n[t*3]=i,n[t*3+1]=a,n[t*3+2]=o;return n}function j(e,t){let n=new Uint16Array(t),r=0;for(let i=0;i<t;i++)r=r+O(e[i]|e[t+i]<<8)&65535,n[i]=r;return n}function M(e,t){let n=new Uint32Array(t),r=0;for(let i=0;i<t;i++){let a=(e[i]|e[t+i]<<8|e[t*2+i]<<16|e[t*3+i]<<24)>>>0;r=r+O(a)>>>0,n[i]=r}return n}function N(e){let t=new Uint16Array(e.length),n=0;for(let r=0;r<e.length;r++)n=n+O(e[r])&65535,t[r]=n;return t}function P(e){let t=new Uint32Array(e.length),n=0;for(let r=0;r<e.length;r++)n=n+O(e[r])>>>0,t[r]=n;return t}function F(e,t){return new n(e,a.VALIDATION_ERROR,{context:t})}function ae(e,t,n,r,i,a=!1){if(n+36>e.byteLength)throw F(`Insufficient data to read UV chunk header.`,{expectedBytes:36,availableBytes:e.byteLength-n,offset:n});let o=t.getUint32(n,!0);n+=4;let s=t.getFloat64(n,!0);n+=8;let c=t.getFloat64(n,!0);n+=8;let l=t.getFloat64(n,!0);n+=8;let u=t.getFloat64(n,!0);n+=8;let d=r*2,f=o===1,p=d*(f?4:2);if(n+p>e.byteLength)throw F(`Insufficient data to read UV chunk.`,{expectedBytes:p,availableBytes:e.byteLength-n,offset:n,uvFormat:o,vertexCount:r});let m=e.byteOffset+n,h;if(f)h=re(e.buffer,m,d).slice();else if(a){let t=e.subarray(n,n+p),i=r;h=new Float32Array(d);let a=0,o=0;for(let e=0;e<i;e++)a=a+O(t[e]|t[i*2+e]<<8)&65535,o=o+O(t[i+e]|t[i*3+e]<<8)&65535,h[e*2]=s+a*l,h[e*2+1]=c+o*u}else{let t=E(e.buffer,m,d);h=new Float32Array(d);let n=0,r=0;for(let e=0;e<d;e+=2)i?(n=n+O(t[e])&65535,r=r+O(t[e+1])&65535):(n=t[e],r=t[e+1]),h[e]=s+n*l,h[e+1]=c+r*u}return{uvs:h,offset:n+p}}function oe(e,t,n,r){let i=n*3;if(t+i>e.byteLength)throw F(`Insufficient data to read vertex-color chunk.`,{expectedBytes:i,availableBytes:e.byteLength-t,offset:t,vertexCount:n});let a=e.subarray(t,t+i);if(!r)return a.slice();let o=new Uint8Array(i),s=0,c=0,l=0;for(let e=0;e<i;e+=3)s=s+O(a[e])&255,c=c+O(a[e+1])&255,l=l+O(a[e+2])&255,o[e]=s,o[e+1]=c,o[e+2]=l;return o}function se(e){return e.byteLength>=4&&new DataView(e.buffer,e.byteOffset,4).getUint32(0,!0)===1297501267}function ce(e){let t=I(e),n=null,r=null,i=null,a=[];for(let{type:e,payload:o}of t)switch(e){case 1297040711:n=o;break;case 1279410516:r=w(o);break;case 1280590157:i=T(o);break;case 1381516628:a.push(o)}if(n===null)throw F(`SLVM container has no GEOM chunk.`,{chunkCount:t.length});if(r===null)throw F(`SLVM container has no TABL chunk.`,{chunkCount:t.length});let{groups:o}=ue(r),s=de(i,a);return{geometryBlob:n,metadata:{materials:s,groups:o}}}function I(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.byteLength<12||t.getUint32(0,!0)!==1297501267)throw F(`Not an SLVM container (bad magic).`,{byteLength:e.byteLength});let n=t.getUint32(4,!0);if(n!==3)throw F(`Unsupported SLVM version: ${n}`,{expectedVersion:3});let r=t.getUint32(8,!0),i=[],a=12;for(let n=0;n<r;n++){if(a+8>e.byteLength)throw F(`Truncated SLVM chunk header.`,{offset:a,chunkIndex:n});let r=t.getUint32(a,!0),o=t.getUint32(a+4,!0);if(a+=8,a+o>e.byteLength)throw F(`Truncated SLVM chunk payload.`,{offset:a,chunkIndex:n,byteLen:o});i.push({type:r,payload:e.subarray(a,a+o)}),a+=o+(4-o%4)%4}return i}function L(e){let t=0,n=0;for(;;){if(e.pos>=e.bytes.byteLength||n>28)throw F(`Malformed varint in SLVM table.`,{pos:e.pos});let r=e.bytes[e.pos++];if(t|=(r&127)<<n,!(r&128))return t>>>0;n+=7}}function le(e,t,n){let r=e.bytes[e.pos++],i=Array(t);switch(r){case 0:i.fill(``);break;case 1:for(let e=0;e<t;e++)i[e]=String(e+1);break;case 2:for(let r=0;r<t;r++)i[r]=n[L(e)]??``;break;default:throw F(`Unknown SLVM string column mode: ${r}`,{pos:e.pos})}return i}function ue(e){let t={bytes:e,pos:0},n=L(t),r=L(t),i=L(t),a=n+r+i,o=L(t),s=Array(o);for(let n=0;n<o;n++){let r=L(t);s[n]=T(e.subarray(t.pos,t.pos+r)),t.pos+=r}let c=Array(n),l=Array(n);for(let e=0;e<n;e++)c[e]=L(t),l[e]=L(t);for(let e=0;e<r;e++)L(t);let u=L(t),d=[];for(let e=0;e<u;e++)d.push({materialId:L(t),meshCount:L(t)});let f=le(t,a,s),p=le(t,a,s),m=Array(a),h=L(t);for(let e=0;e<h;e++){let e=s[L(t)]??``,n=L(t),r=Array(n),i=0;for(let e=0;e<n;e++)i+=L(t),r[e]=i;for(let i=0;i<n;i++){let n=s[L(t)]??``,a=r[i];(m[a]??={})[e]=n}}let g=d.length>0||n===0?d:[{materialId:0,meshCount:n}],_=[],v=0,y=0,b=0;for(let e of g){let t=[];for(let r=0;r<e.meshCount&&v<n;r++,v++){let e=m[v],n=e?.id;e!==void 0&&delete e.id,t.push({id:n,name:f[v],layer:p[v],vertexCount:c[v],indexCount:l[v]*3,vertexStart:y,indexStart:b,metadata:e??{}}),y+=c[v],b+=l[v]*3}_.push({materialId:e.materialId,meshes:t})}return{groups:_}}function de(e,t){if(e===null)return[];let n;try{n=JSON.parse(e).materials??[]}catch(t){throw F(`Failed to parse SLVM materials JSON: ${t instanceof Error?t.message:String(t)}`,{byteLength:e.length})}for(let e of n)for(let n of fe){let r=e[n];if(r?.startsWith(`slvm:tex:`)){let i=t[Number(r.slice(9))];i!==void 0&&(e[n]=pe(i))}}return n}const fe=[`map`,`roughnessMap`,`normalMap`];function pe(e){let t={bytes:e,pos:0},n=L(t),r=T(e.subarray(t.pos,t.pos+n)),i=e.subarray(t.pos+n),a=``,o=32768;for(let e=0;e<i.byteLength;e+=o)a+=String.fromCharCode(...i.subarray(e,e+o));return`data:${r};base64,${btoa(a)}`}function R(e){let t=z(e),n;n=t.isFloat32?t.vertexData:t.planarByteSplit?A(t.vertexData,t.vertexCount):t.deltaEncoded?k(t.vertexData):t.vertexData;let r;if(t.planarByteSplit){let e=t.indexData;r=t.uint16Indices?j(e,e.length/2):M(e,e.length/4)}else r=t.deltaEncoded?t.indexData instanceof Uint16Array?N(t.indexData):P(t.indexData):t.indexData;return D(r,t.vertexCount),{metadata:t.metadata,flags:t.flags,vertices:n,indices:r,origin:t.origin,scale:t.scale,uvs:t.uvs,colors:t.colors}}function z(e){if(!ee)throw new n(`SLVA parsing requires a little-endian host: the zero-copy geometry readers view the wire bytes in host byte order.`,a.ENVIRONMENT_ERROR);let t=te(e);if(se(t)){let e=ce(t),n=z(e.geometryBlob);return n.metadata=e.metadata,n}let r=w(t),i=new DataView(r.buffer,r.byteOffset,r.byteLength);if(r.byteLength<12)throw F(`Blob too small to contain SLVA header.`,{expectedBytes:12,availableBytes:r.byteLength});let o=0,s=i.getUint32(o,!0);if(o+=4,s!==1096174675)throw F(`Invalid SLVA magic: 0x${s.toString(16)}`,{expectedMagic:`0x41564c53`,actualMagic:`0x${s.toString(16)}`});let c=i.getUint32(o,!0);if(o+=4,c<1||c>4)throw F(`Unsupported SLVA version: ${c}`,{minSupportedVersion:1,maxSupportedVersion:4,actualVersion:c});let l=i.getUint32(o,!0);if(o+=4,o+l>r.byteLength)throw F(`Insufficient data to read metadata JSON.`,{expectedBytes:l,availableBytes:r.byteLength-o,offset:o});let u=r.subarray(o,o+l);o+=l;let d;try{d=l===0?{}:JSON.parse(T(u))}catch(e){throw F(`Failed to parse metadata JSON: ${e instanceof Error?e.message:String(e)}`,{metadataLen:l})}if(o+56>r.byteLength)throw F(`Insufficient data to read geometry header.`,{expectedBytes:56,availableBytes:r.byteLength-o,offset:o});let f=i.getUint32(o,!0);o+=4;let p=i.getFloat64(o,!0);o+=8;let m=i.getFloat64(o,!0);o+=8;let h=i.getFloat64(o,!0);o+=8;let g=i.getFloat64(o,!0);o+=8;let _=i.getFloat64(o,!0);o+=8;let v=i.getFloat64(o,!0);o+=8;let y=i.getUint32(o,!0);o+=4;let b=!!(f&1),x=!!(f&4),S=!!(f&32),C=y*3,D=C*(b?4:2);if(o+D>r.byteLength)throw F(`Insufficient data to read vertices.`,{expectedBytes:D,availableBytes:r.byteLength-o,offset:o,useFloat32:b,vertexCount:y});let O=r.byteOffset+o,k;if(k=b?re(r.buffer,O,C):S?r.subarray(o,o+D):x?E(r.buffer,O,C):ne(r.buffer,O,C),o+=D,o+4>r.byteLength)throw F(`Insufficient data to read index count.`,{expectedBytes:4,availableBytes:r.byteLength-o,offset:o});let A=i.getUint32(o,!0);o+=4;let j=!!(f&2),M=A*(j?2:4);if(o+M>r.byteLength)throw F(`Insufficient data to read indices.`,{expectedBytes:M,availableBytes:r.byteLength-o,offset:o,indexCount:A,useUint16Indices:j});let N=S?r.subarray(o,o+M):j?E(r.buffer,r.byteOffset+o,A):ie(r.buffer,r.byteOffset+o,A);o+=M;let P=null;if(f&8){let e=ae(r,i,o,y,x,S);P=e.uvs,o=e.offset}let I=null;return f&16&&(I=oe(r,o,y,x)),{metadata:d,flags:f,vertexData:k,indexData:N,isFloat32:b,deltaEncoded:x,planarByteSplit:S,uint16Indices:j,vertexCount:y,origin:[p,m,h],scale:[g,_,v],uvs:P,colors:I}}function me(e){let{isFloat32:t,deltaEncoded:n,planarByteSplit:r,uint16Indices:i,origin:a,scale:o,uvs:s,colors:c,jobs:l}=e,u=e=>e>>>1^-(e&1),d;if(t)d=e.vertexData;else{let t;if(r){let n=e.vertexData,r=n.length/6;t=new Int16Array(r*3);let i=0,a=0,o=0;for(let e=0;e<r;e++)i=i+u(n[e]|n[r*3+e]<<8)<<16>>16,a=a+u(n[r+e]|n[r*4+e]<<8)<<16>>16,o=o+u(n[r*2+e]|n[r*5+e]<<8)<<16>>16,t[e*3]=i,t[e*3+1]=a,t[e*3+2]=o}else if(n){let n=e.vertexData;t=new Int16Array(n.length);let r=0,i=0,a=0;for(let e=0;e<n.length;e+=3)r=r+u(n[e])<<16>>16,i=i+u(n[e+1])<<16>>16,a=a+u(n[e+2])<<16>>16,t[e]=r,t[e+1]=i,t[e+2]=a}else t=e.vertexData;d=new Float32Array(t.length);let i=a[0],s=a[1],c=a[2],l=o[0],f=o[1],p=o[2];for(let e=0;e<t.length;e+=3)d[e]=i+(t[e]+32767)*l,d[e+1]=s+(t[e+1]+32767)*f,d[e+2]=c+(t[e+2]+32767)*p}let f;if(r){let t=e.indexData;if(i){let e=t.length/2,n=new Uint16Array(e),r=0;for(let i=0;i<e;i++)r=r+u(t[i]|t[e+i]<<8)&65535,n[i]=r;f=n}else{let e=t.length/4,n=new Uint32Array(e),r=0;for(let i=0;i<e;i++){let a=(t[i]|t[e+i]<<8|t[e*2+i]<<16|t[e*3+i]<<24)>>>0;r=r+u(a)>>>0,n[i]=r}f=n}}else if(n){let t=e.indexData;if(t instanceof Uint16Array){let e=new Uint16Array(t.length),n=0;for(let r=0;r<t.length;r++)n=n+u(t[r])&65535,e[r]=n;f=e}else{let e=new Uint32Array(t.length),n=0;for(let r=0;r<t.length;r++)n=n+u(t[r])>>>0,e[r]=n;f=e}}else f=e.indexData;let p=d.length/3;for(let e=0;e<f.length;e++)if(f[e]>=p)throw Error(`Index ${f[e]} out of range of vertexCount ${p}`);let m=[];for(let e of l){let t=0,n=0;for(let r of e.windows)t+=r.vertexCount,n+=r.indexCount;let r=new Float32Array(t*3),i=new Uint32Array(n),a=s?new Float32Array(t*2):null,o=c?new Uint8Array(t*3):null,l=0,u=0;for(let t of e.windows){let e=t.vertexStart*3;r.set(d.subarray(e,e+t.vertexCount*3),l*3),a&&s&&a.set(s.subarray(t.vertexStart*2,(t.vertexStart+t.vertexCount)*2),l*2),o&&c&&o.set(c.subarray(e,e+t.vertexCount*3),l*3);let n=t.vertexStart,p=t.vertexStart+t.vertexCount,m=l-t.vertexStart;for(let e=0;e<t.indexCount;e++){let r=f[t.indexStart+e];if(r<n||r>=p)throw Error(`Index ${r} outside vertex window [${n}, ${p})`);i[u+e]=r+m}l+=t.vertexCount,u+=t.indexCount}let p=new Float32Array(t*3);for(let e=0;e<i.length;e+=3){let t=i[e]*3,n=i[e+1]*3,a=i[e+2]*3,o=r[a]-r[n],s=r[a+1]-r[n+1],c=r[a+2]-r[n+2],l=r[t]-r[n],u=r[t+1]-r[n+1],d=r[t+2]-r[n+2],f=s*d-c*u,m=c*l-o*d,h=o*u-s*l;p[t]+=f,p[t+1]+=m,p[t+2]+=h,p[n]+=f,p[n+1]+=m,p[n+2]+=h,p[a]+=f,p[a+1]+=m,p[a+2]+=h}for(let e=0;e<p.length;e+=3){let t=p[e],n=p[e+1],r=p[e+2],i=Math.sqrt(t*t+n*n+r*r)||1;p[e]=t/i,p[e+1]=n/i,p[e+2]=r/i}m.push({positions:r,normals:p,indices:i,uvs:a,colors:o})}return m}function he(){return[`const assemble = ${me.toString()};`,`self.onmessage = (event) => {`,` const { id, input } = event.data;`,` try {`,` const geometries = assemble(input);`,` const transfer = [];`,` for (const g of geometries) {`,` transfer.push(g.positions.buffer, g.normals.buffer, g.indices.buffer);`,` if (g.uvs) transfer.push(g.uvs.buffer);`,` if (g.colors) transfer.push(g.colors.buffer);`,` }`,` self.postMessage({ id, geometries }, transfer);`,` } catch (error) {`,` self.postMessage({ id, error: String((error && error.message) || error) });`,` }`,`};`].join(`
|
|
2
|
+
`)}let B;const V=new Map;let ge=1;function _e(){if(B!==void 0)return B;if(typeof Worker>`u`||typeof Blob>`u`||typeof URL>`u`||typeof URL.createObjectURL!=`function`)return B=null,null;try{let e=URL.createObjectURL(new Blob([he()],{type:`text/javascript`})),t=new Worker(e);t.onmessage=e=>{let{id:t,geometries:n,error:r}=e.data,i=V.get(t);i&&(V.delete(t),n?i.resolve(n):i.reject(Error(r??`mesh assembly failed in worker`)))},t.onerror=()=>{for(let e of V.values())e.reject(Error(`mesh assembly worker crashed`));V.clear(),t.terminate(),B=null},B=t}catch{B=null}return B}function ve(e,t,n){return new Promise((r,i)=>{let a=ge++;V.set(a,{resolve:r,reject:i}),e.postMessage({id:a,input:t},n)})}let ye=1;function H(e){ye=Math.max(1,e)}o(H);function U(e,n,r){typeof document>`u`||new l.TextureLoader().load(n,t=>{t.colorSpace=r===`map`?l.SRGBColorSpace:l.NoColorSpace,t.anisotropy=ye,e[r]=t,e.needsUpdate=!0},void 0,e=>{t().warn(`Failed to load material ${r} ${n}:`,e)})}function W(e,t){let n=s(e.color),r=t?.vertexColors??!1,a=t?.appearance,o=new l.MeshPhysicalMaterial({color:n,metalness:e.metalness,roughness:e.roughness,opacity:e.opacity,transparent:e.transparent,vertexColors:r,side:a?.cullBackfaces?l.FrontSide:l.DoubleSide,polygonOffset:!0,polygonOffsetFactor:.5,polygonOffsetUnits:.5,depthWrite:!0,depthTest:!0});e.envMapIntensity==null?a?.envMapIntensity!=null&&(o.envMapIntensity=a.envMapIntensity):(o.envMapIntensity=e.envMapIntensity,o.userData[i]=e.envMapIntensity);let c=e.metalness>.5,u=e.clearcoat??(c?.5:void 0);return u!=null&&(o.clearcoat=u,o.clearcoatRoughness=e.clearcoatRoughness??(c?.3:0)),e.anisotropy!=null&&e.anisotropy>0&&t?.hasUvs&&(o.anisotropy=e.anisotropy,o.anisotropyRotation=e.anisotropyRotation??0),r&&be(o),e.map&&U(o,e.map,`map`),e.roughnessMap&&U(o,e.roughnessMap,`roughnessMap`),e.normalMap&&U(o,e.normalMap,`normalMap`),o}function be(e){e.onBeforeCompile=e=>{e.vertexShader=e.vertexShader.replace(`#include <color_vertex>`,`#include <color_vertex>
|
|
3
3
|
#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )
|
|
4
4
|
vColor.rgb = mix(
|
|
5
5
|
vColor.rgb / 12.92,
|
|
6
6
|
pow( ( vColor.rgb + 0.055 ) / 1.055, vec3( 2.4 ) ),
|
|
7
7
|
step( vec3( 0.04045 ), vColor.rgb )
|
|
8
8
|
);
|
|
9
|
-
#endif`)}}function G(e,t){return new n(e,s.VALIDATION_ERROR,{context:t})}function K(e,t,n,r){for(let i of e){if(!Number.isInteger(i.materialId)||i.materialId<0||i.materialId>=t)throw G(`Group materialId out of range of the materials array.`,{materialId:i.materialId,materialCount:t});for(let e of i.meshes){let t={vertexStart:e.vertexStart,vertexCount:e.vertexCount,indexStart:e.indexStart,indexCount:e.indexCount};for(let[n,r]of Object.entries(t))if(!Number.isInteger(r)||r<0)throw G(`Mesh metadata field "${n}" must be a non-negative integer.`,{meshName:e.name,field:n,value:r});if(e.vertexStart+e.vertexCount>n)throw G(`Mesh vertex window exceeds the batch vertex buffer.`,{meshName:e.name,vertexStart:e.vertexStart,vertexCount:e.vertexCount,totalVertexCount:n});if(e.indexStart+e.indexCount>r)throw G(`Mesh index window exceeds the batch index buffer.`,{meshName:e.name,indexStart:e.indexStart,indexCount:e.indexCount,totalIndexCount:r})}}}function q(e,t){return G(`Index references a vertex outside its mesh's vertex window.`,{meshName:t.name,indexValue:e,vertexStart:t.vertexStart,vertexCount:t.vertexCount})}function ye(e,t,n){let r=new Float32Array(e.length),i=t[0],a=t[1],o=t[2],s=n[0],c=n[1],l=n[2];for(let t=0;t<e.length;t+=3)r[t]=i+(e[t]+32767)*s,r[t+1]=a+(e[t+1]+32767)*c,r[t+2]=o+(e[t+2]+32767)*l;return r}function J(e){let t=new Map;for(let n of e.meshes){let e=n.layer??``,r=t.get(e);r||(r=[],t.set(e,r)),r.push(n)}return[...t.values()].map(t=>({materialId:e.materialId,meshes:t}))}function be(e,t,n,r,i=null,a=null){let o=0,s=0;for(let t of e.meshes)o+=t.vertexCount,s+=t.indexCount;let l=new Float32Array(o*3),u=new Uint32Array(s),d=i?new Float32Array(o*2):null,f=a?new Uint8Array(o*3):null,p=0,m=0;for(let r of e.meshes){let e=r.vertexStart*3,o=r.vertexCount*3;if(l.set(t.subarray(e,e+o),p*3),d&&i){let e=r.vertexStart*2;d.set(i.subarray(e,e+r.vertexCount*2),p*2)}f&&a&&f.set(a.subarray(e,e+o),p*3);let s=n.subarray(r.indexStart,r.indexStart+r.indexCount),c=p-r.vertexStart,h=r.vertexStart,g=r.vertexStart+r.vertexCount;for(let e=0;e<s.length;e++){let t=s[e];if(t<h||t>=g)throw q(t,r);u[m+e]=t+c}p+=r.vertexCount,m+=r.indexCount}let h=new c.BufferGeometry;return h.setAttribute(`position`,new c.BufferAttribute(l,3)),h.setIndex(new c.BufferAttribute(u,1)),d&&h.setAttribute(`uv`,new c.BufferAttribute(d,2)),f&&h.setAttribute(`color`,new c.BufferAttribute(f,3,!0)),h.computeVertexNormals(),Y(h,e,r)}function xe(e){let t=[],n=0;for(let r of e.meshes)t.push({trackingKey:r.id,name:r.name,layer:r.layer,metadata:r.metadata??{},indexStart:n,indexCount:r.indexCount}),n+=r.indexCount;return t}function Y(e,t,n){let r=new c.Mesh(e,n[t.materialId]),i=t.meshes[0],a=t.meshes.map(e=>e.name).filter(e=>e&&e.length>0);return r.name=a.length>0?a[0]:`merged_material_${t.materialId}`,r.castShadow=!0,r.receiveShadow=!0,r.userData={source:`compute`,name:r.name,layer:i?.layer??``,metadata:i?.metadata??{},members:xe(t)},r}function Se(e,t,n,r,i=null,a=null){let o=[];for(let s of e.meshes){let l=s.vertexStart*3,u=s.vertexCount*3,d=t.slice(l,l+u),f=n.subarray(s.indexStart,s.indexStart+s.indexCount),p=new Uint32Array(f.length),m=s.vertexStart,h=s.vertexStart+s.vertexCount;for(let e=0;e<f.length;e++){let t=f[e];if(t<m||t>=h)throw q(t,s);p[e]=t-m}let g=new c.BufferGeometry;if(g.setAttribute(`position`,new c.BufferAttribute(d,3)),g.setIndex(new c.BufferAttribute(p,1)),i){let e=s.vertexStart*2,t=i.slice(e,e+s.vertexCount*2);g.setAttribute(`uv`,new c.BufferAttribute(t,2))}if(a){let e=a.slice(l,l+u);g.setAttribute(`color`,new c.BufferAttribute(e,3,!0))}g.computeVertexNormals(),o.push(X(g,s,e,r))}return o}function X(e,t,n,r){let i=new c.Mesh(e,r[n.materialId]);return i.name=t.name,i.userData={source:`compute`,name:t.name,layer:t.layer??``,trackingKey:t.id,metadata:t.metadata??{}},i.castShadow=!0,i.receiveShadow=!0,i}async function Z(e,t,n){let{mergeByMaterial:r=!0,debug:i=!1,material:a}=t??{},{parseTime:o=0,perfStart:s=i?performance.now():0}=n??{};if(!e.compressedData)return[];let c=await Ee(e.compressedData,{mergeByMaterial:r,debug:i,material:a,fallback:{materials:e.materials,groups:e.groups}});if(c)return c;let l=performance.now();return Te(R(e.compressedData),{mergeByMaterial:r,debug:i,material:a,parseTime:o,decodeTime:performance.now()-l,perfStart:s,blobBytes:i?De(e.compressedData):0,fallback:{materials:e.materials,groups:e.groups}})}async function Ce(e,t){let{mergeByMaterial:n=!0,debug:r=!1,material:i}=t??{},a=r?performance.now():0,o=await Ee(e,{mergeByMaterial:n,debug:r,material:i});if(o)return o;let s=performance.now(),c=R(e),l=performance.now()-s,u=e.byteLength;return Te(c,{mergeByMaterial:n,debug:r,material:i,parseTime:0,decodeTime:l,perfStart:a,blobBytes:u})}let Q=!1;function we(e,n){if(e||Q)return;let r=0;for(let e of n)r+=e.meshes.length;r<1e3||(Q=!0,t().warn(`Parsing ${r} meshes with mergeByMaterial: false — each becomes its own THREE object, and render cost scales with object count. Drop the option to merge by material (the default); per-object identity survives it via userData.members.`))}function Te(e,n){let{mergeByMaterial:r,debug:i,material:a,parseTime:o,decodeTime:s,perfStart:c,blobBytes:l,fallback:u}=n,d=e.metadata.materials??u?.materials??[],f=e.metadata.groups??u?.groups??[],p=!!(e.flags&1);K(f,d.length,e.vertices.length/3,e.indices.length);let m=p?e.vertices:ye(e.vertices,e.origin,e.scale);if(i){let n=e.vertices.byteLength+e.indices.byteLength;t().debug(`Mesh Batch Stats:`),t().debug(` Materials: ${d.length} | Groups: ${f.length}`),t().debug(` Vertices: ${e.vertices.length/3} | Indices: ${e.indices.length}`),t().debug(` Format: ${p?`float32`:`int16 quantized`}`),t().debug(` Blob: ${(l/1024/1024).toFixed(2)} MB | Geometry on wire: ${(n/1024/1024).toFixed(2)} MB`)}we(r,f);let h=performance.now(),g=d.map(t=>W(t,{vertexColors:e.colors!=null,appearance:a})),_=[],v=r?f.flatMap(J):f;for(let t of v)if(r&&t.meshes.length>1){let n=be(t,m,e.indices,g,e.uvs,e.colors);_.push(n)}else{let n=Se(t,m,e.indices,g,e.uvs,e.colors);_.push(...n)}let y=performance.now()-h;if(i){let e=performance.now()-c;t().debug(`Performance:`),o>0&&t().debug(` Parse JSON: ${o.toFixed(2)}ms`),t().debug(` Decode binary: ${s.toFixed(2)}ms`),t().debug(` Create Meshes: ${y.toFixed(2)}ms`),t().debug(` Total: ${e.toFixed(2)}ms`)}return Promise.resolve(_)}async function Ee(e,n){if(typeof Worker>`u`)return null;let r=z(e),i=r.planarByteSplit?r.indexData.length/(r.uint16Indices?2:4):r.indexData.length;if(i/3<5e4)return null;let a=he();if(!a)return null;let o=r.metadata.materials??n.fallback?.materials??[],s=r.metadata.groups??n.fallback?.groups??[];K(s,o.length,r.vertexCount,i);let l=e=>({vertexStart:e.vertexStart,vertexCount:e.vertexCount,indexStart:e.indexStart,indexCount:e.indexCount}),u=[],d=[],f=n.mergeByMaterial?s.flatMap(J):s;for(let e of f)if(n.mergeByMaterial&&e.meshes.length>1)u.push({kind:`merged`,windows:e.meshes.map(l)}),d.push({kind:`merged`,group:e});else for(let t of e.meshes)u.push({kind:`single`,windows:[l(t)]}),d.push({kind:`single`,group:e,meshMeta:t});let p=r.vertexData.slice(),m=r.indexData.slice(),h=[p.buffer,m.buffer];r.uvs&&h.push(r.uvs.buffer),r.colors&&h.push(r.colors.buffer);let g;try{g=await ge(a,{vertexData:p,isFloat32:r.isFloat32,deltaEncoded:r.deltaEncoded,planarByteSplit:r.planarByteSplit,uint16Indices:r.uint16Indices,origin:r.origin,scale:r.scale,indexData:m,uvs:r.uvs,colors:r.colors,jobs:u},h)}catch(e){return t().warn(`Mesh assembly worker failed; falling back to main-thread parse.`,e),null}if(g.length!==u.length)return null;let _=o.map(e=>W(e,{vertexColors:r.colors!=null,appearance:n.material})),v=[];for(let e=0;e<g.length;e++){let t=g[e],n=d[e],r=new c.BufferGeometry;r.setAttribute(`position`,new c.BufferAttribute(t.positions,3)),r.setAttribute(`normal`,new c.BufferAttribute(t.normals,3)),r.setIndex(new c.BufferAttribute(t.indices,1)),t.uvs&&r.setAttribute(`uv`,new c.BufferAttribute(t.uvs,2)),t.colors&&r.setAttribute(`color`,new c.BufferAttribute(t.colors,3,!0));let i=n.kind===`merged`?Y(r,n.group,_):X(r,n.meshMeta,n.group,_);v.push(i)}return n.debug&&t().debug(`Mesh batch assembled off-thread: ${v.length} meshes, ${i/3} triangles`),v}function De(e){return Math.floor(e.length*3/4)}const $={Angstroms:1e-10,Nanometers:1e-9,Microns:1e-6,Millimeters:.001,Centimeters:.01,Decimeters:.1,Meters:1,Dekameters:10,Hectometers:100,Kilometers:1e3,Megameters:1e6,Gigameters:1e9,Microinches:2.54e-8,Mils:254e-7,Inches:.0254,Feet:.3048,Yards:.9144,Miles:1609.344,NauticalMiles:1852};function Oe(e){let t=e.split(`.`);return t.includes(`Display`)||t.includes(`DisplayBatch`)}const ke=new Set;async function Ae(e,t){let n=performance.now(),r=[],{allowScaling:i=!0,allowAutoPosition:a=!1,groundAxis:o=`z`,debug:s=!1,parsing:c={}}=t??{};try{return await Me(e,r,i?je(e.modelunits):1,c,s),a&&Ie(r,o),r}catch(e){throw Le(e,r),e}finally{s&&ze(n)}}function je(e){let n=$[e];return n===void 0?(ke.has(e)||(ke.add(e),t().warn(`Unknown Rhino model unit "${e}" — geometry will not be scaled (factor 1). Known units: ${Object.keys($).join(`, `)}.`)),1):n}async function Me(e,t,n,r,i){for(let a of e.values){let e=a.InnerTree;for(let a in e){let o=e[a];o&&await Ne(o,t,n,r,i)}}}async function Ne(e,n,r,i,a){for(let o of e){if(!Oe(o.type))continue;let e={debug:!1,...i,mergeByMaterial:i.mergeByMaterial??!0},s=Pe(o.data);if(!s){t().error(`Error parsing display batch envelope: invalid JSON`);continue}let c=await Z(s,e),l=S(s.items),u=[...c,...l];if(r!==1)for(let e of u)e.scale.set(r,r,r);n.push(...u),a&&t().debug(`Extracted ${c.length} meshes and ${l.length} items from batch`)}}function Pe(e){return typeof e==`string`?Fe(e):e}function Fe(e){try{return JSON.parse(e)}catch{return}}function Ie(t,n){if(t.length===0)return;let i=e(t);r(t,i.min[n],n)}function Le(e,n){t().error(`An unexpected error occurred:`,e),Re(n)}function Re(e){for(let t of e){let e=t;e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(e=>e.dispose()):e.material.dispose())}}function ze(e){let n=performance.now()-e;t().info(`Time to process meshes:`,`${n.toFixed(2)}ms`)}export{$ as SCALE_FACTORS,Ae as getThreeObjectsFromComputeResponse,_ as meshPolicy,S as parseDisplayItems,Ce as parseMeshBatchBlob,Z as parseMeshBatchObject,U as setTextureAnisotropy};
|
|
9
|
+
#endif`)}}function G(e,t){return new n(e,a.VALIDATION_ERROR,{context:t})}function K(e,t,n,r){for(let i of e){if(!Number.isInteger(i.materialId)||i.materialId<0||i.materialId>=t)throw G(`Group materialId out of range of the materials array.`,{materialId:i.materialId,materialCount:t});for(let e of i.meshes){let t={vertexStart:e.vertexStart,vertexCount:e.vertexCount,indexStart:e.indexStart,indexCount:e.indexCount};for(let[n,r]of Object.entries(t))if(!Number.isInteger(r)||r<0)throw G(`Mesh metadata field "${n}" must be a non-negative integer.`,{meshName:e.name,field:n,value:r});if(e.vertexStart+e.vertexCount>n)throw G(`Mesh vertex window exceeds the batch vertex buffer.`,{meshName:e.name,vertexStart:e.vertexStart,vertexCount:e.vertexCount,totalVertexCount:n});if(e.indexStart+e.indexCount>r)throw G(`Mesh index window exceeds the batch index buffer.`,{meshName:e.name,indexStart:e.indexStart,indexCount:e.indexCount,totalIndexCount:r})}}}function q(e,t){return G(`Index references a vertex outside its mesh's vertex window.`,{meshName:t.name,indexValue:e,vertexStart:t.vertexStart,vertexCount:t.vertexCount})}function xe(e,t,n){let r=new Float32Array(e.length),i=t[0],a=t[1],o=t[2],s=n[0],c=n[1],l=n[2];for(let t=0;t<e.length;t+=3)r[t]=i+(e[t]+32767)*s,r[t+1]=a+(e[t+1]+32767)*c,r[t+2]=o+(e[t+2]+32767)*l;return r}function J(e){let t=new Map;for(let n of e.meshes){let e=n.layer??``,r=t.get(e);r||(r=[],t.set(e,r)),r.push(n)}return[...t.values()].map(t=>({materialId:e.materialId,meshes:t}))}function Se(e,t,n,r,i=null,a=null){let o=0,s=0;for(let t of e.meshes)o+=t.vertexCount,s+=t.indexCount;let c=new Float32Array(o*3),u=new Uint32Array(s),d=i?new Float32Array(o*2):null,f=a?new Uint8Array(o*3):null,p=0,m=0;for(let r of e.meshes){let e=r.vertexStart*3,o=r.vertexCount*3;if(c.set(t.subarray(e,e+o),p*3),d&&i){let e=r.vertexStart*2;d.set(i.subarray(e,e+r.vertexCount*2),p*2)}f&&a&&f.set(a.subarray(e,e+o),p*3);let s=n.subarray(r.indexStart,r.indexStart+r.indexCount),l=p-r.vertexStart,h=r.vertexStart,g=r.vertexStart+r.vertexCount;for(let e=0;e<s.length;e++){let t=s[e];if(t<h||t>=g)throw q(t,r);u[m+e]=t+l}p+=r.vertexCount,m+=r.indexCount}let h=new l.BufferGeometry;return h.setAttribute(`position`,new l.BufferAttribute(c,3)),h.setIndex(new l.BufferAttribute(u,1)),d&&h.setAttribute(`uv`,new l.BufferAttribute(d,2)),f&&h.setAttribute(`color`,new l.BufferAttribute(f,3,!0)),h.computeVertexNormals(),Y(h,e,r)}function Ce(e){let t=[],n=0;for(let r of e.meshes)t.push({trackingKey:r.id,name:r.name,layer:r.layer,metadata:r.metadata??{},indexStart:n,indexCount:r.indexCount}),n+=r.indexCount;return t}function Y(e,t,n){let r=new l.Mesh(e,n[t.materialId]),i=t.meshes[0],a=t.meshes.map(e=>e.name).filter(e=>e&&e.length>0);return r.name=a.length>0?a[0]:`merged_material_${t.materialId}`,r.castShadow=!0,r.receiveShadow=!0,r.userData={source:`compute`,name:r.name,layer:i?.layer??``,metadata:i?.metadata??{},members:Ce(t)},r}function we(e,t,n,r,i=null,a=null){let o=[];for(let s of e.meshes){let c=s.vertexStart*3,u=s.vertexCount*3,d=t.slice(c,c+u),f=n.subarray(s.indexStart,s.indexStart+s.indexCount),p=new Uint32Array(f.length),m=s.vertexStart,h=s.vertexStart+s.vertexCount;for(let e=0;e<f.length;e++){let t=f[e];if(t<m||t>=h)throw q(t,s);p[e]=t-m}let g=new l.BufferGeometry;if(g.setAttribute(`position`,new l.BufferAttribute(d,3)),g.setIndex(new l.BufferAttribute(p,1)),i){let e=s.vertexStart*2,t=i.slice(e,e+s.vertexCount*2);g.setAttribute(`uv`,new l.BufferAttribute(t,2))}if(a){let e=a.slice(c,c+u);g.setAttribute(`color`,new l.BufferAttribute(e,3,!0))}g.computeVertexNormals(),o.push(X(g,s,e,r))}return o}function X(e,t,n,r){let i=new l.Mesh(e,r[n.materialId]);return i.name=t.name,i.userData={source:`compute`,name:t.name,layer:t.layer??``,trackingKey:t.id,metadata:t.metadata??{}},i.castShadow=!0,i.receiveShadow=!0,i}async function Z(e,t,n){let{mergeByMaterial:r=!0,debug:i=!1,material:a}=t??{},{parseTime:o=0,perfStart:s=i?performance.now():0}=n??{};if(!e.compressedData)return[];let c=await Oe(e.compressedData,{mergeByMaterial:r,debug:i,material:a,fallback:{materials:e.materials,groups:e.groups}});if(c)return c;let l=performance.now();return Q(R(e.compressedData),{mergeByMaterial:r,debug:i,material:a,parseTime:o,decodeTime:performance.now()-l,perfStart:s,blobBytes:i?ke(e.compressedData):0,fallback:{materials:e.materials,groups:e.groups}})}async function Te(e,t){let{mergeByMaterial:n=!0,debug:r=!1,material:i}=t??{},a=r?performance.now():0,o=await Oe(e,{mergeByMaterial:n,debug:r,material:i});if(o)return o;let s=performance.now(),c=R(e),l=performance.now()-s,u=e.byteLength;return Q(c,{mergeByMaterial:n,debug:r,material:i,parseTime:0,decodeTime:l,perfStart:a,blobBytes:u})}let Ee=!1;function De(e,n){if(e||Ee)return;let r=0;for(let e of n)r+=e.meshes.length;r<1e3||(Ee=!0,t().warn(`Parsing ${r} meshes with mergeByMaterial: false — each becomes its own THREE object, and render cost scales with object count. Drop the option to merge by material (the default); per-object identity survives it via userData.members.`))}function Q(e,n){let{mergeByMaterial:r,debug:i,material:a,parseTime:o,decodeTime:s,perfStart:c,blobBytes:l,fallback:u}=n,d=e.metadata.materials??u?.materials??[],f=e.metadata.groups??u?.groups??[],p=!!(e.flags&1);K(f,d.length,e.vertices.length/3,e.indices.length);let m=p?e.vertices:xe(e.vertices,e.origin,e.scale);if(i){let n=e.vertices.byteLength+e.indices.byteLength;t().debug(`Mesh Batch Stats:`),t().debug(` Materials: ${d.length} | Groups: ${f.length}`),t().debug(` Vertices: ${e.vertices.length/3} | Indices: ${e.indices.length}`),t().debug(` Format: ${p?`float32`:`int16 quantized`}`),t().debug(` Blob: ${(l/1024/1024).toFixed(2)} MB | Geometry on wire: ${(n/1024/1024).toFixed(2)} MB`)}De(r,f);let h=performance.now(),g=d.map(t=>W(t,{vertexColors:e.colors!=null,hasUvs:e.uvs!=null,appearance:a})),_=[],v=r?f.flatMap(J):f;for(let t of v)if(r&&t.meshes.length>1){let n=Se(t,m,e.indices,g,e.uvs,e.colors);_.push(n)}else{let n=we(t,m,e.indices,g,e.uvs,e.colors);_.push(...n)}let y=performance.now()-h;if(i){let e=performance.now()-c;t().debug(`Performance:`),o>0&&t().debug(` Parse JSON: ${o.toFixed(2)}ms`),t().debug(` Decode binary: ${s.toFixed(2)}ms`),t().debug(` Create Meshes: ${y.toFixed(2)}ms`),t().debug(` Total: ${e.toFixed(2)}ms`)}return Promise.resolve(_)}async function Oe(e,n){if(typeof Worker>`u`)return null;let r=z(e),i=r.planarByteSplit?r.indexData.length/(r.uint16Indices?2:4):r.indexData.length;if(i/3<5e4)return null;let a=_e();if(!a)return null;let o=r.metadata.materials??n.fallback?.materials??[],s=r.metadata.groups??n.fallback?.groups??[];K(s,o.length,r.vertexCount,i);let c=e=>({vertexStart:e.vertexStart,vertexCount:e.vertexCount,indexStart:e.indexStart,indexCount:e.indexCount}),u=[],d=[],f=n.mergeByMaterial?s.flatMap(J):s;for(let e of f)if(n.mergeByMaterial&&e.meshes.length>1)u.push({kind:`merged`,windows:e.meshes.map(c)}),d.push({kind:`merged`,group:e});else for(let t of e.meshes)u.push({kind:`single`,windows:[c(t)]}),d.push({kind:`single`,group:e,meshMeta:t});let p=r.vertexData.slice(),m=r.indexData.slice(),h=[p.buffer,m.buffer];r.uvs&&h.push(r.uvs.buffer),r.colors&&h.push(r.colors.buffer);let g;try{g=await ve(a,{vertexData:p,isFloat32:r.isFloat32,deltaEncoded:r.deltaEncoded,planarByteSplit:r.planarByteSplit,uint16Indices:r.uint16Indices,origin:r.origin,scale:r.scale,indexData:m,uvs:r.uvs,colors:r.colors,jobs:u},h)}catch(e){return t().warn(`Mesh assembly worker failed; falling back to main-thread parse.`,e),null}if(g.length!==u.length)return null;let _=o.map(e=>W(e,{vertexColors:r.colors!=null,hasUvs:r.uvs!=null,appearance:n.material})),v=[];for(let e=0;e<g.length;e++){let t=g[e],n=d[e],r=new l.BufferGeometry;r.setAttribute(`position`,new l.BufferAttribute(t.positions,3)),r.setAttribute(`normal`,new l.BufferAttribute(t.normals,3)),r.setIndex(new l.BufferAttribute(t.indices,1)),t.uvs&&r.setAttribute(`uv`,new l.BufferAttribute(t.uvs,2)),t.colors&&r.setAttribute(`color`,new l.BufferAttribute(t.colors,3,!0));let i=n.kind===`merged`?Y(r,n.group,_):X(r,n.meshMeta,n.group,_);v.push(i)}return n.debug&&t().debug(`Mesh batch assembled off-thread: ${v.length} meshes, ${i/3} triangles`),v}function ke(e){return Math.floor(e.length*3/4)}const $={Angstroms:1e-10,Nanometers:1e-9,Microns:1e-6,Millimeters:.001,Centimeters:.01,Decimeters:.1,Meters:1,Dekameters:10,Hectometers:100,Kilometers:1e3,Megameters:1e6,Gigameters:1e9,Microinches:2.54e-8,Mils:254e-7,Inches:.0254,Feet:.3048,Yards:.9144,Miles:1609.344,NauticalMiles:1852};function Ae(e){let t=e.split(`.`);return t.includes(`Display`)||t.includes(`DisplayBatch`)}const je=new Set;async function Me(e,t){let n=performance.now(),r=[],{allowScaling:i=!0,allowAutoPosition:a=!1,groundAxis:o=`z`,debug:s=!1,parsing:c={}}=t??{};try{return await Pe(e,r,i?Ne(e.modelunits):1,c,s),a&&Re(r,o),r}catch(e){throw ze(e,r),e}finally{s&&Ve(n)}}function Ne(e){let n=$[e];return n===void 0?(je.has(e)||(je.add(e),t().warn(`Unknown Rhino model unit "${e}" — geometry will not be scaled (factor 1). Known units: ${Object.keys($).join(`, `)}.`)),1):n}async function Pe(e,t,n,r,i){for(let a of e.values){let e=a.InnerTree;for(let a in e){let o=e[a];o&&await Fe(o,t,n,r,i)}}}async function Fe(e,n,r,i,a){for(let o of e){if(!Ae(o.type))continue;let e={debug:!1,...i,mergeByMaterial:i.mergeByMaterial??!0},s=Ie(o.data);if(!s){t().error(`Error parsing display batch envelope: invalid JSON`);continue}let c=await Z(s,e),l=C(s.items),u=[...c,...l];if(r!==1)for(let e of u)e.scale.set(r,r,r);n.push(...u),a&&t().debug(`Extracted ${c.length} meshes and ${l.length} items from batch`)}}function Ie(e){return typeof e==`string`?Le(e):e}function Le(e){try{return JSON.parse(e)}catch{return}}function Re(t,n){if(t.length===0)return;let i=e(t);r(t,i.min[n],n)}function ze(e,n){t().error(`An unexpected error occurred:`,e),Be(n)}function Be(e){for(let t of e){let e=t;e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(e=>e.dispose()):e.material.dispose())}}function Ve(e){let n=performance.now()-e;t().info(`Time to process meshes:`,`${n.toFixed(2)}ms`)}export{$ as SCALE_FACTORS,Me as getThreeObjectsFromComputeResponse,v as meshPolicy,C as parseDisplayItems,Te as parseMeshBatchBlob,Z as parseMeshBatchObject,H as setTextureAnisotropy};
|
|
10
10
|
//# sourceMappingURL=parse.js.map
|