@selvajs/visualization 1.0.0-beta.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Selva VektorNode AG
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,113 @@
1
+ # `@selvajs/visualization`
2
+
3
+ A headless, extensible viewer core. Owns **parse → render → scene** as one framework-free package:
4
+ no Svelte, no runes, `three` as a peer dep. Consumers build their own UI over it.
5
+
6
+ ## Layer boundaries & dependency direction
7
+
8
+ Layers depend **downward only**. A contributor can predict where code lives from what it depends on.
9
+
10
+ ```
11
+ scene/ SceneOutliner: reads a live THREE.Scene → content list, layers, visibility, selection
12
+ │ ↓ depends on `three` only — it reads the scene graph, render/ owns its contents
13
+ render/ THREE scene setup + CAD viewer toolkit (camera, edges, grid, gizmo, measure…)
14
+ │ ↓
15
+ parse/ backend payload → THREE meshes + metadata (webdisplay, display-items)
16
+ │ ↓
17
+ shared/ coordinate frame, look presets, errors, logging, geometry/color utils [internal]
18
+ ```
19
+
20
+ **The solve session used to be a fourth layer on top; it moved to `@selvajs/solve/client`.** What
21
+ stayed behind is the three.js mesh ownership policy solve's result memo needs but deliberately
22
+ doesn't know: `meshPolicy` in [`parse/mesh-policy.ts`](./src/parse/mesh-policy.ts).
23
+
24
+ **Each layer has its own barrel (`index.ts`) — the only cross-layer import surface.** Files inside a
25
+ layer import siblings by relative path; other layers import the barrel. That way a layer's internals
26
+ can be refactored freely without touching consumers.
27
+
28
+ ## Sub-path exports
29
+
30
+ Three of the four layers are published entrypoints, so consumers tree-shake:
31
+
32
+ ```ts
33
+ import { getThreeMeshesFromComputeResponse, meshPolicy } from '@selvajs/visualization/parse';
34
+ import { initThree, LOOKS, type ThreeViewer } from '@selvajs/visualization/render';
35
+ import { createSceneOutliner } from '@selvajs/visualization/scene';
36
+ ```
37
+
38
+ `shared/` is **internal** — it is the cross-layer import surface, not an entrypoint. The parts
39
+ consumers need (`VisualizationError`, the logger seam, the look vocabulary) are re-exported from
40
+ `/render`. The root `.` entrypoint re-exports nothing on purpose: importing from a layer keeps the
41
+ layering enforced by the import graph rather than merely documented.
42
+
43
+ ### The API is deliberately minimal
44
+
45
+ Only what a consumer genuinely needs is exported. In particular:
46
+
47
+ - **`initThree` owns the render toolkit.** It builds the camera controller, grid, gizmo, measure
48
+ tool, render pipeline and near-plane fitter, and returns the live instances on
49
+ [`ThreeViewer`](./src/render/scene-setup/viewer.ts). Configure them through
50
+ `ThreeInitializerOptions`, reach them through the viewer (`viewer.grid`, `viewer.measureTool`,
51
+ `viewer.applyEdges`, …). The factories themselves are internal — their handle _types_ are exported
52
+ so hosts can annotate what they hold.
53
+ - **`createSceneOutliner` composes the scene layer.** Content filtering, layer grouping, visibility
54
+ and selection state are reachable via `outliner.visibility` / `.selection` / `.layerGroups()`.
55
+ - **The SLVA binary wire format is private.** Magics, version gates, flag bits and the low-level
56
+ binary parser are implementation details of `parseMeshBatch*` and change without a major bump.
57
+
58
+ When adding a feature, resist re-exporting a symbol just because it exists — a published surface is
59
+ a compatibility promise.
60
+
61
+ `scene/` is framework-free too, but takes the simpler route: its state is three sets, so a host
62
+ injects its own (`SvelteSet` in a Svelte app) and gets reactivity with no seam at all — see
63
+ [`src/scene/README.md`](./src/scene/README.md).
64
+
65
+ ## Examples (`pnpm example`)
66
+
67
+ `examples/` is a Vite playground for the render pipeline — the only place the GPU-dependent parts
68
+ (edge overlays, the screen-space edge pass, AO, the measure tool) can actually be checked, since
69
+ jsdom has no WebGL.
70
+
71
+ ```bash
72
+ pnpm example # http://localhost:5173
73
+ ```
74
+
75
+ Three demos: **Viewer — Full API** (every `initThree` control), **DMF — Selva Pipeline** (loads a
76
+ `.dmf` through the same parse + `updateScene` calls `Viewer.svelte` makes), and **Display Items**
77
+ (a GH compute response through `getThreeMeshesFromComputeResponse`).
78
+
79
+ They live here rather than in `@selvajs/compute` because that package must not depend on `three`.
80
+ Demos import from the public barrels (`@/render`, `@/parse`) on purpose: if a demo needs a symbol
81
+ the barrel doesn't export, that's a gap in the published API, not a reason to deep-import. They are
82
+ covered by `pnpm type-check`, so a rename that breaks a demo fails the build instead of rotting.
83
+
84
+ ## Dependencies
85
+
86
+ This package depends on **nothing from Selva** — only `three`, `rhino3dm` and `fflate`. It owns its
87
+ own errors ([`shared/errors.ts`](./src/shared/errors.ts)), logging
88
+ ([`shared/logger.ts`](./src/shared/logger.ts)) and base64 decoding
89
+ ([`shared/encoding.ts`](./src/shared/encoding.ts)) rather than importing them from
90
+ `@selvajs/compute`, so mesh conversion and the viewer work for a consumer with neither Selva nor
91
+ Rhino.Compute.
92
+
93
+ The Grasshopper response envelope `getThreeMeshesFromComputeResponse` accepts is declared
94
+ structurally in [`parse/webdisplay/response-envelope.ts`](./src/parse/webdisplay/response-envelope.ts)
95
+ — only the fields the parser reads. Compute's `GrasshopperComputeResponse` is a superset and stays
96
+ assignable to it.
97
+
98
+ ### Unified logging
99
+
100
+ The package logs nothing by default. To route its output into a host's logger — including
101
+ `@selvajs/compute`'s, so both packages share a sink:
102
+
103
+ ```ts
104
+ import { setLogger } from '@selvajs/visualization/render';
105
+ import { getLogger } from '@selvajs/compute';
106
+
107
+ setLogger(getLogger());
108
+ ```
109
+
110
+ ## Peer dependencies
111
+
112
+ `three` (>=0.179.0) is a peer dep — the host app owns the single `three` instance. Installing a
113
+ second copy breaks `instanceof` checks across the boundary.
@@ -0,0 +1,2 @@
1
+ var d=Object.defineProperty;var e=(b,a,c)=>a in b?d(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c;var f=(b,a,c)=>e(b,typeof a!="symbol"?a+"":a,c);export{f as a};
2
+ //# sourceMappingURL=chunk-5XGN7UAV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkBYLIBOAUcjs = require('./chunk-BYLIBOAU.cjs');var p={VALIDATION_ERROR:"VALIDATION_ERROR",INVALID_STATE:"INVALID_STATE",ENVIRONMENT_ERROR:"ENVIRONMENT_ERROR",INVALID_CONFIG:"INVALID_CONFIG",ENCODING_ERROR:"ENCODING_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR"},a= exports.b =class extends Error{constructor(r,n=p.UNKNOWN_ERROR,t){super(r);_chunkBYLIBOAUcjs.a.call(void 0, this,"code");_chunkBYLIBOAUcjs.a.call(void 0, this,"context");_chunkBYLIBOAUcjs.a.call(void 0, this,"originalError");this.name="VisualizationError",this.code=n,this.context=_optionalChain([t, 'optionalAccess', _2 => _2.context]),this.originalError=_optionalChain([t, 'optionalAccess', _3 => _3.originalError]),_optionalChain([t, 'optionalAccess', _4 => _4.originalError])&&(this.cause=t.originalError)}};var l=class{debug(){}info(){}warn(){}error(){}},d=class{debug(o,...r){console.debug(o,...r)}info(o,...r){console.info(o,...r)}warn(o,...r){console.warn(o,...r)}error(o,...r){console.error(o,...r)}},g=new l;function f(){return g}function h(e){if(e===null){g=new l;return}let o=["debug","info","warn","error"].filter(r=>typeof e[r]!="function");if(o.length>0)throw new a(`Logger is missing required method(s): ${o.join(", ")}. A logger must implement debug, info, warn and error.`,p.INVALID_CONFIG,{context:{missingMethods:o}});g=e}function I(){h(new d)}var L=["technical","studio","showcase"];var _three = require('three'); var c = _interopRequireWildcard(_three); var s = _interopRequireWildcard(_three); var w = _interopRequireWildcard(_three);var D="technical",O= exports.i ={studio:{toneMapping:c.ACESFilmicToneMapping,toneMappingExposure:1,envMapIntensity:1,environmentIntensity:1,hemisphereIntensity:.75,ambientIntensity:.4,cullBackfaces:!1,ambientOcclusion:!1},technical:{toneMapping:c.NeutralToneMapping,toneMappingExposure:1,envMapIntensity:.9,environmentIntensity:1,hemisphereIntensity:.35,ambientIntensity:.25,cullBackfaces:!1,ambientOcclusion:!1},showcase:{toneMapping:c.ACESFilmicToneMapping,toneMappingExposure:1.15,envMapIntensity:1.4,environmentIntensity:1.25,hemisphereIntensity:.35,ambientIntensity:.15,cullBackfaces:!1,ambientOcclusion:!1}};function H(e){let o=O[e];return{envMapIntensity:o.envMapIntensity,cullBackfaces:o.cullBackfaces}}function N(){let e=globalThis.Buffer;return typeof e=="function"?e:void 0}function k(e){let o=e.replace(/[\t\n\f\r ]/g,"");if(o.length%4===0&&(o=o.replace(/={1,2}$/,"")),o.length%4===1||!/^[A-Za-z0-9+/]*$/.test(o))throw new a("Invalid base64 input.",p.ENCODING_ERROR,{context:{inputLength:e.length}});let r=N();if(r)return new Uint8Array(r.from(o,"base64"));if(typeof globalThis.atob=="function"){let n=globalThis.atob(o),t=new Uint8Array(n.length);for(let i=0;i<n.length;i++)t[i]=n.charCodeAt(i)&255;return t}throw new a("Base64 decoding not supported in this environment.",p.INVALID_STATE,{context:{environmentInfo:"atob or Buffer not available"}})}function _(e){if(!e||typeof e!="string")return f().warn(`Invalid color input: ${e}, using white`),new s.Color(16777215);let o=e.trim();if(/^#?[0-9A-Fa-f]{6}$/.test(o))try{let n=o.startsWith("#")?o:`#${o}`;return new s.Color(n)}catch (e2){return f().warn(`Invalid hex color: ${e}, using white`),new s.Color(16777215)}if(o.includes(",")){let n=o.split(",").map(t=>parseInt(t.trim(),10));if(n.length===3&&n.every(t=>!isNaN(t)&&t>=0&&t<=255))return new s.Color(n[0]/255,n[1]/255,n[2]/255)}let r=o.toLowerCase();return r in s.Color.NAMES?new s.Color(s.Color.NAMES[r]):(f().warn(`Invalid color string: ${e}, using white`),new s.Color(16777215))}function B(e,o,r="z"){e.forEach(n=>{n.position[r]-=o})}function G(e){let o=new s.Box3;return e.length===0||e.forEach(r=>{r.updateMatrixWorld(!0);let n=new s.Box3().setFromObject(r);o.union(n)}),o}var A="selvaGeometryCache",v= exports.o ="selvaTextureCache",S=new Set;function m(e){return e?!_optionalChain([e, 'access', _5 => _5.userData, 'optionalAccess', _6 => _6[A]]):!1}function R(e){return e?!_optionalChain([e, 'access', _7 => _7.userData, 'optionalAccess', _8 => _8[v]]):!1}function x(e){return e?!S.has(e):!1}var M=new Set;function j(e){M.add(e)}function C(){for(let e of M)try{e()}catch (e3){}}var E=0;function F(){E++;let e=!1;return()=>{e||(e=!0,E--,E<=0&&(E=0,C()))}}var y=new Set,T=1;function U(e){let o=Math.max(1,e);if(o!==T){T=o;for(let r of y)r(o)}}function V(e){return y.add(e),e(T),()=>y.delete(e)}function b(e){if(x(e)){for(let o of Object.values(e))o instanceof w.Texture&&R(o)&&o.dispose();e.dispose()}}function K(e){e&&(Array.isArray(e)?e.forEach(b):b(e))}function $(e,o={}){let{materials:r=!0,onGeometry:n}=o;e.traverse(t=>{let i=t;!i.geometry&&!i.material||(i.geometry&&(_optionalChain([n, 'optionalCall', _9 => _9(i.geometry)]),m(i.geometry)&&i.geometry.dispose()),r&&K(i.material))})}exports.a = p; exports.b = a; exports.c = f; exports.d = h; exports.e = I; exports.f = k; exports.g = L; exports.h = D; exports.i = O; exports.j = H; exports.k = _; exports.l = B; exports.m = G; exports.n = A; exports.o = v; exports.p = R; exports.q = j; exports.r = C; exports.s = F; exports.t = U; exports.u = V; exports.v = $;
2
+ //# sourceMappingURL=chunk-AQJPVUH3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["c:\\Users\\felix\\coding\\selva\\packages\\visualization\\dist\\chunk-AQJPVUH3.cjs"],"names":[],"mappings":"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","file":"C:\\Users\\felix\\coding\\selva\\packages\\visualization\\dist\\chunk-AQJPVUH3.cjs","sourcesContent":[null]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var d=Object.defineProperty;var e=(b,a,c)=>a in b?d(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c;var f=(b,a,c)=>e(b,typeof a!="symbol"?a+"":a,c);exports.a = f;
2
+ //# sourceMappingURL=chunk-BYLIBOAU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["c:\\Users\\felix\\coding\\selva\\packages\\visualization\\dist\\chunk-BYLIBOAU.cjs"],"names":[],"mappings":"AAAA,6EAAI,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc","file":"C:\\Users\\felix\\coding\\selva\\packages\\visualization\\dist\\chunk-BYLIBOAU.cjs"}
@@ -0,0 +1,2 @@
1
+ import{a as u}from"./chunk-5XGN7UAV.js";var p={VALIDATION_ERROR:"VALIDATION_ERROR",INVALID_STATE:"INVALID_STATE",ENVIRONMENT_ERROR:"ENVIRONMENT_ERROR",INVALID_CONFIG:"INVALID_CONFIG",ENCODING_ERROR:"ENCODING_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR"},a=class extends Error{constructor(r,n=p.UNKNOWN_ERROR,t){super(r);u(this,"code");u(this,"context");u(this,"originalError");this.name="VisualizationError",this.code=n,this.context=t?.context,this.originalError=t?.originalError,t?.originalError&&(this.cause=t.originalError)}};var l=class{debug(){}info(){}warn(){}error(){}},d=class{debug(o,...r){console.debug(o,...r)}info(o,...r){console.info(o,...r)}warn(o,...r){console.warn(o,...r)}error(o,...r){console.error(o,...r)}},g=new l;function f(){return g}function h(e){if(e===null){g=new l;return}let o=["debug","info","warn","error"].filter(r=>typeof e[r]!="function");if(o.length>0)throw new a(`Logger is missing required method(s): ${o.join(", ")}. A logger must implement debug, info, warn and error.`,p.INVALID_CONFIG,{context:{missingMethods:o}});g=e}function I(){h(new d)}var L=["technical","studio","showcase"];import*as c from"three";var D="technical",O={studio:{toneMapping:c.ACESFilmicToneMapping,toneMappingExposure:1,envMapIntensity:1,environmentIntensity:1,hemisphereIntensity:.75,ambientIntensity:.4,cullBackfaces:!1,ambientOcclusion:!1},technical:{toneMapping:c.NeutralToneMapping,toneMappingExposure:1,envMapIntensity:.9,environmentIntensity:1,hemisphereIntensity:.35,ambientIntensity:.25,cullBackfaces:!1,ambientOcclusion:!1},showcase:{toneMapping:c.ACESFilmicToneMapping,toneMappingExposure:1.15,envMapIntensity:1.4,environmentIntensity:1.25,hemisphereIntensity:.35,ambientIntensity:.15,cullBackfaces:!1,ambientOcclusion:!1}};function H(e){let o=O[e];return{envMapIntensity:o.envMapIntensity,cullBackfaces:o.cullBackfaces}}function N(){let e=globalThis.Buffer;return typeof e=="function"?e:void 0}function k(e){let o=e.replace(/[\t\n\f\r ]/g,"");if(o.length%4===0&&(o=o.replace(/={1,2}$/,"")),o.length%4===1||!/^[A-Za-z0-9+/]*$/.test(o))throw new a("Invalid base64 input.",p.ENCODING_ERROR,{context:{inputLength:e.length}});let r=N();if(r)return new Uint8Array(r.from(o,"base64"));if(typeof globalThis.atob=="function"){let n=globalThis.atob(o),t=new Uint8Array(n.length);for(let i=0;i<n.length;i++)t[i]=n.charCodeAt(i)&255;return t}throw new a("Base64 decoding not supported in this environment.",p.INVALID_STATE,{context:{environmentInfo:"atob or Buffer not available"}})}import*as s from"three";function _(e){if(!e||typeof e!="string")return f().warn(`Invalid color input: ${e}, using white`),new s.Color(16777215);let o=e.trim();if(/^#?[0-9A-Fa-f]{6}$/.test(o))try{let n=o.startsWith("#")?o:`#${o}`;return new s.Color(n)}catch{return f().warn(`Invalid hex color: ${e}, using white`),new s.Color(16777215)}if(o.includes(",")){let n=o.split(",").map(t=>parseInt(t.trim(),10));if(n.length===3&&n.every(t=>!isNaN(t)&&t>=0&&t<=255))return new s.Color(n[0]/255,n[1]/255,n[2]/255)}let r=o.toLowerCase();return r in s.Color.NAMES?new s.Color(s.Color.NAMES[r]):(f().warn(`Invalid color string: ${e}, using white`),new s.Color(16777215))}function B(e,o,r="z"){e.forEach(n=>{n.position[r]-=o})}function G(e){let o=new s.Box3;return e.length===0||e.forEach(r=>{r.updateMatrixWorld(!0);let n=new s.Box3().setFromObject(r);o.union(n)}),o}var A="selvaGeometryCache",v="selvaTextureCache",S=new Set;function m(e){return e?!e.userData?.[A]:!1}function R(e){return e?!e.userData?.[v]:!1}function x(e){return e?!S.has(e):!1}var M=new Set;function j(e){M.add(e)}function C(){for(let e of M)try{e()}catch{}}var E=0;function F(){E++;let e=!1;return()=>{e||(e=!0,E--,E<=0&&(E=0,C()))}}var y=new Set,T=1;function U(e){let o=Math.max(1,e);if(o!==T){T=o;for(let r of y)r(o)}}function V(e){return y.add(e),e(T),()=>y.delete(e)}import*as w from"three";function b(e){if(x(e)){for(let o of Object.values(e))o instanceof w.Texture&&R(o)&&o.dispose();e.dispose()}}function K(e){e&&(Array.isArray(e)?e.forEach(b):b(e))}function $(e,o={}){let{materials:r=!0,onGeometry:n}=o;e.traverse(t=>{let i=t;!i.geometry&&!i.material||(i.geometry&&(n?.(i.geometry),m(i.geometry)&&i.geometry.dispose()),r&&K(i.material))})}export{p as a,a as b,f as c,h as d,I as e,k as f,L as g,D as h,O as i,H as j,_ as k,B as l,G as m,A as n,v as o,R as p,j as q,C as r,F as s,U as t,V as u,$ as v};
2
+ //# sourceMappingURL=chunk-EXAI6IC5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/errors.ts","../src/shared/logger.ts","../src/shared/types.ts","../src/shared/looks.ts","../src/shared/encoding.ts","../src/shared/geometry.ts","../src/shared/gpu-ownership.ts","../src/shared/gpu-capabilities.ts","../src/shared/gpu-dispose.ts"],"sourcesContent":["/**\n * Errors for the visualization package. Replaces `@selvajs/compute`'s `RhinoComputeError`, which\n * mis-named failures on paths (e.g. the plugin WebSocket) that never touch Rhino.Compute. `code`\n * values match compute's so existing catch-sites keep working.\n */\n\nexport const ErrorCodes = {\n\t/** Structural check failed: bad magic bytes, out-of-window index, malformed metadata. */\n\tVALIDATION_ERROR: 'VALIDATION_ERROR',\n\tINVALID_STATE: 'INVALID_STATE',\n\t/** No `DecompressionStream`, no WebGL context, etc. */\n\tENVIRONMENT_ERROR: 'ENVIRONMENT_ERROR',\n\tINVALID_CONFIG: 'INVALID_CONFIG',\n\t/** Base64 input could not be decoded. */\n\tENCODING_ERROR: 'ENCODING_ERROR',\n\tUNKNOWN_ERROR: 'UNKNOWN_ERROR'\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\nexport class VisualizationError extends Error {\n\tpublic readonly code: ErrorCode;\n\tpublic readonly context?: Record<string, unknown>;\n\tpublic readonly originalError?: Error;\n\n\tconstructor(\n\t\tmessage: string,\n\t\tcode: ErrorCode = ErrorCodes.UNKNOWN_ERROR,\n\t\toptions?: { context?: Record<string, unknown>; originalError?: Error }\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'VisualizationError';\n\t\tthis.code = code;\n\t\tthis.context = options?.context;\n\t\tthis.originalError = options?.originalError;\n\t\tif (options?.originalError) {\n\t\t\t(this as { cause?: unknown }).cause = options.originalError;\n\t\t}\n\t}\n}\n","/**\n * Logging facility for the visualization package. Deliberately local rather than imported from\n * `@selvajs/compute` (logging isn't a compute concern). Mirrors compute's logger shape so a host\n * wanting one sink for both can call `setLogger(computeLogger.getLogger())`.\n */\n\nimport { VisualizationError, ErrorCodes } from './errors.js';\n\nexport interface Logger {\n\tdebug(message: string, ...args: unknown[]): void;\n\tinfo(message: string, ...args: unknown[]): void;\n\twarn(message: string, ...args: unknown[]): void;\n\terror(message: string, ...args: unknown[]): void;\n}\n\nclass NoOpLogger implements Logger {\n\tdebug(): void {}\n\tinfo(): void {}\n\twarn(): void {}\n\terror(): void {}\n}\n\nclass ConsoleLogger implements Logger {\n\tdebug(message: string, ...args: unknown[]): void {\n\t\t// eslint-disable-next-line no-console -- this class exists to be the console sink\n\t\tconsole.debug(message, ...args);\n\t}\n\n\tinfo(message: string, ...args: unknown[]): void {\n\t\tconsole.info(message, ...args);\n\t}\n\n\twarn(message: string, ...args: unknown[]): void {\n\t\tconsole.warn(message, ...args);\n\t}\n\n\terror(message: string, ...args: unknown[]): void {\n\t\tconsole.error(message, ...args);\n\t}\n}\n\n// Defaults to no-op: a library that writes to the console uninvited is a nuisance in a host with\n// its own logging. Opt in with setLogger or enableDebugLogging.\nlet internalLogger: Logger = new NoOpLogger();\n\n// Call per-use rather than caching — the sink is settable at any time.\nexport function getLogger(): Logger {\n\treturn internalLogger;\n}\n\n// Validates logger shape up front: failing here beats a confusing \"getLogger().debug is not a\n// function\" at some later, unrelated call site.\nexport function setLogger(logger: Logger | Console | null): void {\n\tif (logger === null) {\n\t\tinternalLogger = new NoOpLogger();\n\t\treturn;\n\t}\n\n\tconst missing = (['debug', 'info', 'warn', 'error'] as const).filter(\n\t\t(method) => typeof (logger as unknown as Record<string, unknown>)[method] !== 'function'\n\t);\n\tif (missing.length > 0) {\n\t\tthrow new VisualizationError(\n\t\t\t`Logger is missing required method(s): ${missing.join(', ')}. A logger must implement debug, info, warn and error.`,\n\t\t\tErrorCodes.INVALID_CONFIG,\n\t\t\t{ context: { missingMethods: missing } }\n\t\t);\n\t}\n\n\tinternalLogger = logger as Logger;\n}\n\nexport function enableDebugLogging(): void {\n\tsetLogger(new ConsoleLogger());\n}\n","import type * as THREE from 'three';\n\n// ============================================================================\n// LOOKS\n// ============================================================================\n\n/**\n * `LOOKS` is the source of truth ({@link Look} derives from it) so consumers (e.g. a style picker)\n * can iterate instead of hardcoding names. 'technical' is first because it's the default.\n */\nexport const LOOKS = ['technical', 'studio', 'showcase'] as const;\n\nexport type Look = (typeof LOOKS)[number];\n\n/**\n * The lighting/material dials a {@link Look} sets, shared by construction-time defaults and runtime\n * `setLook`. `envMapIntensity`/`cullBackfaces` are parse-time material choices (see\n * `materialAppearanceForLook`); the rest apply to the live scene. Never carries edges or grid —\n * those are independent overlays.\n */\nexport type LookPreset = {\n\ttoneMapping: THREE.ToneMapping;\n\ttoneMappingExposure: number;\n\tenvMapIntensity: number;\n\t/** Multiplier on the HDR's IBL (`scene.environmentIntensity`). */\n\tenvironmentIntensity: number;\n\themisphereIntensity: number;\n\tambientIntensity: number;\n\tcullBackfaces: boolean;\n\tambientOcclusion: boolean;\n};\n\n/**\n * How compute meshes read visually. Lives in `shared/` (not with the parser) so the render layer can\n * read a look's material dials via `materialAppearanceForLook` without importing upward into `parse/`.\n */\nexport interface MaterialAppearanceOptions {\n\t/** Default 1 (three.js's own material default) when omitted. */\n\tenvMapIntensity?: number;\n\t/**\n\t * `THREE.FrontSide` instead of `THREE.DoubleSide` — crisper silhouette on closed solids, but open\n\t * surfaces (which Rhino also emits) vanish when viewed from behind. Default false (DoubleSide) to\n\t * stay safe for surface geometry.\n\t */\n\tcullBackfaces?: boolean;\n}\n","import * as THREE from 'three';\n\nimport type { Look, LookPreset, MaterialAppearanceOptions } from './types.js';\n\n/** The look applied when the caller passes no `look` option. */\nexport const DEFAULT_LOOK: Look = 'technical';\n\n/**\n * Single source of truth for both `applyDefaults` (construction) and `setLook` (runtime), so the two\n * can't drift.\n *\n * `ambientOcclusion: false` on every look: GTAO is a heavy full-screen pass, so it stays opt-in\n * (`render.ambientOcclusion` or `setAmbientOcclusion(true)`) rather than costing every viewer 60fps.\n */\nexport const LOOK_PRESETS: Record<Look, LookPreset> = {\n\t// Fills shadows in (vs. showcase, which lets them fall off). IBL/fill kept modest so\n\t// env+hemisphere+ambient don't triple-stack into an ACES-washed look.\n\tstudio: {\n\t\ttoneMapping: THREE.ACESFilmicToneMapping,\n\t\ttoneMappingExposure: 1,\n\t\tenvMapIntensity: 1.0,\n\t\tenvironmentIntensity: 1.0,\n\t\themisphereIntensity: 0.75,\n\t\tambientIntensity: 0.4,\n\t\tcullBackfaces: false,\n\t\tambientOcclusion: false\n\t},\n\t// Flat ambient kept low — a full flat ambient flattens shading toward milky grey regardless of\n\t// face orientation — with IBL near full and a little hemisphere fill for under-facing surfaces.\n\ttechnical: {\n\t\ttoneMapping: THREE.NeutralToneMapping,\n\t\ttoneMappingExposure: 1,\n\t\tenvMapIntensity: 0.9,\n\t\tenvironmentIntensity: 1,\n\t\themisphereIntensity: 0.35,\n\t\tambientIntensity: 0.25,\n\t\tcullBackfaces: false,\n\t\tambientOcclusion: false\n\t},\n\t// Fill pulled DOWN (low ambient/hemisphere) so light-to-shadow falloff stays strong for a\n\t// dramatic hero shot, unlike `studio` which fills shadows in.\n\tshowcase: {\n\t\ttoneMapping: THREE.ACESFilmicToneMapping,\n\t\ttoneMappingExposure: 1.15,\n\t\tenvMapIntensity: 1.4,\n\t\tenvironmentIntensity: 1.25,\n\t\themisphereIntensity: 0.35,\n\t\tambientIntensity: 0.15,\n\t\tcullBackfaces: false,\n\t\tambientOcclusion: false\n\t}\n};\n\n/** Baked at parse time (not toggleable at runtime). */\nexport function materialAppearanceForLook(look: Look): MaterialAppearanceOptions {\n\tconst preset = LOOK_PRESETS[look];\n\treturn {\n\t\tenvMapIntensity: preset.envMapIntensity,\n\t\tcullBackfaces: preset.cullBackfaces\n\t};\n}\n","// Copied (not imported) from `@selvajs/compute`'s `decodeBase64ToBinary` to avoid depending on the\n// Rhino.Compute client for ~20 stable lines; keep the two in sync by hand.\n\nimport { VisualizationError, ErrorCodes } from './errors.js';\n\nfunction getNodeBuffer(): typeof Buffer | undefined {\n\tconst buf = (globalThis as { Buffer?: typeof Buffer }).Buffer;\n\treturn typeof buf === 'function' ? buf : undefined;\n}\n\n/**\n * @throws {VisualizationError} `ENCODING_ERROR` if invalid, or `INVALID_STATE` if no decoder is\n * available in this environment.\n */\nexport function decodeBase64ToBinary(base64File: string): Uint8Array {\n\t// Forgiving-base64: strip whitespace, then drop trailing padding only where length % 4 allows it.\n\tlet data = base64File.replace(/[\\t\\n\\f\\r ]/g, '');\n\tif (data.length % 4 === 0) data = data.replace(/={1,2}$/, '');\n\tif (data.length % 4 === 1 || !/^[A-Za-z0-9+/]*$/.test(data)) {\n\t\tthrow new VisualizationError('Invalid base64 input.', ErrorCodes.ENCODING_ERROR, {\n\t\t\tcontext: { inputLength: base64File.length }\n\t\t});\n\t}\n\n\t// Prefer Buffer in Node: faster, and avoids the atob + charCodeAt latin-1 detour.\n\tconst Buffer = getNodeBuffer();\n\tif (Buffer) {\n\t\t// Copy out of the Buffer — small Buffer.from results are views over Node's shared 8 KiB pool\n\t\t// slab, so returning one would retain the whole slab and leak unrelated pooled bytes to any\n\t\t// consumer touching `.buffer` (structuredClone, postMessage transfer, etc).\n\t\treturn new Uint8Array(Buffer.from(data, 'base64'));\n\t}\n\tif (typeof globalThis.atob === 'function') {\n\t\tconst binary = globalThis.atob(data);\n\t\tconst bytes = new Uint8Array(binary.length);\n\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\tbytes[i] = binary.charCodeAt(i) & 0xff;\n\t\t}\n\t\treturn bytes;\n\t}\n\n\tthrow new VisualizationError(\n\t\t'Base64 decoding not supported in this environment.',\n\t\tErrorCodes.INVALID_STATE,\n\t\t{ context: { environmentInfo: 'atob or Buffer not available' } }\n\t);\n}\n","import * as THREE from 'three';\n\nimport { getLogger } from './logger.js';\n\n// Object/color utilities shared by `parse/` and `render/`. Live here (not in render's\n// three-helpers) because `parse/` needs them and must never import upward from `render/`.\n\nexport function parseColor(colorString: string): THREE.Color {\n\tif (!colorString || typeof colorString !== 'string') {\n\t\tgetLogger().warn(`Invalid color input: ${colorString}, using white`);\n\t\treturn new THREE.Color(0xffffff);\n\t}\n\n\tconst trimmed = colorString.trim();\n\n\tif (/^#?[0-9A-Fa-f]{6}$/.test(trimmed)) {\n\t\ttry {\n\t\t\tconst hex = trimmed.startsWith('#') ? trimmed : `#${trimmed}`;\n\t\t\treturn new THREE.Color(hex);\n\t\t} catch {\n\t\t\tgetLogger().warn(`Invalid hex color: ${colorString}, using white`);\n\t\t\treturn new THREE.Color(0xffffff);\n\t\t}\n\t}\n\n\tif (trimmed.includes(',')) {\n\t\tconst rgb = trimmed.split(',').map((c) => parseInt(c.trim(), 10));\n\t\tif (rgb.length === 3 && rgb.every((n) => !isNaN(n) && n >= 0 && n <= 255)) {\n\t\t\treturn new THREE.Color(rgb[0] / 255, rgb[1] / 255, rgb[2] / 255);\n\t\t}\n\t}\n\n\t// `new THREE.Color(name)` never throws on unknown names (it logs its own warning and leaves the\n\t// color white), so validate against three's CSS name table instead.\n\tconst named = trimmed.toLowerCase();\n\tif (named in THREE.Color.NAMES) {\n\t\treturn new THREE.Color(THREE.Color.NAMES[named as keyof typeof THREE.Color.NAMES]);\n\t}\n\n\tgetLogger().warn(`Invalid color string: ${colorString}, using white`);\n\treturn new THREE.Color(0xffffff);\n}\n\n/** Defaults to `z` (Rhino's up axis); pass an explicit axis when the scene uses a different `sceneUp`. */\nexport function applyOffset(\n\tmeshes: THREE.Object3D[],\n\toffset: number,\n\taxis: 'x' | 'y' | 'z' = 'z'\n): void {\n\tmeshes.forEach((mesh) => {\n\t\tmesh.position[axis] -= offset;\n\t});\n}\n\nexport function computeCombinedBoundingBox(meshes: THREE.Object3D[]): THREE.Box3 {\n\tconst combinedBoundingBox = new THREE.Box3();\n\tif (meshes.length === 0) return combinedBoundingBox;\n\tmeshes.forEach((mesh) => {\n\t\tmesh.updateMatrixWorld(true);\n\t\tconst bbox = new THREE.Box3().setFromObject(mesh);\n\t\tcombinedBoundingBox.union(bbox);\n\t});\n\treturn combinedBoundingBox;\n}\n","import type * as THREE from 'three';\n\n// ============================================================================\n// GPU resource ownership — the single rule every disposal path obeys\n// ============================================================================\n\n/**\n * Who may free a GPU resource, in one place. A resource has exactly one owner: a **cache** (frees\n * on eviction, nobody else ever), a **module singleton** (nobody ever frees it), or else the\n * **scene** (freed on teardown). Every disposal path asks {@link canDisposeGeometry} /\n * {@link canDisposeMaterial} / {@link canDisposeTexture} and disposes only if true — a new cache\n * adds a claim here, not an audit of every walker.\n */\n\n/**\n * `geometry.userData` tag set by the cross-solve geometry cache (`parse/webdisplay/geometry-cache.ts`).\n * Exported only so the cache can set/clear it; disposal paths should use {@link canDisposeGeometry}.\n */\nexport const CACHED_GEOMETRY_USERDATA_FLAG = 'selvaGeometryCache';\n\n/**\n * `texture.userData` tag for a texture owned by the cross-solve texture cache\n * (`parse/webdisplay/texture-cache.ts`). A cached texture is assigned directly onto materials\n * (`material.map = cached`) and shared across every material using that URL — without this flag the\n * first material sweep to reach one would free a texture the cache still holds and serves elsewhere.\n */\nexport const CACHED_TEXTURE_USERDATA_FLAG = 'selvaTextureCache';\n\n// Module-scope singletons from `render/three-materials.ts`, shared across meshes and solves —\n// disposing one would free textures still in use and force a recompile. Held here (not imported\n// there) to avoid an import cycle.\nconst protectedMaterials = new Set<THREE.Material>();\n\n/** Register materials as never-disposable. Called once by `render/three-materials.ts`. */\nexport function protectMaterials(materials: Iterable<THREE.Material>): void {\n\tfor (const material of materials) protectedMaterials.add(material);\n}\n\n/** True when `geometry` is scene-owned (not held by the geometry cache). */\nexport function canDisposeGeometry(geometry: THREE.BufferGeometry | undefined): boolean {\n\tif (!geometry) return false;\n\treturn !geometry.userData?.[CACHED_GEOMETRY_USERDATA_FLAG];\n}\n\n/** True when `texture` is scene-owned (not held by the texture cache). */\nexport function canDisposeTexture(texture: THREE.Texture | undefined): boolean {\n\tif (!texture) return false;\n\treturn !texture.userData?.[CACHED_TEXTURE_USERDATA_FLAG];\n}\n\n/** True when `material` is scene-owned (not one of the protected singletons). */\nexport function canDisposeMaterial(material: THREE.Material | undefined): boolean {\n\tif (!material) return false;\n\treturn !protectedMaterials.has(material);\n}\n\n// ============================================================================\n// Cache registry — so teardown frees every cache without knowing they exist\n// ============================================================================\n\nconst cacheReleases = new Set<() => void>();\n\n/**\n * Register a cache's \"free everything you hold\" function, called once at the cache's module init.\n * This is how `render/`'s teardown frees `parse/`'s caches without importing `parse/`.\n */\nexport function registerCacheRelease(release: () => void): void {\n\tcacheReleases.add(release);\n}\n\n/**\n * Free every registered cache. One throwing cache does not stop the rest.\n *\n * Prefer {@link retainCaches} in a viewer — caches are shared across viewers, so calling this while\n * another viewer is live discards entries it's still using (they repopulate, but it's wasteful).\n */\nexport function releaseAllCaches(): void {\n\tfor (const release of cacheReleases) {\n\t\ttry {\n\t\t\trelease();\n\t\t} catch {\n\t\t\t// Teardown has no sink to report to — the context is already gone.\n\t\t}\n\t}\n}\n\nlet cacheRetainCount = 0;\n\n/**\n * Claim the shared caches for the lifetime of one viewer. Returns a release function; refcounted\n * because two viewers on one page (e.g. main view + thumbnail) share the same cache entries, and\n * the first to unmount must not wipe the second's working set — caches only actually free once the\n * last viewer releases them.\n */\nexport function retainCaches(): () => void {\n\tcacheRetainCount++;\n\tlet released = false;\n\n\treturn () => {\n\t\t// Idempotent: hosts double-invoke teardown (React StrictMode, double unmount); a second call\n\t\t// must not decrement the count on another viewer's behalf.\n\t\tif (released) return;\n\t\treleased = true;\n\t\tcacheRetainCount--;\n\t\tif (cacheRetainCount <= 0) {\n\t\t\tcacheRetainCount = 0;\n\t\t\treleaseAllCaches();\n\t\t}\n\t};\n}\n","// ============================================================================\n// GPU capabilities — published by the renderer, read by whoever needs them\n// ============================================================================\n\n/**\n * Lets a renderer publish GPU capabilities (max anisotropy) without `render/` and `parse/` importing\n * each other: the renderer publishes on init, interested parties subscribe.\n */\n\ntype AnisotropyObserver = (value: number) => void;\n\nconst observers = new Set<AnisotropyObserver>();\n\n// Module load order between layers isn't guaranteed, so a subscriber arriving after init still\n// needs the current value rather than waiting for a second renderer to publish.\nlet maxAnisotropy = 1;\n\nexport function publishMaxAnisotropy(value: number): void {\n\tconst next = Math.max(1, value);\n\tif (next === maxAnisotropy) return;\n\tmaxAnisotropy = next;\n\tfor (const observe of observers) observe(next);\n}\n\n/** Fires immediately with the current value (1 until a renderer has reported), then on every change. */\nexport function observeMaxAnisotropy(observe: AnisotropyObserver): () => void {\n\tobservers.add(observe);\n\tobserve(maxAnisotropy);\n\treturn () => observers.delete(observe);\n}\n","import * as THREE from 'three';\n\nimport { canDisposeGeometry, canDisposeMaterial, canDisposeTexture } from './gpu-ownership.js';\n\n// ============================================================================\n// The disposal walkers — every teardown path in the package goes through these\n// ============================================================================\n\n/**\n * Free a material and its textures, respecting ownership (`./gpu-ownership.ts`). Walks own\n * enumerable properties only (`for...in` would also walk the prototype chain).\n */\nexport function disposeMaterial(material: THREE.Material): void {\n\tif (!canDisposeMaterial(material)) return;\n\n\tfor (const value of Object.values(material)) {\n\t\tif (value instanceof THREE.Texture && canDisposeTexture(value)) {\n\t\t\tvalue.dispose();\n\t\t}\n\t}\n\tmaterial.dispose();\n}\n\nfunction disposeMaterials(material: THREE.Material | THREE.Material[] | undefined): void {\n\tif (!material) return;\n\tif (Array.isArray(material)) material.forEach(disposeMaterial);\n\telse disposeMaterial(material);\n}\n\nexport interface DisposeOptions {\n\t/** Free materials and their textures too. Default true; the solve memo passes false. */\n\tmaterials?: boolean;\n\t/** Called for each geometry before disposal, so a subsystem can free derived resources keyed on it (e.g. edge caches). */\n\tonGeometry?: (geometry: THREE.BufferGeometry) => void;\n}\n\n/**\n * Free the GPU resources of an object subtree, respecting ownership. **The only traversal that\n * should dispose scene content** — a second disposing `traverse` risks missing an ownership guard.\n */\nexport function disposeObjectTree(root: THREE.Object3D, options: DisposeOptions = {}): void {\n\tconst { materials = true, onGeometry } = options;\n\n\troot.traverse((object) => {\n\t\tconst renderable = object as Partial<THREE.Mesh> & THREE.Object3D;\n\t\tif (!renderable.geometry && !renderable.material) return;\n\n\t\tif (renderable.geometry) {\n\t\t\tonGeometry?.(renderable.geometry);\n\t\t\tif (canDisposeGeometry(renderable.geometry)) renderable.geometry.dispose();\n\t\t}\n\n\t\tif (materials) disposeMaterials(renderable.material);\n\t});\n}\n"],"mappings":"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","names":["ErrorCodes","VisualizationError","message","code","options","__publicField","NoOpLogger","ConsoleLogger","message","args","internalLogger","getLogger","setLogger","logger","missing","method","VisualizationError","ErrorCodes","enableDebugLogging","LOOKS","THREE","DEFAULT_LOOK","LOOK_PRESETS","materialAppearanceForLook","look","preset","getNodeBuffer","buf","decodeBase64ToBinary","base64File","data","VisualizationError","ErrorCodes","Buffer","binary","bytes","THREE","parseColor","colorString","getLogger","trimmed","hex","rgb","c","n","named","applyOffset","meshes","offset","axis","mesh","computeCombinedBoundingBox","combinedBoundingBox","bbox","CACHED_GEOMETRY_USERDATA_FLAG","CACHED_TEXTURE_USERDATA_FLAG","protectedMaterials","canDisposeGeometry","geometry","CACHED_GEOMETRY_USERDATA_FLAG","canDisposeTexture","texture","CACHED_TEXTURE_USERDATA_FLAG","canDisposeMaterial","material","protectedMaterials","cacheReleases","registerCacheRelease","release","releaseAllCaches","cacheRetainCount","retainCaches","released","observers","maxAnisotropy","publishMaxAnisotropy","value","next","observe","observeMaxAnisotropy","THREE","disposeMaterial","material","canDisposeMaterial","value","canDisposeTexture","disposeMaterials","disposeObjectTree","root","options","materials","onGeometry","object","renderable","canDisposeGeometry"]}
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["c:\\Users\\felix\\coding\\selva\\packages\\visualization\\dist\\index.cjs"],"names":[],"mappings":"AAAA","file":"C:\\Users\\felix\\coding\\selva\\packages\\visualization\\dist\\index.cjs"}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/parse.cjs ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkAQJPVUH3cjs = require('./chunk-AQJPVUH3.cjs');require('./chunk-BYLIBOAU.cjs');function bt(e){return e.map(t=>{let r=t.clone(!0),n=[];t.traverse(a=>n.push(a));let o=0;return r.traverse(a=>{let s=n[o++],u=a;if(!s.geometry)return;let i=s.geometry.clone();i.userData={...i.userData},delete i.userData[_chunkAQJPVUH3cjs.n],u.geometry=i}),r})}function Et(e){e.forEach(t=>_chunkAQJPVUH3cjs.v.call(void 0, t,{materials:!1}))}var xt={clone:bt,release:Et};var _three = require('three'); var de = _interopRequireWildcard(_three); var _e = _interopRequireWildcard(_three); var P = _interopRequireWildcard(_three); var V = _interopRequireWildcard(_three); var z = _interopRequireWildcard(_three); var ce = _interopRequireWildcard(_three); var O = _interopRequireWildcard(_three);var _Line2js = require('three/addons/lines/Line2.js');var _LineGeometryjs = require('three/addons/lines/LineGeometry.js');var _LineMaterialjs = require('three/addons/lines/LineMaterial.js');var At="#ffffff";function te(e,t){let r=_nullishCoalesce(t, () => (1));return{color:new _e.Color(_nullishCoalesce(e, () => (At))),transparent:r<1,opacity:r}}var Fe=12,Rt=4e-4,vt=12,St=.05,Ct=2;function Pe(e,t){if(!t)return _chunkAQJPVUH3cjs.c.call(void 0, ).warn("No rhino3dm instance provided; skipping curve display item."),null;let r=Bt(e.json,t);if(!r)return null;let n;try{n=It(r)}catch(l){return _chunkAQJPVUH3cjs.c.call(void 0, ).warn("Failed to tessellate curve display item; skipping.",l),null}finally{Y(r)}if(n.length<2)return null;let o=[];for(let l of n)o.push(l.x,l.y,l.z);let a=new _LineGeometryjs.LineGeometry;a.setPositions(o);let s=te(e.color,e.opacity),u=new (0, _LineMaterialjs.LineMaterial)({color:s.color}),i=u;i.linewidth=_nullishCoalesce(e.width, () => (Ct)),i.transparent=s.transparent,i.opacity=s.opacity;let f=new (0, _Line2js.Line2)(a,u);return f.computeLineDistances(),f.name=e.name,f.userData={source:"compute",id:e.id,layer:e.layer,kind:"curve",metadata:e.metadata},f}function Y(e){_optionalChain([e, 'optionalAccess', _2 => _2.delete, 'optionalCall', _3 => _3()])}function Bt(e,t){try{let r=JSON.parse(e),n=t.CommonObject.decode(r);return n&&typeof n.pointAt=="function"?n:(Y(n),_chunkAQJPVUH3cjs.c.call(void 0, ).warn("Decoded display-item JSON is not a curve; skipping."),null)}catch(r){return _chunkAQJPVUH3cjs.c.call(void 0, ).warn("Failed to decode curve display item JSON:",r),null}}function It(e){let t=Dt(e);return t||Ot(e)}function Dt(e){if(!e.isPolyline())return null;let t=e.tryGetPolyline(),r=Array.isArray(t)?t[1]:t;if(!r||typeof r.count!="number"||r.count<2)return Y(r),null;let n=[];for(let o=0;o<r.count;o++){let a=r.get(o);n.push(new de.Vector3(a[0],a[1],a[2]))}return Y(r),n}function Ot(e){let t=e.domain,r=t[0],o=t[1]-r,a=l=>{let y=e.pointAt(l);return new de.Vector3(y[0],y[1],y[2])},s=Ut(e),u=r,i=a(r),f=[i];for(let l=0;l<Fe;l++){let y=r+o*(l+1)/Fe,b=a(y);me(u,i,y,b,a,s,vt,f),f.push(b),u=y,i=b}return f}function me(e,t,r,n,o,a,s,u){if(s<=0)return;let i=(e+r)/2,f=o(i),l=Lt(f,t,n),y=Ht(t,f,n);l<=a&&y<=St||(me(e,t,i,f,o,a,s-1,u),u.push(f),me(i,f,r,n,o,a,s-1,u))}function Ut(e){let t=e.getBoundingBox(),r=t.min,n=t.max;Y(t);let o=Math.hypot(n[0]-r[0],n[1]-r[1],n[2]-r[2]);return Math.max(o*Rt,1e-6)}function Ht(e,t,r){let n=t.x-e.x,o=t.y-e.y,a=t.z-e.z,s=r.x-t.x,u=r.y-t.y,i=r.z-t.z,f=Math.sqrt(n*n+o*o+a*a),l=Math.sqrt(s*s+u*u+i*i);if(f===0||l===0)return 0;let y=n*s+o*u+a*i,b=Math.max(-1,Math.min(1,y/(f*l)));return Math.acos(b)}function Lt(e,t,r){let n=r.x-t.x,o=r.y-t.y,a=r.z-t.z,s=n*n+o*o+a*a;if(s===0)return e.distanceTo(t);let u=e.x-t.x,i=e.y-t.y,f=e.z-t.z,l=Math.max(0,Math.min(1,(u*n+i*o+f*a)/s)),y=u-n*l,b=i-o*l,w=f-a*l;return Math.sqrt(y*y+b*b+w*w)}function Ve(e){let{position:t}=e;if(!t||typeof t.X!="number"||!Number.isFinite(t.X)||typeof t.Y!="number"||!Number.isFinite(t.Y)||typeof t.Z!="number"||!Number.isFinite(t.Z))return _chunkAQJPVUH3cjs.c.call(void 0, ).warn(`Skipping point display item with missing or non-finite position (id: ${String(e.id)}).`),null;let r=new P.BufferGeometry;r.setAttribute("position",new P.Float32BufferAttribute([t.X,t.Y,t.Z],3));let n=new P.PointsMaterial({...te(e.color,e.opacity),size:6,sizeAttenuation:!1}),o=new P.Points(r,n);return o.name=e.name,o.userData={source:"compute",id:e.id,layer:e.layer,kind:"point",metadata:e.metadata},o}function pe(e,t={}){if(!e||e.length===0)return[];let{rhino:r}=t,n=[];for(let o of e)switch(o.kind){case"curve":{let a=Pe(o,r);a&&n.push(a);break}case"point":{let a=Ve(o);a&&n.push(a);break}default:{let s=o;_chunkAQJPVUH3cjs.c.call(void 0, ).warn(`Skipping unknown display item kind: ${String(s.kind)}`);break}}return n}var ke=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;var _fflate = require('fflate');function Ge(e){return typeof e=="string"?_chunkAQJPVUH3cjs.f.call(void 0, e):e instanceof Uint8Array?e:new Uint8Array(e)}function Ne(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 r=t.getUint32(4,!0),n=e.subarray(8),o=Math.max(n.byteLength*1032+1024,1<<20);if(r>o)throw I("SLVZ header declares an implausible uncompressed length",{uncompressedLen:r,deflatedBytes:n.byteLength,maxPlausibleLen:o});let a;try{a=_fflate.inflateSync.call(void 0, n,{out:new Uint8Array(r+1)})}catch(s){throw I(`Failed to inflate SLVZ blob: ${s instanceof Error?s.message:String(s)}`,{uncompressedLen:r,deflatedBytes:n.byteLength})}if(a.byteLength!==r)throw I("SLVZ payload inflated to a different size than the header declares.",{declaredLen:r,actualLen:a.byteLength,deflatedBytes:n.byteLength});return a}function je(e){if(typeof TextDecoder<"u")return new TextDecoder("utf-8").decode(e);if(typeof globalThis.Buffer<"u")return globalThis.Buffer.from(e).toString("utf-8");throw new (0, _chunkAQJPVUH3cjs.b)("No UTF-8 decoder available in this environment.",_chunkAQJPVUH3cjs.a.INVALID_STATE)}function $e(e,t,r){if(r===0)return new Int16Array(0);if(t%2===0)return new Int16Array(e,t,r);let n=new Uint8Array(r*2);return n.set(new Uint8Array(e,t,r*2)),new Int16Array(n.buffer)}function re(e,t,r){if(r===0)return new Float32Array(0);if(t%4===0)return new Float32Array(e,t,r);let n=new Uint8Array(r*4);return n.set(new Uint8Array(e,t,r*4)),new Float32Array(n.buffer)}function W(e,t,r){if(r===0)return new Uint16Array(0);if(t%2===0)return new Uint16Array(e,t,r);let n=new Uint8Array(r*2);return n.set(new Uint8Array(e,t,r*2)),new Uint16Array(n.buffer)}function ze(e,t,r){if(r===0)return new Uint32Array(0);if(t%4===0)return new Uint32Array(e,t,r);let n=new Uint8Array(r*4);return n.set(new Uint8Array(e,t,r*4)),new Uint32Array(n.buffer)}function Ye(e,t){if(e.length!==0&&!(e instanceof Uint16Array&&t>65535)){for(let r=0;r<e.length;r++)if(e[r]>=t)throw I("Index out of range of vertexCount.",{indexPosition:r,indexValue:e[r],vertexCount:t})}}function L(e){return e>>>1^-(e&1)}function We(e){let t=new Int16Array(e.length),r=0,n=0,o=0;for(let a=0;a<e.length;a+=3)r=r+L(e[a])<<16>>16,n=n+L(e[a+1])<<16>>16,o=o+L(e[a+2])<<16>>16,t[a]=r,t[a+1]=n,t[a+2]=o;return t}function Je(e){let t=new Uint16Array(e.length),r=0;for(let n=0;n<e.length;n++)r=r+L(e[n])&65535,t[n]=r;return t}function Xe(e){let t=new Uint32Array(e.length),r=0;for(let n=0;n<e.length;n++)r=r+L(e[n])>>>0,t[n]=r;return t}function I(e,t){return new (0, _chunkAQJPVUH3cjs.b)(e,_chunkAQJPVUH3cjs.a.VALIDATION_ERROR,{context:t})}var Ke=36;function qe(e,t,r,n,o){if(r+Ke>e.byteLength)throw I("Insufficient data to read UV chunk header.",{expectedBytes:Ke,availableBytes:e.byteLength-r,offset:r});let a=t.getUint32(r,!0);r+=4;let s=t.getFloat64(r,!0);r+=8;let u=t.getFloat64(r,!0);r+=8;let i=t.getFloat64(r,!0);r+=8;let f=t.getFloat64(r,!0);r+=8;let l=n*2,y=a===1,b=l*(y?4:2);if(r+b>e.byteLength)throw I("Insufficient data to read UV chunk.",{expectedBytes:b,availableBytes:e.byteLength-r,offset:r,uvFormat:a,vertexCount:n});let w=e.byteOffset+r,v;if(y)v=re(e.buffer,w,l).slice();else{let C=W(e.buffer,w,l);v=new Float32Array(l);let c=0,d=0;for(let p=0;p<l;p+=2)o?(c=c+L(C[p])&65535,d=d+L(C[p+1])&65535):(c=C[p],d=C[p+1]),v[p]=s+c*i,v[p+1]=u+d*f}return{uvs:v,offset:r+b}}function Ze(e,t,r,n){let o=r*3;if(t+o>e.byteLength)throw I("Insufficient data to read vertex-color chunk.",{expectedBytes:o,availableBytes:e.byteLength-t,offset:t,vertexCount:r});let a=e.subarray(t,t+o);if(!n)return a.slice();let s=new Uint8Array(o),u=0,i=0,f=0;for(let l=0;l<o;l+=3)u=u+L(a[l])&255,i=i+L(a[l+1])&255,f=f+L(a[l+2])&255,s[l]=u,s[l+1]=i,s[l+2]=f;return s}function he(e){let t=ge(e),r;t.isFloat32?r=t.vertexData:t.deltaEncoded?r=We(t.vertexData):r=t.vertexData;let n=t.indexData;return t.deltaEncoded&&(n=n instanceof Uint16Array?Je(n):Xe(n)),Ye(n,t.vertexCount),{metadata:t.metadata,flags:t.flags,vertices:r,indices:n,origin:t.origin,scale:t.scale,uvs:t.uvs,colors:t.colors}}function ge(e){if(!ke)throw new (0, _chunkAQJPVUH3cjs.b)("SLVA parsing requires a little-endian host: the zero-copy geometry readers view the wire bytes in host byte order.",_chunkAQJPVUH3cjs.a.ENVIRONMENT_ERROR);let t=Ne(Ge(e)),r=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.byteLength<12)throw I("Blob too small to contain SLVA header.",{expectedBytes:12,availableBytes:t.byteLength});let n=0,o=r.getUint32(n,!0);if(n+=4,o!==1096174675)throw I(`Invalid SLVA magic: 0x${o.toString(16)}`,{expectedMagic:`0x${1096174675 .toString(16)}`,actualMagic:`0x${o.toString(16)}`});let a=r.getUint32(n,!0);if(n+=4,a<1||a>3)throw I(`Unsupported SLVA version: ${a}`,{minSupportedVersion:1,maxSupportedVersion:3,actualVersion:a});let s=r.getUint32(n,!0);if(n+=4,n+s>t.byteLength)throw I("Insufficient data to read metadata JSON.",{expectedBytes:s,availableBytes:t.byteLength-n,offset:n});let u=t.subarray(n,n+s);n+=s;let i;try{i=JSON.parse(je(u))}catch(U){throw I(`Failed to parse metadata JSON: ${U instanceof Error?U.message:String(U)}`,{metadataLen:s})}if(n+56>t.byteLength)throw I("Insufficient data to read geometry header.",{expectedBytes:56,availableBytes:t.byteLength-n,offset:n});let f=r.getUint32(n,!0);n+=4;let l=r.getFloat64(n,!0);n+=8;let y=r.getFloat64(n,!0);n+=8;let b=r.getFloat64(n,!0);n+=8;let w=r.getFloat64(n,!0);n+=8;let v=r.getFloat64(n,!0);n+=8;let C=r.getFloat64(n,!0);n+=8;let c=r.getUint32(n,!0);n+=4;let d=(f&1)!==0,p=(f&4)!==0,m=c*3,S=m*(d?4:2);if(n+S>t.byteLength)throw I("Insufficient data to read vertices.",{expectedBytes:S,availableBytes:t.byteLength-n,offset:n,useFloat32:d,vertexCount:c});let T=t.byteOffset+n,g;if(d?g=re(t.buffer,T,m):p?g=W(t.buffer,T,m):g=$e(t.buffer,T,m),n+=S,n+4>t.byteLength)throw I("Insufficient data to read index count.",{expectedBytes:4,availableBytes:t.byteLength-n,offset:n});let x=r.getUint32(n,!0);n+=4;let R=(f&2)!==0,M=x*(R?2:4);if(n+M>t.byteLength)throw I("Insufficient data to read indices.",{expectedBytes:M,availableBytes:t.byteLength-n,offset:n,indexCount:x,useUint16Indices:R});let B=R?W(t.buffer,t.byteOffset+n,x):ze(t.buffer,t.byteOffset+n,x);n+=M;let D=null;if((f&8)!==0){let U=qe(t,r,n,c,p);D=U.uvs,n=U.offset}let H=null;return(f&16)!==0&&(H=Ze(t,n,c,p)),{metadata:i,flags:f,vertexData:g,indexData:B,isFloat32:d,deltaEncoded:p,vertexCount:c,origin:[l,y,b],scale:[w,v,C],uvs:D,colors:H}}var ot=256*1024*1024,ne=1024,_=new Map,oe=0;function at(e,t){let r=2166136261,n=o=>{r^=o,r=Math.imul(r,16777619)};for(let o=0;o<t.length;o++)n(t.charCodeAt(o));for(let o of e){if(!o){n(57005);continue}let a=o.byteLength;if(n(a),(o.byteOffset&3)===0&&(a&3)===0){let s=new Uint32Array(o.buffer,o.byteOffset,a>>2),u=Math.min(ne,s.length);for(let i=0;i<u;i++)n(s[i]);for(let i=Math.max(u,s.length-ne);i<s.length;i++)n(s[i])}else{let s=new Uint8Array(o.buffer,o.byteOffset,a),u=Math.min(ne*4,s.length);for(let i=0;i<u;i++)n(s[i]);for(let i=Math.max(u,s.length-ne*4);i<s.length;i++)n(s[i])}}return`${(r>>>0).toString(36)}:${e.length}`}function Gt(e){let t=_nullishCoalesce(_optionalChain([e, 'access', _4 => _4.index, 'optionalAccess', _5 => _5.array, 'access', _6 => _6.byteLength]), () => (0));for(let r of Object.values(e.attributes))t+=r.array.byteLength;return t}function J(e){let t=_.get(e);if(t)return _.delete(e),_.set(e,t),t.geometry}function X(e,t){let r=Gt(t);if(!(r>ot)&&!_.has(e))for(t.userData[_chunkAQJPVUH3cjs.n]=!0,_.set(e,{geometry:t,bytes:r}),oe+=r;oe>ot&&_.size>1;){let n=_.keys().next().value,o=_.get(n);_.delete(n),oe-=o.bytes,delete o.geometry.userData[_chunkAQJPVUH3cjs.n],o.geometry.dispose()}}_chunkAQJPVUH3cjs.q.call(void 0, ()=>Nt());function Nt(){for(let e of _.values())delete e.geometry.userData[_chunkAQJPVUH3cjs.n],e.geometry.dispose();_.clear(),oe=0}function jt(e){let{isFloat32:t,deltaEncoded:r,origin:n,scale:o,uvs:a,colors:s,jobs:u}=e,i=c=>c>>>1^-(c&1),f;if(t)f=e.vertexData;else{let c;if(r){let g=e.vertexData;c=new Int16Array(g.length);let x=0,R=0,E=0;for(let M=0;M<g.length;M+=3)x=x+i(g[M])<<16>>16,R=R+i(g[M+1])<<16>>16,E=E+i(g[M+2])<<16>>16,c[M]=x,c[M+1]=R,c[M+2]=E}else c=e.vertexData;f=new Float32Array(c.length);let d=n[0],p=n[1],m=n[2],h=o[0],S=o[1],T=o[2];for(let g=0;g<c.length;g+=3)f[g]=d+(c[g]+32767)*h,f[g+1]=p+(c[g+1]+32767)*S,f[g+2]=m+(c[g+2]+32767)*T}let l;if(r){let c=e.indexData;if(c instanceof Uint16Array){let d=new Uint16Array(c.length),p=0;for(let m=0;m<c.length;m++)p=p+i(c[m])&65535,d[m]=p;l=d}else{let d=new Uint32Array(c.length),p=0;for(let m=0;m<c.length;m++)p=p+i(c[m])>>>0,d[m]=p;l=d}}else l=e.indexData;let y=f.length/3;for(let c=0;c<l.length;c++)if(l[c]>=y)throw new Error(`Index ${l[c]} out of range of vertexCount ${y}`);let b=1024,w=(c,d)=>{let p=2166136261,m=h=>{p^=h,p=Math.imul(p,16777619)};for(let h=0;h<d.length;h++)m(d.charCodeAt(h));for(let h of c){if(!h){m(57005);continue}let S=h.byteLength;if(m(S),(h.byteOffset&3)===0&&(S&3)===0){let T=new Uint32Array(h.buffer,h.byteOffset,S>>2),g=Math.min(b,T.length);for(let x=0;x<g;x++)m(T[x]);for(let x=Math.max(g,T.length-b);x<T.length;x++)m(T[x])}else{let T=new Uint8Array(h.buffer,h.byteOffset,S),g=Math.min(b*4,T.length);for(let x=0;x<g;x++)m(T[x]);for(let x=Math.max(g,T.length-b*4);x<T.length;x++)m(T[x])}}return`${(p>>>0).toString(36)}:${c.length}`},v=(c,d)=>{let p=[],m=c;for(let h of d){m+=`|${h.vertexStart},${h.vertexCount},${h.indexStart},${h.indexCount}`;let S=h.vertexStart*3,T=S+h.vertexCount*3;p.push(f.subarray(S,T)),p.push(l.subarray(h.indexStart,h.indexStart+h.indexCount)),p.push(a?a.subarray(h.vertexStart*2,(h.vertexStart+h.vertexCount)*2):null),p.push(s?s.subarray(S,T):null)}return w(p,m)},C=[];for(let c of u){let d=0,p=0;for(let E of c.windows)d+=E.vertexCount,p+=E.indexCount;let m=new Float32Array(d*3),h=new Uint32Array(p),S=a?new Float32Array(d*2):null,T=s?new Uint8Array(d*3):null,g=0,x=0;for(let E of c.windows){let M=E.vertexStart*3;m.set(f.subarray(M,M+E.vertexCount*3),g*3),S&&a&&S.set(a.subarray(E.vertexStart*2,(E.vertexStart+E.vertexCount)*2),g*2),T&&s&&T.set(s.subarray(M,M+E.vertexCount*3),g*3);let B=E.vertexStart,D=E.vertexStart+E.vertexCount,H=g-E.vertexStart;for(let U=0;U<E.indexCount;U++){let k=l[E.indexStart+U];if(k<B||k>=D)throw new Error(`Index ${k} outside vertex window [${B}, ${D})`);h[x+U]=k+H}g+=E.vertexCount,x+=E.indexCount}let R=new Float32Array(d*3);for(let E=0;E<h.length;E+=3){let M=h[E]*3,B=h[E+1]*3,D=h[E+2]*3,H=m[D]-m[B],U=m[D+1]-m[B+1],k=m[D+2]-m[B+2],ve=m[M]-m[B],Se=m[M+1]-m[B+1],Ce=m[M+2]-m[B+2],le=U*Ce-k*Se,ue=k*ve-H*Ce,fe=H*Se-U*ve;R[M]+=le,R[M+1]+=ue,R[M+2]+=fe,R[B]+=le,R[B+1]+=ue,R[B+2]+=fe,R[D]+=le,R[D+1]+=ue,R[D+2]+=fe}for(let E=0;E<R.length;E+=3){let M=R[E],B=R[E+1],D=R[E+2],H=Math.sqrt(M*M+B*B+D*D)||1;R[E]=M/H,R[E+1]=B/H,R[E+2]=D/H}C.push({key:v(c.kind,c.windows),positions:m,normals:R,indices:h,uvs:S,colors:T})}return C}function st(){return[`const assemble = ${jt.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
+ `)}var it=5e4,j,K=new Map,$t=1;function ct(){if(j!==void 0)return j;if(typeof Worker>"u"||typeof Blob>"u"||typeof URL>"u"||typeof URL.createObjectURL!="function")return j=null,null;try{let e=URL.createObjectURL(new Blob([st()],{type:"text/javascript"})),t=new Worker(e);t.onmessage=r=>{let{id:n,geometries:o,error:a}=r.data,s=K.get(n);s&&(K.delete(n),o?s.resolve(o):s.reject(new Error(_nullishCoalesce(a, () => ("mesh assembly failed in worker")))))},t.onerror=()=>{for(let r of K.values())r.reject(new Error("mesh assembly worker crashed"));K.clear(),t.terminate(),j=null},j=t}catch (e2){j=null}return j}function lt(e,t,r){return new Promise((n,o)=>{let a=$t++;K.set(a,{resolve:n,reject:o}),e.postMessage({id:a,input:t},r)})}var zt=64,Yt=256,F=new Map,q=new Map,ae=0,ie=class extends Error{constructor(t){super(`Texture load for ${t} resolved after clearTextureCache(); texture disposed.`),this.name="StaleTextureLoadError"}},se=1;function ut(e){se=Math.max(1,e);for(let t of F.values())t.anisotropy!==se&&(t.anisotropy=se,t.needsUpdate=!0)}_chunkAQJPVUH3cjs.u.call(void 0, ut);function ft(e,t){let r=Jt(t),n=F.get(r);if(n){F.delete(r),F.set(r,n),e.map=n,e.needsUpdate=!0;return}typeof document>"u"||qt(t,r).then(o=>{e.map=o,e.needsUpdate=!0}).catch(o=>{o instanceof ie||_chunkAQJPVUH3cjs.c.call(void 0, ).warn(`Failed to load material texture ${t}:`,o)})}_chunkAQJPVUH3cjs.q.call(void 0, ()=>Wt());function Wt(){ae++;for(let e of F.values())delete e.userData[_chunkAQJPVUH3cjs.o],e.dispose();F.clear(),q.clear()}function Jt(e){return e.length<=Yt?e:`data-uri:${Xt(e).toString(16)}:${e.length}`}function Xt(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return t>>>0}function Kt(e,t){for(t.userData[_chunkAQJPVUH3cjs.o]=!0,F.set(e,t);F.size>zt;){let r=F.keys().next().value,n=F.get(r);F.delete(r),delete n.userData[_chunkAQJPVUH3cjs.o],n.dispose()}}function qt(e,t){let r=q.get(t);if(!r){let n=ae;r=new Promise((o,a)=>{new ce.TextureLoader().load(e,s=>{if(n!==ae){s.dispose(),a(new ie(e));return}s.colorSpace=ce.SRGBColorSpace,s.anisotropy=se,Kt(t,s),q.delete(t),o(s)},void 0,s=>{n===ae&&q.delete(t),a(s)})}),q.set(t,r)}return r}var Zt=.5,Qt=.5,er=.3;function be(e,t){let r=_chunkAQJPVUH3cjs.k.call(void 0, e.color),n=_nullishCoalesce(_optionalChain([t, 'optionalAccess', _7 => _7.vertexColors]), () => (!1)),o=_optionalChain([t, 'optionalAccess', _8 => _8.appearance]),a=new z.MeshPhysicalMaterial({color:r,metalness:e.metalness,roughness:e.roughness,opacity:e.opacity,transparent:e.transparent,vertexColors:n,side:_optionalChain([o, 'optionalAccess', _9 => _9.cullBackfaces])?z.FrontSide:z.DoubleSide,polygonOffset:!0,polygonOffsetFactor:.5,polygonOffsetUnits:.5,depthWrite:!0,depthTest:!0});return _optionalChain([o, 'optionalAccess', _10 => _10.envMapIntensity])!=null&&(a.envMapIntensity=o.envMapIntensity),e.metalness>Zt&&(a.clearcoat=Qt,a.clearcoatRoughness=er),n&&tr(a),e.map&&ft(a,e.map),a}function tr(e){e.onBeforeCompile=t=>{t.vertexShader=t.vertexShader.replace("#include <color_vertex>",`#include <color_vertex>
3
+ #if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA )
4
+ vColor.rgb = mix(
5
+ vColor.rgb / 12.92,
6
+ pow( ( vColor.rgb + 0.055 ) / 1.055, vec3( 2.4 ) ),
7
+ step( vec3( 0.04045 ), vColor.rgb )
8
+ );
9
+ #endif`)}}function Z(e,t){return new (0, _chunkAQJPVUH3cjs.b)(e,_chunkAQJPVUH3cjs.a.VALIDATION_ERROR,{context:t})}function Ee(e,t,r,n){for(let o of e){if(!Number.isInteger(o.materialId)||o.materialId<0||o.materialId>=t)throw Z("Group materialId out of range of the materials array.",{materialId:o.materialId,materialCount:t});for(let a of o.meshes){let s={vertexStart:a.vertexStart,vertexCount:a.vertexCount,indexStart:a.indexStart,indexCount:a.indexCount};for(let[u,i]of Object.entries(s))if(!Number.isInteger(i)||i<0)throw Z(`Mesh metadata field "${u}" must be a non-negative integer.`,{meshName:a.name,field:u,value:i});if(a.vertexStart+a.vertexCount>r)throw Z("Mesh vertex window exceeds the batch vertex buffer.",{meshName:a.name,vertexStart:a.vertexStart,vertexCount:a.vertexCount,totalVertexCount:r});if(a.indexStart+a.indexCount>n)throw Z("Mesh index window exceeds the batch index buffer.",{meshName:a.name,indexStart:a.indexStart,indexCount:a.indexCount,totalIndexCount:n})}}}function xe(e,t){return Z("Index references a vertex outside its mesh's vertex window.",{meshName:t.name,indexValue:e,vertexStart:t.vertexStart,vertexCount:t.vertexCount})}function Ae(e,t,r,n,o,a){let s=[],u=e;for(let i of t){u+=`|${i.vertexStart},${i.vertexCount},${i.indexStart},${i.indexCount}`;let f=i.vertexStart*3,l=f+i.vertexCount*3;s.push(r.subarray(f,l)),s.push(n.subarray(i.indexStart,i.indexStart+i.indexCount)),s.push(o?o.subarray(i.vertexStart*2,(i.vertexStart+i.vertexCount)*2):null),s.push(a?a.subarray(f,l):null)}return at(s,u)}function mt(e,t,r){let n=new Float32Array(e.length),o=t[0],a=t[1],s=t[2],u=r[0],i=r[1],f=r[2];for(let l=0;l<e.length;l+=3)n[l]=o+(e[l]+32767)*u,n[l+1]=a+(e[l+1]+32767)*i,n[l+2]=s+(e[l+2]+32767)*f;return n}function dt(e,t,r,n,o=null,a=null){let s=Ae("merged",e.meshes,t,r,o,a),u=J(s);if(!u){let i=0,f=0;for(let c of e.meshes)i+=c.vertexCount,f+=c.indexCount;let l=new Float32Array(i*3),y=new Uint32Array(f),b=o?new Float32Array(i*2):null,w=a?new Uint8Array(i*3):null,v=0,C=0;for(let c of e.meshes){let d=c.vertexStart*3,p=c.vertexCount*3;if(l.set(t.subarray(d,d+p),v*3),b&&o){let g=c.vertexStart*2;b.set(o.subarray(g,g+c.vertexCount*2),v*2)}w&&a&&w.set(a.subarray(d,d+p),v*3);let m=r.subarray(c.indexStart,c.indexStart+c.indexCount),h=v-c.vertexStart,S=c.vertexStart,T=c.vertexStart+c.vertexCount;for(let g=0;g<m.length;g++){let x=m[g];if(x<S||x>=T)throw xe(x,c);y[C+g]=x+h}v+=c.vertexCount,C+=c.indexCount}u=new O.BufferGeometry,u.setAttribute("position",new O.BufferAttribute(l,3)),u.setIndex(new O.BufferAttribute(y,1)),b&&u.setAttribute("uv",new O.BufferAttribute(b,2)),w&&u.setAttribute("color",new O.BufferAttribute(w,3,!0)),u.computeVertexNormals(),X(s,u)}return Me(u,e,n)}function Me(e,t,r){let n=new O.Mesh(e,r[t.materialId]),o=t.meshes[0],a=t.meshes.map(s=>s.name).filter(s=>s&&s.length>0);return n.name=a.length>0?a[0]:`merged_material_${t.materialId}`,n.castShadow=!0,n.receiveShadow=!0,n.userData={source:"compute",name:n.name,layer:_nullishCoalesce(_optionalChain([o, 'optionalAccess', _11 => _11.layer]), () => ("")),originalIndex:_nullishCoalesce(_optionalChain([o, 'optionalAccess', _12 => _12.originalIndex]), () => (0)),metadata:_nullishCoalesce(_optionalChain([o, 'optionalAccess', _13 => _13.metadata]), () => ({})),mergedFrom:t.meshes.slice(1).map(s=>({name:s.name,layer:s.layer,originalIndex:s.originalIndex}))},n}function pt(e,t,r,n,o=null,a=null){let s=[];for(let u of e.meshes){let i=u.vertexStart*3,f=u.vertexCount*3,l=Ae("single",[u],t,r,o,a),y=J(l);if(!y){let b=t.slice(i,i+f),w=r.subarray(u.indexStart,u.indexStart+u.indexCount),v=new Uint32Array(w.length),C=u.vertexStart,c=u.vertexStart+u.vertexCount;for(let d=0;d<w.length;d++){let p=w[d];if(p<C||p>=c)throw xe(p,u);v[d]=p-C}if(y=new O.BufferGeometry,y.setAttribute("position",new O.BufferAttribute(b,3)),y.setIndex(new O.BufferAttribute(v,1)),o){let d=u.vertexStart*2,p=o.slice(d,d+u.vertexCount*2);y.setAttribute("uv",new O.BufferAttribute(p,2))}if(a){let d=a.slice(i,i+f);y.setAttribute("color",new O.BufferAttribute(d,3,!0))}y.computeVertexNormals(),X(l,y)}s.push(we(y,u,e,n))}return s}function we(e,t,r,n){let o=new O.Mesh(e,n[r.materialId]);return o.name=t.name,o.userData={source:"compute",name:t.name,layer:_nullishCoalesce(t.layer, () => ("")),originalIndex:t.originalIndex,metadata:_nullishCoalesce(t.metadata, () => ({}))},o.castShadow=!0,o.receiveShadow=!0,o}async function Te(e,t,r){let{mergeByMaterial:n=!0,debug:o=!1,material:a}=_nullishCoalesce(t, () => ({})),{parseTime:s=0,perfStart:u=o?performance.now():0}=_nullishCoalesce(r, () => ({}));if(!e.compressedData)return[];let i=await ht(e.compressedData,{mergeByMaterial:n,debug:o,material:a,fallback:{materials:e.materials,groups:e.groups,sourceComponentId:e.sourceComponentId}});if(i)return i;let f=performance.now(),l=he(e.compressedData),y=performance.now()-f,b=o?nr(e.compressedData):0;return yt(l,{mergeByMaterial:n,debug:o,material:a,parseTime:s,decodeTime:y,perfStart:u,blobBytes:b,fallback:{materials:e.materials,groups:e.groups,sourceComponentId:e.sourceComponentId}})}async function rr(e,t){let{mergeByMaterial:r=!0,debug:n=!1,material:o}=_nullishCoalesce(t, () => ({})),a=n?performance.now():0,s=await ht(e,{mergeByMaterial:r,debug:n,material:o});if(s)return s;let u=performance.now(),i=he(e),f=performance.now()-u,l=e.byteLength;return yt(i,{mergeByMaterial:r,debug:n,material:o,parseTime:0,decodeTime:f,perfStart:a,blobBytes:l})}function yt(e,t){let{mergeByMaterial:r,debug:n,material:o,parseTime:a,decodeTime:s,perfStart:u,blobBytes:i,fallback:f}=t,l=_nullishCoalesce(_nullishCoalesce(e.metadata.materials, () => (_optionalChain([f, 'optionalAccess', _14 => _14.materials]))), () => ([])),y=_nullishCoalesce(_nullishCoalesce(e.metadata.groups, () => (_optionalChain([f, 'optionalAccess', _15 => _15.groups]))), () => ([])),b=_nullishCoalesce(_optionalChain([f, 'optionalAccess', _16 => _16.sourceComponentId]), () => (e.metadata.sourceComponentId)),w=(e.flags&1)!==0;Ee(y,l.length,e.vertices.length/3,e.indices.length);let v=w?e.vertices:mt(e.vertices,e.origin,e.scale);if(n){let m=e.vertices.byteLength+e.indices.byteLength;_chunkAQJPVUH3cjs.c.call(void 0, ).debug("Mesh Batch Stats:"),_chunkAQJPVUH3cjs.c.call(void 0, ).debug(` Materials: ${l.length} | Groups: ${y.length}`),_chunkAQJPVUH3cjs.c.call(void 0, ).debug(` Vertices: ${e.vertices.length/3} | Indices: ${e.indices.length}`),_chunkAQJPVUH3cjs.c.call(void 0, ).debug(` Format: ${w?"float32":"int16 quantized"}`),_chunkAQJPVUH3cjs.c.call(void 0, ).debug(` Blob: ${(i/1024/1024).toFixed(2)} MB | Geometry on wire: ${(m/1024/1024).toFixed(2)} MB`)}let C=performance.now(),c=l.map(m=>be(m,{vertexColors:e.colors!=null,appearance:o})),d=[];for(let m of y)if(r&&m.meshes.length>1){let h=dt(m,v,e.indices,c,e.uvs,e.colors);h.userData.sourceComponentId=_nullishCoalesce(b, () => (null)),d.push(h)}else{let h=pt(m,v,e.indices,c,e.uvs,e.colors);for(let S of h)S.userData.sourceComponentId=_nullishCoalesce(b, () => (null));d.push(...h)}let p=performance.now()-C;if(n){let m=performance.now()-u;_chunkAQJPVUH3cjs.c.call(void 0, ).debug("Performance:"),a>0&&_chunkAQJPVUH3cjs.c.call(void 0, ).debug(` Parse JSON: ${a.toFixed(2)}ms`),_chunkAQJPVUH3cjs.c.call(void 0, ).debug(` Decode binary: ${s.toFixed(2)}ms`),_chunkAQJPVUH3cjs.c.call(void 0, ).debug(` Create Meshes: ${p.toFixed(2)}ms`),_chunkAQJPVUH3cjs.c.call(void 0, ).debug(` Total: ${m.toFixed(2)}ms`)}return Promise.resolve(d)}async function ht(e,t){if(typeof Worker>"u")return null;let r=ge(e);if(r.indexData.length/3<it)return null;let n=ct();if(!n)return null;let o=_nullishCoalesce(_nullishCoalesce(r.metadata.materials, () => (_optionalChain([t, 'access', _17 => _17.fallback, 'optionalAccess', _18 => _18.materials]))), () => ([])),a=_nullishCoalesce(_nullishCoalesce(r.metadata.groups, () => (_optionalChain([t, 'access', _19 => _19.fallback, 'optionalAccess', _20 => _20.groups]))), () => ([])),s=_nullishCoalesce(_optionalChain([t, 'access', _21 => _21.fallback, 'optionalAccess', _22 => _22.sourceComponentId]), () => (r.metadata.sourceComponentId));Ee(a,o.length,r.vertexCount,r.indexData.length);let u=c=>({vertexStart:c.vertexStart,vertexCount:c.vertexCount,indexStart:c.indexStart,indexCount:c.indexCount}),i=[],f=[];for(let c of a)if(t.mergeByMaterial&&c.meshes.length>1)i.push({kind:"merged",windows:c.meshes.map(u)}),f.push({kind:"merged",group:c});else for(let d of c.meshes)i.push({kind:"single",windows:[u(d)]}),f.push({kind:"single",group:c,meshMeta:d});let l=r.vertexData.slice(),y=r.indexData.slice(),b=[l.buffer,y.buffer];r.uvs&&b.push(r.uvs.buffer),r.colors&&b.push(r.colors.buffer);let w;try{w=await lt(n,{vertexData:l,isFloat32:r.isFloat32,deltaEncoded:r.deltaEncoded,origin:r.origin,scale:r.scale,indexData:y,uvs:r.uvs,colors:r.colors,jobs:i},b)}catch(c){return _chunkAQJPVUH3cjs.c.call(void 0, ).warn("Mesh assembly worker failed; falling back to main-thread parse.",c),null}if(w.length!==i.length)return null;let v=o.map(c=>be(c,{vertexColors:r.colors!=null,appearance:t.material})),C=[];for(let c=0;c<w.length;c++){let d=w[c],p=f[c],m=J(d.key);m||(m=new V.BufferGeometry,m.setAttribute("position",new V.BufferAttribute(d.positions,3)),m.setAttribute("normal",new V.BufferAttribute(d.normals,3)),m.setIndex(new V.BufferAttribute(d.indices,1)),d.uvs&&m.setAttribute("uv",new V.BufferAttribute(d.uvs,2)),d.colors&&m.setAttribute("color",new V.BufferAttribute(d.colors,3,!0)),X(d.key,m));let h=p.kind==="merged"?Me(m,p.group,v):we(m,p.meshMeta,p.group,v);h.userData.sourceComponentId=_nullishCoalesce(s, () => (null)),C.push(h)}return t.debug&&_chunkAQJPVUH3cjs.c.call(void 0, ).debug(`Mesh batch assembled off-thread: ${C.length} meshes, ${r.indexData.length/3} triangles`),C}function nr(e){return Math.floor(e.length*3/4)}var Re={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:254e-10,Mils:254e-7,Inches:.0254,Feet:.3048,Yards:.9144,Miles:1609.344,NauticalMiles:1852},or="Display",ar="DisplayBatch";function sr(e){let t=e.split(".");return t.includes(or)||t.includes(ar)}var gt=new Set;async function ir(e,t){let r=performance.now(),n=[],{allowScaling:o=!0,allowAutoPosition:a=!1,groundAxis:s="z",rhino:u,debug:i=!1,parsing:f={}}=_nullishCoalesce(t, () => ({}));try{let l=o?cr(e.modelunits):1;return await lr(e,n,l,f,u,i),a&&dr(n,s),n}catch(l){throw pr(l,n),l}finally{i&&hr(r)}}function cr(e){let t=Re[e];return t!==void 0?t:(gt.has(e)||(gt.add(e),_chunkAQJPVUH3cjs.c.call(void 0, ).warn(`Unknown Rhino model unit "${e}" \u2014 geometry will not be scaled (factor 1). Known units: ${Object.keys(Re).join(", ")}.`)),1)}async function lr(e,t,r,n,o,a){for(let s of e.values){let u=s.InnerTree;for(let i in u){let f=u[i];f&&await ur(f,t,r,n,o,a)}}}async function ur(e,t,r,n,o,a){for(let s of e){if(!sr(s.type))continue;let u={mergeByMaterial:!0,debug:!1,...n},i=fr(s.data);if(!i){_chunkAQJPVUH3cjs.c.call(void 0, ).error("Error parsing display batch envelope: invalid JSON");continue}let f=await Te(i,u),l=pe(i.items,{rhino:o}),y=[...f,...l];if(r!==1)for(let b of y)b.scale.set(r,r,r);t.push(...y),a&&_chunkAQJPVUH3cjs.c.call(void 0, ).debug(`Extracted ${f.length} meshes and ${l.length} items from batch`)}}function fr(e){return typeof e=="string"?mr(e):e}function mr(e){try{return JSON.parse(e)}catch (e3){return}}function dr(e,t){if(e.length===0)return;let r=_chunkAQJPVUH3cjs.m.call(void 0, e);_chunkAQJPVUH3cjs.l.call(void 0, e,r.min[t],t)}function pr(e,t){_chunkAQJPVUH3cjs.c.call(void 0, ).error("An unexpected error occurred:",e),yr(t)}function yr(e){for(let t of e){let r=t;r.geometry&&r.geometry.dispose(),r.material&&(Array.isArray(r.material)?r.material.forEach(n=>n.dispose()):r.material.dispose())}}function hr(e){let t=performance.now()-e;_chunkAQJPVUH3cjs.c.call(void 0, ).info("Time to process meshes:",`${t.toFixed(2)}ms`)}function gr(){_chunkAQJPVUH3cjs.r.call(void 0, )}exports.SCALE_FACTORS = Re; exports.getThreeMeshesFromComputeResponse = ir; exports.meshPolicy = xt; exports.parseDisplayItems = pe; exports.parseMeshBatchBlob = rr; exports.parseMeshBatchObject = Te; exports.releaseParseCaches = gr; exports.setTextureAnisotropy = ut;
10
+ //# sourceMappingURL=parse.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["c:\\Users\\felix\\coding\\selva\\packages\\visualization\\dist\\parse.cjs"],"names":[],"mappings":"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AAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAiC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,iCAAC,CAAE,CAAC,IAAI,CAAC,CAAC,qEAAqE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iCAAC,CAAE,CAAC,IAAI,CAAC,CAAC,oCAAoC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA","file":"C:\\Users\\felix\\coding\\selva\\packages\\visualization\\dist\\parse.cjs","sourcesContent":[null]}