app
Adom Chipsmith
Public Made by Adomby adom
STEP-native chip validator — 5-source cross-validation, OCCT-generated copyright-free 3D models with embedded signal annotations, datasheet-to-STEP pipeline.
← Commit history
Upload full source (MIT) — open source under adom org
29 files changed
+22845
diff truncated
vendor/adom-step/vendor/3d-viewer-dist/adom-3d-viewer-babylon9.esm.js+1vendor/adom-step/vendor/3d-viewer-dist/chunk-3yOgvDwN.js+37vendor/adom-step/vendor/3d-viewer-dist/chunk-9O52r__4.js+19vendor/adom-step/vendor/3d-viewer-dist/chunk-B-22ATAX.js+274vendor/adom-step/vendor/3d-viewer-dist/chunk-B3szh7UZ.js+16vendor/adom-step/vendor/3d-viewer-dist/chunk-B5_ZMbAO.js+46vendor/adom-step/vendor/3d-viewer-dist/chunk-BAvHv3z9.js+154vendor/adom-step/vendor/3d-viewer-dist/chunk-BDa38Vn2.js+68vendor/adom-step/vendor/3d-viewer-dist/chunk-BF7e5jXO.js+1009vendor/adom-step/vendor/3d-viewer-dist/chunk-BJlKwOsV.js+70vendor/adom-step/vendor/3d-viewer-dist/chunk-BKpenvUR.js+69vendor/adom-step/vendor/3d-viewer-dist/chunk-BQ8Dy87L.js+13vendor/adom-step/vendor/3d-viewer-dist/chunk-B_Vl0aRN.js+18vendor/adom-step/vendor/3d-viewer-dist/chunk-BiVWof0k.js+41vendor/adom-step/vendor/3d-viewer-dist/chunk-Bj6IQT5Z.js+79vendor/adom-step/vendor/3d-viewer-dist/chunk-BloWGZPN.js+80vendor/adom-step/vendor/3d-viewer-dist/chunk-BrLl4i-D.js+3426vendor/adom-step/vendor/3d-viewer-dist/chunk-C5DT99Cs.js+5vendor/adom-step/vendor/3d-viewer-dist/chunk-CLk12wZ9.js+72vendor/adom-step/vendor/3d-viewer-dist/chunk-CU2361BP.js+10vendor/adom-step/vendor/3d-viewer-dist/chunk-CXESUAmj.js+996vendor/adom-step/vendor/3d-viewer-dist/chunk-CbPvriUc.js+74vendor/adom-step/vendor/3d-viewer-dist/chunk-CeVapcuS.js+31vendor/adom-step/vendor/3d-viewer-dist/chunk-CesoqJPD.js+30vendor/adom-step/vendor/3d-viewer-dist/chunk-CktpeoLr.js+2114vendor/adom-step/vendor/3d-viewer-dist/chunk-Cw8L9bT6.js+21vendor/adom-step/vendor/3d-viewer-dist/chunk-Cx4kqim-.js+712vendor/adom-step/vendor/3d-viewer-dist/chunk-CxjklEwO.js+5vendor/adom-step/vendor/3d-viewer-dist/chunk-D41qXL6t.js+13355vendor/adom-step/vendor/3d-viewer-dist/adom-3d-viewer-babylon9.esm.jsadded+1@@ -0,0 +1 @@+import "./chunk-IERganv1.js";
vendor/adom-step/vendor/3d-viewer-dist/chunk-3yOgvDwN.jsadded+37@@ -0,0 +1,37 @@+import { bW as i } from "./chunk-IERganv1.js";+const e = "skyVertexShader", o = `precision highp float;attribute vec3 position;+#ifdef VERTEXCOLOR+attribute vec4 color;+#endif+uniform mat4 world;uniform mat4 view;uniform mat4 viewProjection;+#ifdef POINTSIZE+uniform float pointSize;+#endif+varying vec3 vPositionW;+#ifdef VERTEXCOLOR+varying vec4 vColor;+#endif+#include<logDepthDeclaration>+#include<clipPlaneVertexDeclaration>+#include<fogVertexDeclaration>+#define CUSTOM_VERTEX_DEFINITIONS+void main(void) {+#define CUSTOM_VERTEX_MAIN_BEGIN+gl_Position=viewProjection*world*vec4(position,1.0);vec4 worldPos=world*vec4(position,1.0);vPositionW=vec3(worldPos);+#include<clipPlaneVertex>+#include<logDepthVertex>+#include<fogVertex>+#ifdef VERTEXCOLOR+vColor=color;+#endif+#if defined(POINTSIZE) && !defined(WEBGPU)+gl_PointSize=pointSize;+#endif+#define CUSTOM_VERTEX_MAIN_END+}+`;+i.ShadersStore[e] || (i.ShadersStore[e] = o);+const r = { name: e, shader: o };+export {+ r as skyVertexShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-9O52r__4.jsadded+19@@ -0,0 +1,19 @@+import { bW as i } from "./chunk-IERganv1.js";+const e = "volumetricLightingRenderVolumePixelShader", t = `#include<__decl__sceneFragment>+uniform mat4 invViewProjection;uniform vec3 lightDir; +uniform vec2 outputTextureSize;uniform vec4 extinctionPhaseG;uniform vec3 lightPower;uniform vec2 textureRatio;uniform sampler2D depthTexture;varying vec4 vWorldPos;float henyeyGreenstein(float g,float cosTheta) {float denom=1.0+g*g-2.0*g*cosTheta;return 1.0/(4.0*3.14159265)*(1.0-g*g)/(denom*sqrt(max(denom,0.0)));}+vec3 integrateDirectional(float eyeDist,vec3 viewDir,vec3 lightDir) {float phaseG=extinctionPhaseG.w;+#ifdef USE_EXTINCTION+vec3 extinction=extinctionPhaseG.xyz;return henyeyGreenstein(phaseG,dot(viewDir,lightDir))*(vec3(1.0)-exp(-extinction*eyeDist))/extinction;+#else+return vec3(henyeyGreenstein(phaseG,dot(viewDir,lightDir)))*vec3(eyeDist);+#endif+}+void main(void) {float depth=texelFetch(depthTexture,ivec2(gl_FragCoord.xy*textureRatio),0).r;vec4 worldPos=vWorldPos;if (gl_FragCoord.z>depth) {vec4 ndc=vec4((gl_FragCoord.xy/outputTextureSize)*2.0-1.0,depth*2.0-1.0,1.0);worldPos=invViewProjection*ndc;worldPos=worldPos/worldPos.w;}+vec3 viewDir=worldPos.xyz-vEyePosition.xyz;float eyeDist=length(viewDir);viewDir=viewDir/eyeDist;float fSign=gl_FrontFacing ? 1.0 : -1.0;vec3 integral=integrateDirectional(eyeDist,-viewDir,lightDir);gl_FragColor=vec4(lightPower*integral*fSign,1.0);}+`;+i.ShadersStore[e] || (i.ShadersStore[e] = t);+const r = { name: e, shader: t };+export {+ r as volumetricLightingRenderVolumePixelShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-B-22ATAX.jsadded+274@@ -0,0 +1,274 @@+import { am as Y, bR as h, V as E, bH as p, H as U, Q as R, ay as b, cW as V, c0 as D } from "./chunk-IERganv1.js";+import { B as g } from "./chunk-DsOYaBFP.js";+const O = "Xposition", F = "Yposition", k = "Zposition", x = "Xrotation", v = "Yrotation", M = "Zrotation", j = "HIERARCHY", K = "MOTION";+class X {+ constructor(t) {+ this.loopMode = h.ANIMATIONLOOPMODE_CYCLE, this.list = [], this.root = _(), this.numFrames = 0, this.frameRate = 0, this.skeleton = t;+ }+}+function _() {+ return {+ name: "",+ type: "",+ offset: new E(),+ channels: [],+ children: [],+ frames: [],+ parent: null+ };+}+function Z() {+ return {+ frame: 0,+ position: new E(),+ rotation: new R()+ };+}+function z(n) {+ const t = n.offset.x, o = n.offset.y, i = n.offset.z;+ return p.Translation(t, o, i);+}+function Q(n, t) {+ if (n.frames.length === 0)+ return [];+ const o = [], i = n.channels.some((f) => f === O || f === F || f === k), e = n.channels.some((f) => f === x || f === v || f === M), r = new h(`${n.name}_pos`, "position", t.frameRate, h.ANIMATIONTYPE_VECTOR3, t.loopMode), a = new h(`${n.name}_rot`, "rotationQuaternion", t.frameRate, h.ANIMATIONTYPE_QUATERNION, t.loopMode), s = [], c = [];+ for (let f = 0; f < n.frames.length; f++) {+ const l = n.frames[f];+ i && l.position && s.push({+ frame: l.frame,+ value: l.position.clone()+ }), e && c.push({+ frame: l.frame,+ value: l.rotation.clone()+ });+ }+ return s.length > 0 && (r.setKeys(s), o.push(r)), c.length > 0 && (a.setKeys(c), o.push(a)), o;+}+function P(n, t, o) {+ const i = z(n), e = new b(n.name, o.skeleton, t, i), r = Q(n, o);+ for (const a of r)+ a.getKeys() && a.getKeys().length > 0 && e.animations.push(a);+ for (const a of n.children)+ P(a, e, o);+}+function B(n, t, o, i) {+ if (o.type === "ENDSITE")+ return;+ const e = Z();+ e.frame = t, e.position = new E(), e.rotation = new R(), o.frames.push(e);+ let r = p.Identity();+ for (let a = 0; a < o.channels.length; ++a) {+ const s = o.channels[a], c = n[i.i++];+ if (!c)+ continue;+ const f = parseFloat(c.trim());+ if (s.endsWith("position"))+ switch (s) {+ case O:+ e.position.x = f;+ break;+ case F:+ e.position.y = f;+ break;+ case k:+ e.position.z = f;+ break;+ }+ else if (s.endsWith("rotation")) {+ const l = U.ToRadians(f);+ let m;+ switch (s) {+ case x:+ m = p.RotationX(l);+ break;+ case v:+ m = p.RotationY(l);+ break;+ case M:+ m = p.RotationZ(l);+ break;+ }+ r = m.multiply(r);+ }+ }+ R.FromRotationMatrixToRef(r, e.rotation);+ for (const a of o.children)+ B(n, t, a, i);+}+function L(n, t, o, i) {+ const e = _();+ e.parent = o, i.list.push(e);+ let r = t.trim().split(/\s+/);+ if (r[0].toUpperCase() === "END" && r[1].toUpperCase() === "SITE" ? (e.type = "ENDSITE", e.name = "ENDSITE") : (e.name = r[1], e.type = r[0].toUpperCase()), n.shift()?.trim() != "{")+ throw new Error("Expected opening { after type & name");+ const a = n.shift()?.trim().split(/\s+/);+ if (!a)+ throw new Error("Unexpected end of file: missing OFFSET");+ if (r = a, r[0].toUpperCase() != "OFFSET")+ throw new Error("Expected OFFSET, but got: " + r[0]);+ if (r.length != 4)+ throw new Error("OFFSET: Invalid number of values");+ const s = new E(parseFloat(r[1]), parseFloat(r[2]), parseFloat(r[3]));+ if (isNaN(s.x) || isNaN(s.y) || isNaN(s.z))+ throw new Error("OFFSET: Invalid values");+ if (e.offset = s, e.type != "ENDSITE") {+ if (r = n.shift()?.trim().split(/\s+/), !r)+ throw new Error("Unexpected end of file: missing CHANNELS");+ if (r[0].toUpperCase() != "CHANNELS")+ throw new Error("Expected CHANNELS definition");+ const c = parseInt(r[1]);+ e.channels = r.splice(2, c), e.children = [];+ }+ for (; n.length > 0; ) {+ const c = n.shift()?.trim();+ if (c === "}")+ return e;+ c && e.children.push(L(n, c, e, i));+ }+ throw new Error("Unexpected end of file: missing closing brace");+}+function A(n, t, o, i) {+ const e = n.split(`+`), { loopMode: r } = i;+ t._blockEntityCollection = !!o;+ const a = new Y("", "", t);+ a._parentContainer = o, t._blockEntityCollection = !1;+ const s = new X(a);+ s.loopMode = r;+ const c = e.shift();+ if (!c || c.trim().toUpperCase() !== j)+ throw new Error("HIERARCHY expected");+ const f = e.shift();+ if (!f)+ throw new Error("Unexpected end of file after HIERARCHY");+ const l = L(e, f.trim(), null, s), m = e.shift();+ if (!m || m.trim().toUpperCase() !== K)+ throw new Error("MOTION expected");+ const H = e.shift();+ if (!H)+ throw new Error("Unexpected end of file before frame count");+ const y = H.trim().split(/[\s]+/);+ if (y.length < 2)+ throw new Error("Invalid frame count line");+ const w = parseInt(y[1]);+ if (isNaN(w))+ throw new Error("Failed to read number of frames.");+ s.numFrames = w;+ const C = e.shift();+ if (!C)+ throw new Error("Unexpected end of file before frame time");+ const I = C.trim().split(/[\s]+/);+ if (I.length < 3)+ throw new Error("Invalid frame time line");+ const u = parseFloat(I[2]);+ if (isNaN(u))+ throw new Error("Failed to read frame time.");+ if (u <= 0)+ throw new Error("Failed to read frame time. Invalid value " + u);+ s.frameRate = 1 / u;+ for (let N = 0; N < w; ++N) {+ const T = e.shift();+ if (!T)+ continue;+ const S = T.trim().split(/[\s]+/) || [];+ B(S, N, l, { i: 0 });+ }+ return s.root = l, P(s.root, null, s), s.skeleton.returnToRest(), s.skeleton;+}+class d {+ /**+ * Creates loader for bvh motion files+ * @param loadingOptions - Options for the bvh loader+ */+ constructor(t) {+ this.name = g.name, this.extensions = g.extensions, this._loadingOptions = { ...d._DefaultLoadingOptions, ...t ?? {} };+ }+ static get _DefaultLoadingOptions() {+ return {+ loopMode: h.ANIMATIONLOOPMODE_CYCLE+ };+ }+ /** @internal */+ createPlugin(t) {+ return new d(t[g.name]);+ }+ /**+ * If the data string can be loaded directly.+ * @param data - direct load data+ * @returns if the data can be loaded directly+ */+ canDirectLoad(t) {+ return this.isBvhHeader(t);+ }+ isBvhHeader(t) {+ return t.split(`+`)[0] == "HIERARCHY";+ }+ isNotBvhHeader(t) {+ return !this.isBvhHeader(t);+ }+ /**+ * Imports from the loaded gaussian splatting data and adds them to the scene+ * @param _meshesNames a string or array of strings of the mesh names that should be loaded from the file+ * @param scene the scene the meshes should be added to+ * @param data the bvh data to load+ * @returns a promise containing the loaded skeletons and animations+ */+ // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax+ importMeshAsync(t, o, i) {+ if (typeof i != "string")+ return Promise.reject("BVH loader expects string data.");+ if (this.isNotBvhHeader(i))+ return Promise.reject("BVH loader expects HIERARCHY header.");+ try {+ const e = A(i, o, null, this._loadingOptions);+ return Promise.resolve({+ meshes: [],+ particleSystems: [],+ skeletons: [e],+ animationGroups: [],+ transformNodes: [],+ geometries: [],+ lights: [],+ spriteManagers: []+ });+ } catch (e) {+ return Promise.reject(e);+ }+ }+ /**+ * Imports all objects from the loaded bvh data and adds them to the scene+ * @param scene the scene the objects should be added to+ * @param data the bvh data to load+ * @returns a promise which completes when objects have been loaded to the scene+ */+ // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async+ loadAsync(t, o) {+ return typeof o != "string" ? Promise.reject("BVH loader expects string data.") : this.isNotBvhHeader(o) ? Promise.reject("BVH loader expects HIERARCHY header.") : this.importMeshAsync(null, t, o).then(() => {+ });+ }+ /**+ * Load into an asset container.+ * @param scene The scene to load into+ * @param data The data to import+ * @returns The loaded asset container+ */+ // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax+ loadAssetContainerAsync(t, o) {+ if (typeof o != "string")+ return Promise.reject("BVH loader expects string data.");+ if (this.isNotBvhHeader(o))+ return Promise.reject("BVH loader expects HIERARCHY header.");+ const i = new V(t);+ try {+ const e = A(o, t, i, this._loadingOptions);+ return i.skeletons.push(e), Promise.resolve(i);+ } catch (e) {+ return Promise.reject(e);+ }+ }+}+D(new d());+export {+ d as BVHFileLoader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-B3szh7UZ.jsadded+16@@ -0,0 +1,16 @@+import { bU as e, bV as s } from "./chunk-IERganv1.js";+class m extends e {+ constructor(o) {+ super(o);+ const t = o.glTF, r = t?.animations?.map((a) => a._babylonAnimationGroup) || [];+ this.animationGroups = this.registerDataOutput("animationGroups", s, r);+ const n = t?.nodes?.map((a) => a._babylonTransformNode) || [];+ this.nodes = this.registerDataOutput("nodes", s, n);+ }+ getClassName() {+ return "FlowGraphGLTFDataProvider";+ }+}+export {+ m as FlowGraphGLTFDataProvider+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-B5_ZMbAO.jsadded+46@@ -0,0 +1,46 @@+import { bW as i } from "./chunk-IERganv1.js";+const e = "gridVertexShader", t = `precision highp float;attribute vec3 position;attribute vec3 normal;+#ifdef UV1+attribute vec2 uv;+#endif+#ifdef UV2+attribute vec2 uv2;+#endif+#include<instancesDeclaration>+#include<__decl__sceneVertex>+varying vec3 vPosition;varying vec3 vNormal;+#include<logDepthDeclaration>+#include<fogVertexDeclaration>+#ifdef OPACITY+varying vec2 vOpacityUV;uniform mat4 opacityMatrix;uniform vec2 vOpacityInfos;+#endif+#include<clipPlaneVertexDeclaration>+#define CUSTOM_VERTEX_DEFINITIONS+void main(void) {+#define CUSTOM_VERTEX_MAIN_BEGIN+#include<instancesVertex>+vec4 worldPos=finalWorld*vec4(position,1.0);+#include<fogVertex>+vec4 cameraSpacePosition=view*worldPos;gl_Position=projection*cameraSpacePosition;+#ifdef OPACITY+#ifndef UV1+vec2 uv=vec2(0.,0.);+#endif+#ifndef UV2+vec2 uv2=vec2(0.,0.);+#endif+if (vOpacityInfos.x==0.)+{vOpacityUV=vec2(opacityMatrix*vec4(uv,1.0,0.0));}+else+{vOpacityUV=vec2(opacityMatrix*vec4(uv2,1.0,0.0));}+#endif +#include<clipPlaneVertex>+#include<logDepthVertex>+vPosition=position;vNormal=normal;+#define CUSTOM_VERTEX_MAIN_END+}`;+i.ShadersStore[e] || (i.ShadersStore[e] = t);+const c = { name: e, shader: t };+export {+ c as gridVertexShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-BAvHv3z9.jsadded+154@@ -0,0 +1,154 @@+import { P as A, i as E, k as p, l as m, c9 as O, m as x, n as H, E as D, ca as _, o as h, cb as N, p as C, A as v, cc as F, cd as G, q as y, r as M, ce as R, w as b, t as B, u as g, v as W, _ as l, g as U, h as d, s as w, e as P, R as k } from "./chunk-IERganv1.js";+class z extends W {+ constructor() {+ super(), this.DIFFUSE = !1, this.CLIPPLANE = !1, this.CLIPPLANE2 = !1, this.CLIPPLANE3 = !1, this.CLIPPLANE4 = !1, this.CLIPPLANE5 = !1, this.CLIPPLANE6 = !1, this.ALPHATEST = !1, this.DEPTHPREPASS = !1, this.POINTSIZE = !1, this.FOG = !1, this.LIGHT0 = !1, this.LIGHT1 = !1, this.LIGHT2 = !1, this.LIGHT3 = !1, this.SPOTLIGHT0 = !1, this.SPOTLIGHT1 = !1, this.SPOTLIGHT2 = !1, this.SPOTLIGHT3 = !1, this.HEMILIGHT0 = !1, this.HEMILIGHT1 = !1, this.HEMILIGHT2 = !1, this.HEMILIGHT3 = !1, this.DIRLIGHT0 = !1, this.DIRLIGHT1 = !1, this.DIRLIGHT2 = !1, this.DIRLIGHT3 = !1, this.POINTLIGHT0 = !1, this.POINTLIGHT1 = !1, this.POINTLIGHT2 = !1, this.POINTLIGHT3 = !1, this.SHADOW0 = !1, this.SHADOW1 = !1, this.SHADOW2 = !1, this.SHADOW3 = !1, this.SHADOWS = !1, this.SHADOWESM0 = !1, this.SHADOWESM1 = !1, this.SHADOWESM2 = !1, this.SHADOWESM3 = !1, this.SHADOWPOISSON0 = !1, this.SHADOWPOISSON1 = !1, this.SHADOWPOISSON2 = !1, this.SHADOWPOISSON3 = !1, this.SHADOWPCF0 = !1, this.SHADOWPCF1 = !1, this.SHADOWPCF2 = !1, this.SHADOWPCF3 = !1, this.SHADOWPCSS0 = !1, this.SHADOWPCSS1 = !1, this.SHADOWPCSS2 = !1, this.SHADOWPCSS3 = !1, this.NORMAL = !1, this.UV1 = !1, this.UV2 = !1, this.NUM_BONE_INFLUENCERS = 0, this.BonesPerMesh = 0, this.INSTANCES = !1, this.THIN_INSTANCES = !1, this.LIGHTING = !1, this.IMAGEPROCESSINGPOSTPROCESS = !1, this.SKIPFINALCOLORCLAMP = !1, this.LOGARITHMICDEPTH = !1, this.AREALIGHTSUPPORTED = !0, this.AREALIGHTNOROUGHTNESS = !0, this.rebuild();+ }+}+class f extends A {+ /**+ * Instantiates a Normal Material in the given scene+ * @param name The friendly name of the material+ * @param scene The scene to add the material to+ * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false+ */+ constructor(e, i, r = !1) {+ super(e, i, void 0, r), this.diffuseColor = new E(1, 1, 1), this._disableLighting = !1, this._maxSimultaneousLights = 4, this._shadersLoaded = !1;+ }+ needAlphaBlending() {+ return this.alpha < 1;+ }+ needAlphaBlendingForMesh(e) {+ return this.needAlphaBlending() || e.visibility < 1;+ }+ needAlphaTesting() {+ return !1;+ }+ getAlphaTestTexture() {+ return null;+ }+ // Methods+ isReadyForSubMesh(e, i, r) {+ const t = i._drawWrapper;+ if (this.isFrozen && t.effect && t._wasPreviouslyReady && t._wasPreviouslyUsingInstances === r)+ return !0;+ i.materialDefines || (i.materialDefines = new z());+ const s = i.materialDefines, a = this.getScene();+ if (this._isReadyForSubMesh(i))+ return !0;+ const S = a.getEngine();+ if (s._areTexturesDirty && (s._needUVs = !1, a.texturesEnabled && this._diffuseTexture && p.DiffuseTextureEnabled))+ if (this._diffuseTexture.isReady())+ s._needUVs = !0, s.DIFFUSE = !0;+ else+ return !1;+ if (m(e, a, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, this.needAlphaTestingForMesh(e), s, void 0, void 0, void 0, this._isVertexOutputInvariant), s._needNormals = !0, O(a, e, s, !1, this._maxSimultaneousLights, this._disableLighting), x(a, S, this, s, !!r, null, i.getRenderingMesh().hasThinInstances), s.LIGHTING = !this._disableLighting, H(e, s, !0, !0), s.isDirty) {+ s.markAsProcessed(), a.resetCachedMaterial();+ const n = new D();+ s.FOG && n.addFallback(1, "FOG"), _(s, n), s.NUM_BONE_INFLUENCERS > 0 && n.addCPUSkinningFallback(0, e), s.IMAGEPROCESSINGPOSTPROCESS = a.imageProcessingConfiguration.applyByPostProcess;+ const o = [h.PositionKind];+ s.NORMAL && o.push(h.NormalKind), s.UV1 && o.push(h.UVKind), s.UV2 && o.push(h.UV2Kind), N(o, e, s, n), C(o, s);+ const L = "normal", I = s.toString(), u = [+ "world",+ "view",+ "viewProjection",+ "vEyePosition",+ "vLightsType",+ "vDiffuseColor",+ "vFogInfos",+ "vFogColor",+ "pointSize",+ "vDiffuseInfos",+ "mBones",+ "diffuseMatrix",+ "logarithmicDepthConstant"+ ], c = ["diffuseSampler", "areaLightsLTC1Sampler", "areaLightsLTC2Sampler"], T = [];+ v(u), F({+ uniformsNames: u,+ uniformBuffersNames: T,+ samplers: c,+ defines: s,+ maxSimultaneousLights: 4+ }), i.setEffect(a.getEngine().createEffect(L, {+ attributes: o,+ uniformsNames: u,+ uniformBuffersNames: T,+ samplers: c,+ defines: I,+ fallbacks: n,+ onCompiled: this.onCompiled,+ onError: this.onError,+ indexParameters: { maxSimultaneousLights: 4 },+ shaderLanguage: this._shaderLanguage,+ extraInitializationsAsync: this._shadersLoaded ? void 0 : async () => {+ this.shaderLanguage === 1 ? await Promise.all([import("./chunk-CbPvriUc.js"), import("./chunk-DkGYtK88.js")]) : await Promise.all([import("./chunk-CLk12wZ9.js"), import("./chunk-BJlKwOsV.js")]), this._shadersLoaded = !0;+ }+ }, S), s, this._materialContext);+ }+ if (s.AREALIGHTUSED) {+ for (let n = 0; n < e.lightSources.length; n++)+ if (!e.lightSources[n]._isReady())+ return !1;+ }+ return !i.effect || !i.effect.isReady() ? !1 : (s._renderId = a.getRenderId(), t._wasPreviouslyReady = !0, t._wasPreviouslyUsingInstances = !!r, !0);+ }+ bindForSubMesh(e, i, r) {+ const t = this.getScene(), s = r.materialDefines;+ if (!s)+ return;+ const a = r.effect;+ a && (this._activeEffect = a, this.bindOnlyWorldMatrix(e), this._activeEffect.setMatrix("viewProjection", t.getTransformMatrix()), G(i, this._activeEffect), this._mustRebind(t, a, r) && (this.diffuseTexture && p.DiffuseTextureEnabled && (this._activeEffect.setTexture("diffuseSampler", this.diffuseTexture), this._activeEffect.setFloat2("vDiffuseInfos", this.diffuseTexture.coordinatesIndex, this.diffuseTexture.level), this._activeEffect.setMatrix("diffuseMatrix", this.diffuseTexture.getTextureMatrix())), y(a, this, t), this.pointsCloud && this._activeEffect.setFloat("pointSize", this.pointSize), this._useLogarithmicDepth && M(s, a, t), t.bindEyePosition(a)), this._activeEffect.setColor4("vDiffuseColor", this.diffuseColor, this.alpha * i.visibility), t.lightsEnabled && !this.disableLighting && R(t, i, this._activeEffect, s), t.fogEnabled && i.applyFog && t.fogMode !== b.FOGMODE_NONE && this._activeEffect.setMatrix("view", t.getViewMatrix()), B(t, i, this._activeEffect), this._afterBind(i, this._activeEffect, r));+ }+ getAnimatables() {+ const e = [];+ return this.diffuseTexture && this.diffuseTexture.animations && this.diffuseTexture.animations.length > 0 && e.push(this.diffuseTexture), e;+ }+ getActiveTextures() {+ const e = super.getActiveTextures();+ return this._diffuseTexture && e.push(this._diffuseTexture), e;+ }+ hasTexture(e) {+ return !!(super.hasTexture(e) || this.diffuseTexture === e);+ }+ dispose(e) {+ this.diffuseTexture && this.diffuseTexture.dispose(), super.dispose(e);+ }+ clone(e) {+ return g.Clone(() => new f(e, this.getScene()), this);+ }+ serialize() {+ const e = super.serialize();+ return e.customType = "BABYLON.NormalMaterial", e;+ }+ getClassName() {+ return "NormalMaterial";+ }+ // Statics+ static Parse(e, i, r) {+ return g.Parse(() => new f(e.name, i), e, i, r);+ }+}+l([+ U("diffuseTexture")+], f.prototype, "_diffuseTexture", void 0);+l([+ d("_markAllSubMeshesAsTexturesDirty")+], f.prototype, "diffuseTexture", void 0);+l([+ w()+], f.prototype, "diffuseColor", void 0);+l([+ P("disableLighting")+], f.prototype, "_disableLighting", void 0);+l([+ d("_markAllSubMeshesAsLightsDirty")+], f.prototype, "disableLighting", void 0);+l([+ P("maxSimultaneousLights")+], f.prototype, "_maxSimultaneousLights", void 0);+l([+ d("_markAllSubMeshesAsLightsDirty")+], f.prototype, "maxSimultaneousLights", void 0);+k("BABYLON.NormalMaterial", f);+export {+ f as NormalMaterial+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-BDa38Vn2.jsadded+68@@ -0,0 +1,68 @@+import { bW as o } from "./chunk-IERganv1.js";+const i = "gridPixelShader", t = `#extension GL_OES_standard_derivatives : enable+#define SQRT2 1.41421356+#define PI 3.14159+precision highp float;uniform float visibility;uniform vec3 mainColor;uniform vec3 lineColor;uniform vec4 gridControl;uniform vec3 gridOffset;varying vec3 vPosition;varying vec3 vNormal;+#ifdef LOGARITHMICDEPTH+#extension GL_EXT_frag_depth : enable+#endif+#include<clipPlaneFragmentDeclaration>+#include<logDepthDeclaration>+#include<fogFragmentDeclaration>+#ifdef OPACITY+varying vec2 vOpacityUV;uniform sampler2D opacitySampler;uniform vec2 vOpacityInfos;+#endif+float getDynamicVisibility(float position) {float majorGridFrequency=gridControl.y;if (floor(position+0.5)==floor(position/majorGridFrequency+0.5)*majorGridFrequency)+{return 1.0;}+return gridControl.z;}+float getAnisotropicAttenuation(float differentialLength) {const float maxNumberOfLines=10.0;return clamp(1.0/(differentialLength+1.0)-1.0/maxNumberOfLines,0.0,1.0);}+float isPointOnLine(float position,float differentialLength) {float fractionPartOfPosition=position-floor(position+0.5); +fractionPartOfPosition/=differentialLength; +#ifdef ANTIALIAS+fractionPartOfPosition=clamp(fractionPartOfPosition,-1.,1.);float result=0.5+0.5*cos(fractionPartOfPosition*PI); +return result;+#else+return abs(fractionPartOfPosition)<SQRT2/4. ? 1. : 0.;+#endif+}+float contributionOnAxis(float position) {float differentialLength=length(vec2(dFdx(position),dFdy(position)));differentialLength*=SQRT2; +float result=isPointOnLine(position,differentialLength);float dynamicVisibility=getDynamicVisibility(position);result*=dynamicVisibility;float anisotropicAttenuation=getAnisotropicAttenuation(differentialLength);result*=anisotropicAttenuation;return result;}+float normalImpactOnAxis(float x) {float normalImpact=clamp(1.0-3.0*abs(x*x*x),0.0,1.0);return normalImpact;}+#define CUSTOM_FRAGMENT_DEFINITIONS+void main(void) {+#define CUSTOM_FRAGMENT_MAIN_BEGIN+#include<clipPlaneFragment>+float gridRatio=gridControl.x;vec3 gridPos=(vPosition+gridOffset.xyz)/gridRatio;float x=contributionOnAxis(gridPos.x);float y=contributionOnAxis(gridPos.y);float z=contributionOnAxis(gridPos.z);vec3 normal=normalize(vNormal);x*=normalImpactOnAxis(normal.x);y*=normalImpactOnAxis(normal.y);z*=normalImpactOnAxis(normal.z);+#ifdef MAX_LINE+float grid=clamp(max(max(x,y),z),0.,1.);+#else+float grid=clamp(x+y+z,0.,1.);+#endif+vec3 color=mix(mainColor,lineColor,grid);+#ifdef FOG+#include<fogFragment>+#endif+float opacity=1.0;+#ifdef TRANSPARENT+opacity=clamp(grid,0.08,gridControl.w*grid);+#endif+#ifdef OPACITY+opacity*=texture2D(opacitySampler,vOpacityUV).a;+#endif+gl_FragColor=vec4(color.rgb,opacity*visibility);+#ifdef TRANSPARENT+#ifdef PREMULTIPLYALPHA+gl_FragColor.rgb*=opacity;+#endif+#else+#endif+#include<logDepthFragment>+#include<imageProcessingCompatibility>+#define CUSTOM_FRAGMENT_MAIN_END+}+`;+o.ShadersStore[i] || (o.ShadersStore[i] = t);+const e = { name: i, shader: t };+export {+ e as gridPixelShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-BF7e5jXO.jsadded+1009@@ -0,0 +1,1009 @@+import { d as r, i as a, V as l } from "./chunk-IERganv1.js";+class h {+ /**+ * Creates a new instance of the PBRMaterialLoadingAdapter.+ * @param material - The PBR material to adapt.+ */+ constructor(e) {+ this._material = e, this._material.enableSpecularAntiAliasing = !0;+ }+ /**+ * Gets the underlying material+ */+ get material() {+ return this._material;+ }+ /**+ * Whether the material should be treated as unlit+ */+ get isUnlit() {+ return this._material.unlit;+ }+ /**+ * Sets whether the material should be treated as unlit+ */+ set isUnlit(e) {+ this._material.unlit = e;+ }+ // ========================================+ // CULLING PROPERTIES+ // ========================================+ /**+ * Sets whether back face culling is enabled.+ * @param value True to enable back face culling+ */+ set backFaceCulling(e) {+ this._material.backFaceCulling = e;+ }+ /**+ * Gets whether back face culling is enabled.+ * @returns True if back face culling is enabled+ */+ get backFaceCulling() {+ return this._material.backFaceCulling;+ }+ /**+ * Sets whether two-sided lighting is enabled.+ * @param value True to enable two-sided lighting+ */+ set twoSidedLighting(e) {+ this._material.twoSidedLighting = e;+ }+ /**+ * Gets whether two-sided lighting is enabled.+ * @returns True if two-sided lighting is enabled+ */+ get twoSidedLighting() {+ return this._material.twoSidedLighting;+ }+ // ========================================+ // ALPHA PROPERTIES+ // ========================================+ /**+ * Sets the alpha cutoff value for alpha testing.+ * @param value The alpha cutoff threshold (0-1)+ */+ set alphaCutOff(e) {+ this._material.alphaCutOff = e;+ }+ /**+ * Gets the alpha cutoff value.+ * @returns The alpha cutoff threshold (0-1)+ */+ get alphaCutOff() {+ return this._material.alphaCutOff;+ }+ /**+ * Sets whether to use alpha from the albedo texture.+ * @param value True to use alpha from albedo texture+ */+ set useAlphaFromBaseColorTexture(e) {+ this._material.useAlphaFromAlbedoTexture = e;+ }+ /**+ * Gets whether alpha is used from the albedo texture.+ * @returns True if using alpha from albedo texture+ */+ get useAlphaFromBaseColorTexture() {+ return this._material.useAlphaFromAlbedoTexture;+ }+ /**+ * Gets whether the transparency is treated as alpha coverage.+ */+ get transparencyAsAlphaCoverage() {+ return this._material.useRadianceOverAlpha || this._material.useSpecularOverAlpha;+ }+ /**+ * Sets/Gets whether the transparency is treated as alpha coverage+ */+ set transparencyAsAlphaCoverage(e) {+ this._material.useRadianceOverAlpha = !e, this._material.useSpecularOverAlpha = !e;+ }+ // ========================================+ // BASE PARAMETERS+ // ========================================+ /**+ * Sets the base color of the material (mapped to PBR albedoColor).+ * @param value The base color as a Color3+ */+ set baseColor(e) {+ this._material.albedoColor = e;+ }+ /**+ * Gets the base color of the material.+ * @returns The base color as a Color3+ */+ get baseColor() {+ return this._material.albedoColor;+ }+ /**+ * Sets the base color texture of the material (mapped to PBR albedoTexture).+ * @param value The base color texture or null+ */+ set baseColorTexture(e) {+ this._material.albedoTexture = e;+ }+ /**+ * Gets the base color texture of the material.+ * @returns The base color texture or null+ */+ get baseColorTexture() {+ return this._material.albedoTexture;+ }+ /**+ * Sets the base diffuse roughness of the material.+ * @param value The diffuse roughness value (0-1)+ */+ set baseDiffuseRoughness(e) {+ this._material.baseDiffuseRoughness = e, e > 0 && (this._material.brdf.baseDiffuseModel = r.MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR);+ }+ /**+ * Gets the base diffuse roughness of the material.+ * @returns The diffuse roughness value (0-1), defaults to 0 if not set+ */+ get baseDiffuseRoughness() {+ return this._material.baseDiffuseRoughness ?? 0;+ }+ /**+ * Sets the base diffuse roughness texture of the material.+ * @param value The diffuse roughness texture or null+ */+ set baseDiffuseRoughnessTexture(e) {+ this._material.baseDiffuseRoughnessTexture = e;+ }+ /**+ * Gets the base diffuse roughness texture of the material.+ * @returns The diffuse roughness texture or null+ */+ get baseDiffuseRoughnessTexture() {+ return this._material.baseDiffuseRoughnessTexture;+ }+ /**+ * Sets the base metalness value of the material (mapped to PBR metallic).+ * @param value The metalness value (0-1)+ */+ set baseMetalness(e) {+ this._material.metallic = e;+ }+ /**+ * Gets the base metalness value of the material.+ * @returns The metalness value (0-1), defaults to 1 if not set+ */+ get baseMetalness() {+ return this._material.metallic ?? 1;+ }+ /**+ * Sets the base metalness texture of the material (mapped to PBR metallicTexture).+ * @param value The metalness texture or null+ */+ set baseMetalnessTexture(e) {+ this._material.metallicTexture = e;+ }+ /**+ * Gets the base metalness texture of the material.+ * @returns The metalness texture or null+ */+ get baseMetalnessTexture() {+ return this._material.metallicTexture;+ }+ /**+ * Sets whether to use roughness from the metallic texture's green channel.+ * Also disables using roughness from the alpha channel when enabled.+ * @param value True to use green channel for roughness+ */+ set useRoughnessFromMetallicTextureGreen(e) {+ this._material.useRoughnessFromMetallicTextureGreen = e, this._material.useRoughnessFromMetallicTextureAlpha = !e;+ }+ /**+ * Sets whether to use metalness from the metallic texture's blue channel.+ * @param value True to use blue channel for metalness+ */+ set useMetallicFromMetallicTextureBlue(e) {+ this._material.useMetallnessFromMetallicTextureBlue = e;+ }+ // ========================================+ // SPECULAR PARAMETERS+ // ========================================+ /**+ * Configures specular properties and optionally enables OpenPBR BRDF model for edge color support.+ * @param enableEdgeColor Whether to enable OpenPBR BRDF models for edge color support+ */+ enableSpecularEdgeColor(e = !1) {+ e && (this._material.brdf.dielectricSpecularModel = r.MATERIAL_DIELECTRIC_SPECULAR_MODEL_OPENPBR, this._material.brdf.conductorSpecularModel = r.MATERIAL_CONDUCTOR_SPECULAR_MODEL_OPENPBR);+ }+ /**+ * Sets the specular weight (mapped to PBR metallicF0Factor).+ * @param value The specular weight value+ */+ set specularWeight(e) {+ this._material.metallicF0Factor = e;+ }+ /**+ * Gets the specular weight.+ * @returns The specular weight value, defaults to 1 if not set+ */+ get specularWeight() {+ return this._material.metallicF0Factor ?? 1;+ }+ /**+ * Sets the specular weight texture (mapped to PBR metallicReflectanceTexture).+ * Configures the material to use only metalness from this texture when set.+ * @param value The specular weight texture or null+ */+ set specularWeightTexture(e) {+ e ? (this._material.metallicReflectanceTexture = e, this._material.useOnlyMetallicFromMetallicReflectanceTexture = !0) : (this._material.metallicReflectanceTexture = null, this._material.useOnlyMetallicFromMetallicReflectanceTexture = !1);+ }+ /**+ * Gets the specular weight texture.+ * @returns The specular weight texture or null+ */+ get specularWeightTexture() {+ return this._material.metallicReflectanceTexture;+ }+ /**+ * Sets the specular color (mapped to PBR metallicReflectanceColor).+ * @param value The specular color as a Color3+ */+ set specularColor(e) {+ this._material.metallicReflectanceColor = e;+ }+ /**+ * Gets the specular color.+ * @returns The specular color as a Color3+ */+ get specularColor() {+ return this._material.metallicReflectanceColor;+ }+ /**+ * Sets the specular color texture (mapped to PBR reflectanceTexture).+ * @param value The specular color texture or null+ */+ set specularColorTexture(e) {+ this._material.reflectanceTexture = e;+ }+ /**+ * Gets the specular color texture.+ * @returns The specular color texture or null+ */+ get specularColorTexture() {+ return this._material.reflectanceTexture;+ }+ /**+ * Sets the specular roughness (mapped to PBR roughness).+ * @param value The roughness value (0-1)+ */+ set specularRoughness(e) {+ this._material.roughness = e;+ }+ /**+ * Gets the specular roughness.+ * @returns The roughness value (0-1), defaults to 1 if not set+ */+ get specularRoughness() {+ return this._material.roughness ?? 1;+ }+ /**+ * Sets the specular roughness texture.+ * Note: PBR uses the same texture for both metallic and roughness,+ * so this only sets the texture if no base metalness texture exists.+ * @param value The roughness texture or null+ */+ set specularRoughnessTexture(e) {+ this.baseMetalnessTexture || (this._material.metallicTexture = e);+ }+ /**+ * Gets the specular roughness texture.+ * @returns The roughness texture (same as metallic texture for PBR) or null+ */+ get specularRoughnessTexture() {+ return this._material.metallicTexture;+ }+ /**+ * Sets the specular index of refraction (mapped to PBR indexOfRefraction).+ * @param value The IOR value+ */+ set specularIor(e) {+ this._material.indexOfRefraction = e;+ }+ /**+ * Gets the specular index of refraction.+ * @returns The IOR value+ */+ get specularIor() {+ return this._material.indexOfRefraction;+ }+ // ========================================+ // EMISSION PARAMETERS+ // ========================================+ /**+ * Sets the emission color (mapped to PBR emissiveColor).+ * @param value The emission color as a Color3+ */+ set emissionColor(e) {+ this._material.emissiveColor = e;+ }+ /**+ * Gets the emission color.+ * @returns The emission color as a Color3+ */+ get emissionColor() {+ return this._material.emissiveColor;+ }+ /**+ * Sets the emission luminance/intensity (mapped to PBR emissiveIntensity).+ * @param value The emission intensity value+ */+ set emissionLuminance(e) {+ this._material.emissiveIntensity = e;+ }+ /**+ * Gets the emission luminance/intensity.+ * @returns The emission intensity value+ */+ get emissionLuminance() {+ return this._material.emissiveIntensity;+ }+ /**+ * Sets the emission color texture (mapped to PBR emissiveTexture).+ * @param value The emission texture or null+ */+ set emissionColorTexture(e) {+ this._material.emissiveTexture = e;+ }+ /**+ * Gets the emission color texture.+ * @returns The emission texture or null+ */+ get emissionColorTexture() {+ return this._material.emissiveTexture;+ }+ // ========================================+ // AMBIENT OCCLUSION+ // ========================================+ /**+ * Sets the ambient occlusion texture (mapped to PBR ambientTexture).+ * Automatically enables grayscale mode when set.+ * @param value The ambient occlusion texture or null+ */+ set ambientOcclusionTexture(e) {+ this._material.ambientTexture = e, e && (this._material.useAmbientInGrayScale = !0);+ }+ /**+ * Gets the ambient occlusion texture.+ * @returns The ambient occlusion texture or null+ */+ get ambientOcclusionTexture() {+ return this._material.ambientTexture;+ }+ /**+ * Sets the ambient occlusion texture strength.+ * @param value The strength value (typically 0-1)+ */+ set ambientOcclusionTextureStrength(e) {+ this._material.ambientTextureStrength = e;+ }+ /**+ * Gets the ambient occlusion texture strength.+ * @returns The strength value, defaults to 1.0 if not set+ */+ get ambientOcclusionTextureStrength() {+ return this._material.ambientTextureStrength ?? 1;+ }+ // ========================================+ // COAT PARAMETERS+ // ========================================+ /**+ * Configures clear coat for PBR material.+ * Enables clear coat and sets up proper configuration.+ */+ configureCoat() {+ this._material.clearCoat.isEnabled = !0, this._material.clearCoat.useRoughnessFromMainTexture = !1, this._material.clearCoat.remapF0OnInterfaceChange = !1;+ }+ /**+ * Sets the coat weight (mapped to PBR clearCoat.intensity).+ * Automatically enables clear coat.+ * @param value The coat weight value (0-1)+ */+ set coatWeight(e) {+ this._material.clearCoat.isEnabled = !0, this._material.clearCoat.intensity = e;+ }+ /**+ * Gets the coat weight.+ * @returns The coat weight value+ */+ get coatWeight() {+ return this._material.clearCoat.intensity;+ }+ /**+ * Sets the coat weight texture (mapped to PBR clearCoat.texture).+ * Automatically enables clear coat.+ * @param value The coat weight texture or null+ */+ set coatWeightTexture(e) {+ this._material.clearCoat.isEnabled = !0, this._material.clearCoat.texture = e;+ }+ /**+ * Gets the coat weight texture.+ * @returns The coat weight texture or null+ */+ get coatWeightTexture() {+ return this._material.clearCoat.texture;+ }+ /**+ * Sets the coat color (mapped to PBR clearCoat.tintColor).+ * @param value The coat tint color as a Color3+ */+ set coatColor(e) {+ this._material.clearCoat.isTintEnabled = e != a.White(), this._material.clearCoat.tintColor = e;+ }+ /**+ * Sets the coat color texture (mapped to PBR clearCoat.tintTexture).+ * @param value The coat color texture or null+ */+ set coatColorTexture(e) {+ this._material.clearCoat.tintTexture = e;+ }+ /**+ * Sets the coat roughness (mapped to PBR clearCoat.roughness).+ * Automatically enables clear coat.+ * @param value The coat roughness value (0-1)+ */+ set coatRoughness(e) {+ this._material.clearCoat.isEnabled = !0, this._material.clearCoat.roughness = e;+ }+ /**+ * Gets the coat roughness.+ * @returns The coat roughness value, defaults to 0 if not set+ */+ get coatRoughness() {+ return this._material.clearCoat.roughness ?? 0;+ }+ /**+ * Sets the coat roughness texture (mapped to PBR clearCoat.textureRoughness).+ * Automatically enables clear coat and disables using roughness from main texture.+ * @param value The coat roughness texture or null+ */+ set coatRoughnessTexture(e) {+ this._material.clearCoat.isEnabled = !0, this._material.clearCoat.useRoughnessFromMainTexture = !1, this._material.clearCoat.textureRoughness = e;+ }+ /**+ * Gets the coat roughness texture.+ * @returns The coat roughness texture or null+ */+ get coatRoughnessTexture() {+ return this._material.clearCoat.textureRoughness;+ }+ /**+ * Sets the coat index of refraction (IOR).+ */+ set coatIor(e) {+ this._material.clearCoat.indexOfRefraction = e;+ }+ /**+ * Sets the coat darkening value.+ * Note: PBR doesn't have a direct coat darkening property, so this is a no-op.+ * @param value The coat darkening value (ignored for PBR)+ */+ set coatDarkening(e) {+ }+ /**+ * Sets the coat darkening texture+ * @param value The coat darkening texture or null+ */+ set coatDarkeningTexture(e) {+ }+ /**+ * Sets the coat roughness anisotropy.+ * Note: PBR clearCoat doesn't support anisotropy yet, so this is a placeholder.+ * @param value The coat anisotropy intensity value (currently ignored)+ */+ set coatRoughnessAnisotropy(e) {+ }+ /**+ * Gets the coat roughness anisotropy.+ * Note: PBR clearCoat doesn't support anisotropy yet, so this returns 0.+ * @returns Currently returns 0 as clearCoat anisotropy is not yet available+ */+ get coatRoughnessAnisotropy() {+ return 0;+ }+ /**+ * Sets the coat tangent angle for anisotropy.+ * Note: PBR clearCoat doesn't support anisotropy yet, so this is a placeholder.+ * @param value The coat anisotropy rotation angle in radians (currently ignored)+ */+ set geometryCoatTangentAngle(e) {+ }+ /**+ * Sets the coat tangent texture for anisotropy.+ * Note: PBR clearCoat doesn't support anisotropy textures yet, so this is a placeholder.+ * @param value The coat anisotropy texture (currently ignored)+ */+ set geometryCoatTangentTexture(e) {+ }+ /**+ * Gets the coat tangent texture for anisotropy.+ * Note: PBR clearCoat doesn't support anisotropy textures yet, so this returns null.+ * @returns Currently returns null as clearCoat anisotropy is not yet available+ */+ get geometryCoatTangentTexture() {+ return null;+ }+ // ========================================+ // TRANSMISSION LAYER+ // ========================================+ /**+ * Sets the transmission weight (mapped to PBR subSurface.refractionIntensity).+ * Enables refraction when value \> 0.+ * @param value The transmission weight value (0-1)+ */+ set transmissionWeight(e) {+ this._material.subSurface.isRefractionEnabled = e > 0, this._material.subSurface.refractionIntensity = e;+ }+ /**+ * Gets the transmission weight.+ * @returns The transmission weight value+ */+ get transmissionWeight() {+ return this._material.subSurface.isRefractionEnabled ? this._material.subSurface.refractionIntensity : 0;+ }+ /**+ * Sets the transmission weight texture (mapped to PBR subSurface.refractionIntensityTexture).+ * Automatically enables refraction and glTF-style textures.+ * @param value The transmission weight texture or null+ */+ set transmissionWeightTexture(e) {+ this._material.subSurface.isRefractionEnabled = !0, this._material.subSurface.refractionIntensityTexture = e, this._material.subSurface.useGltfStyleTextures = !0;+ }+ /**+ * Sets the attenuation distance for volume.+ * @param value The attenuation distance value+ */+ set transmissionDepth(e) {+ this.transmissionWeight > 0 ? this._material.subSurface.tintColorAtDistance = e : this.subsurfaceWeight > 0 && this._material.subSurface.diffusionDistance.multiplyInPlace(new a(e, e, e));+ }+ /**+ * Gets the attenuation distance for volume.+ * @returns The attenuation distance value+ */+ get transmissionDepth() {+ return this.transmissionWeight > 0 ? this._material.subSurface.tintColorAtDistance : 0;+ }+ /**+ * Sets the attenuation color (mapped to PBR subSurface.tintColor).+ * @param value The attenuation color as a Color3+ */+ set transmissionColor(e) {+ this.transmissionWeight > 0 ? this._material.subSurface.tintColor = e : this.subsurfaceWeight > 0 && this._material.subSurface.diffusionDistance.multiplyInPlace(e);+ }+ /**+ * Sets the attenuation color (mapped to PBR subSurface.tintColor).+ * @returns The attenuation color as a Color3+ */+ get transmissionColor() {+ return this.transmissionWeight > 0 ? this._material.subSurface.tintColor : this.subsurfaceWeight > 0 ? this._material.subSurface.diffusionDistance : new a(0, 0, 0);+ }+ /**+ * Sets the transmission scatter coefficient.+ * @param value The scatter coefficient as a Color3+ */+ set transmissionScatter(e) {+ this._material.subSurface.diffusionDistance = e;+ }+ /**+ * Sets the transmission scatter coefficient.+ * @returns The scatter coefficient as a Color3+ */+ get transmissionScatter() {+ return this._material.subSurface.diffusionDistance;+ }+ set transmissionScatterTexture(e) {+ }+ /**+ * Sets the transmission scattering anisotropy.+ * @param value The anisotropy intensity value (-1 to 1)+ */+ set transmissionScatterAnisotropy(e) {+ }+ /**+ * Sets the transmission dispersion Abbe number.+ * @param value The Abbe number value+ */+ set transmissionDispersionAbbeNumber(e) {+ }+ /**+ * Sets the transmission dispersion scale.+ * @param value The dispersion scale value+ */+ set transmissionDispersionScale(e) {+ e > 0 ? (this._material.subSurface.isDispersionEnabled = !0, this._material.subSurface.dispersion = 20 / e) : (this._material.subSurface.isDispersionEnabled = !1, this._material.subSurface.dispersion = 0);+ }+ /**+ * Gets the refraction background texture+ * @returns The refraction background texture or null+ */+ get refractionBackgroundTexture() {+ return this._material.subSurface.refractionTexture;+ }+ /**+ * Sets the refraction background texture+ * @param value The refraction background texture or null+ */+ set refractionBackgroundTexture(e) {+ this._material.subSurface.refractionTexture = e;+ }+ /**+ * Configures transmission for thin-surface transmission (KHR_materials_transmission).+ * Sets up the material for proper thin-surface transmission behavior.+ */+ configureTransmission() {+ this._material.subSurface.volumeIndexOfRefraction = 1, this._material.subSurface.useAlbedoToTintRefraction = !0, this._material.subSurface.minimumThickness = 0, this._material.subSurface.maximumThickness = 0;+ }+ // ========================================+ // VOLUME PROPERTIES+ // ========================================+ configureVolume() {+ }+ /**+ * Sets whether the material is thin-walled (i.e. non-volumetric) or not.+ */+ set geometryThinWalled(e) {+ }+ /**+ * Gets whether the material is thin-walled (i.e. non-volumetric) or not.+ */+ get geometryThinWalled() {+ return !0;+ }+ /**+ * Sets the thickness texture (mapped to PBR subSurface.thicknessTexture).+ * Automatically enables refraction.+ * @param value The thickness texture or null+ */+ set volumeThicknessTexture(e) {+ this._material.subSurface.thicknessTexture = e, this._material.subSurface.useGltfStyleTextures = !0;+ }+ /**+ * Sets the thickness factor (mapped to PBR subSurface.maximumThickness).+ * Automatically enables refraction.+ * @param value The thickness value+ */+ set volumeThickness(e) {+ this._material.subSurface.minimumThickness = 0, this._material.subSurface.maximumThickness = e, this._material.subSurface.useThicknessAsDepth = !0, e > 0 && (this._material.subSurface.volumeIndexOfRefraction = this._material.indexOfRefraction);+ }+ // ========================================+ // SUBSURFACE PROPERTIES (Subsurface Scattering)+ // ========================================+ /**+ * Configures subsurface properties for PBR material+ */+ configureSubsurface() {+ this._material.subSurface.useGltfStyleTextures = !0, this._material.subSurface.volumeIndexOfRefraction = 1, this._material.subSurface.minimumThickness = 0, this._material.subSurface.maximumThickness = 0, this._material.subSurface.useAlbedoToTintTranslucency = !1;+ }+ /**+ * Sets the subsurface weight+ */+ set subsurfaceWeight(e) {+ this._material.subSurface.isTranslucencyEnabled = e > 0, this._material.subSurface.translucencyIntensity = e;+ }+ /**+ * Gets the subsurface weight+ * @returns The subsurface weight value+ */+ get subsurfaceWeight() {+ return this._material.subSurface.isTranslucencyEnabled ? this._material.subSurface.translucencyIntensity : 0;+ }+ /**+ * Sets the subsurface weight texture+ */+ set subsurfaceWeightTexture(e) {+ this._material.subSurface.translucencyIntensityTexture = e;+ }+ /**+ * Sets the subsurface color.+ * @param value The subsurface tint color as a Color3+ */+ set subsurfaceColor(e) {+ const s = new l(-Math.log(this.transmissionColor.r), -Math.log(this.transmissionColor.g), -Math.log(this.transmissionColor.b));+ s.scaleInPlace(1 / Math.max(this.transmissionDepth, 1e-3));+ const t = s, u = Math.max(t.x, Math.max(t.y, t.z)), i = u > 0 ? 1 / u : 1;+ this._material.subSurface.diffusionDistance = new a(Math.exp(-t.x * i), Math.exp(-t.y * i), Math.exp(-t.z * i));+ }+ /**+ * Sets the subsurface color texture.+ * @param value The subsurface tint texture or null+ */+ set subsurfaceColorTexture(e) {+ }+ /**+ * Sets the surface tint of the material (when using subsurface scattering)+ */+ set diffuseTransmissionTint(e) {+ this._material.subSurface.tintColor = e;+ }+ /**+ * Gets the subsurface constant tint (when using subsurface scattering)+ * @returns The subsurface constant tint as a Color3+ */+ get diffuseTransmissionTint() {+ return this._material.subSurface.tintColor;+ }+ /**+ * Sets the subsurface constant tint texture (when using subsurface scattering)+ * @param value The subsurface constant tint texture or null+ */+ set diffuseTransmissionTintTexture(e) {+ this._material.subSurface.translucencyColorTexture = e;+ }+ /**+ * Gets the subsurface radius (used for subsurface scattering)+ * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.+ * @returns The subsurface radius as a Color3+ */+ get subsurfaceRadius() {+ return 1;+ }+ /**+ * Sets the subsurface radius (used for subsurface scattering)+ * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.+ * @param value The subsurface radius as a number+ */+ set subsurfaceRadius(e) {+ }+ /**+ * Gets the subsurface radius scale (used for subsurface scattering)+ * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.+ * @returns The subsurface radius scale as a Color3+ */+ get subsurfaceRadiusScale() {+ return this._material.subSurface.scatteringDiffusionProfile ?? a.White();+ }+ /**+ * Sets the subsurface radius scale (used for subsurface scattering)+ * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.+ * @param value The subsurface radius scale as a Color3+ */+ set subsurfaceRadiusScale(e) {+ this._material.subSurface.scatteringDiffusionProfile = e;+ }+ /**+ * Sets the subsurface scattering anisotropy.+ * Note: PBRMaterial does not have a direct equivalent, so this is a no-op.+ * @param value The anisotropy intensity value (ignored for PBR)+ */+ set subsurfaceScatterAnisotropy(e) {+ }+ /**+ * Does this material have a translucent surface (i.e. either transmission or subsurface)?+ * @returns True if the material is translucent, false otherwise+ */+ isTranslucent() {+ return this.transmissionWeight > 0 || this.subsurfaceWeight > 0;+ }+ // ========================================+ // FUZZ LAYER (Sheen)+ // ========================================+ /**+ * Configures sheen for PBR material.+ * Enables sheen and sets up proper configuration.+ */+ configureFuzz() {+ this._material.sheen.isEnabled = !0, this._material.sheen.useRoughnessFromMainTexture = !1, this._material.sheen.albedoScaling = !0;+ }+ /**+ * Sets the sheen weight (mapped to PBR sheen.intensity).+ * Automatically enables sheen.+ * @param value The sheen weight value+ */+ set fuzzWeight(e) {+ this._material.sheen.isEnabled = !0, this._material.sheen.intensity = e;+ }+ /**+ * Sets the fuzz weight texture.+ * @param value The fuzz weight texture or null+ */+ set fuzzWeightTexture(e) {+ this._material.sheen.texture || (this._material.sheen.texture = e);+ }+ /**+ * Sets the sheen color (mapped to PBR sheen.color).+ * Automatically enables sheen.+ * @param value The sheen color as a Color3+ */+ set fuzzColor(e) {+ this._material.sheen.isEnabled = !0, this._material.sheen.color = e;+ }+ /**+ * Sets the sheen color texture (mapped to PBR sheen.texture).+ * Automatically enables sheen.+ * @param value The sheen color texture or null+ */+ set fuzzColorTexture(e) {+ this._material.sheen.texture = e;+ }+ /**+ * Sets the sheen roughness (mapped to PBR sheen.roughness).+ * Automatically enables sheen.+ * @param value The sheen roughness value (0-1)+ */+ set fuzzRoughness(e) {+ this._material.sheen.isEnabled = !0, this._material.sheen.roughness = e;+ }+ /**+ * Sets the sheen roughness texture (mapped to PBR sheen.textureRoughness).+ * Automatically enables sheen.+ * @param value The sheen roughness texture or null+ */+ set fuzzRoughnessTexture(e) {+ this._material.sheen.isEnabled = !0, this._material.sheen.textureRoughness = e;+ }+ // ========================================+ // ANISOTROPY+ // ========================================+ /**+ * Sets the specular roughness anisotropy (mapped to PBR anisotropy.intensity).+ * Automatically enables anisotropy.+ * @param value The anisotropy intensity value+ */+ set specularRoughnessAnisotropy(e) {+ this._material.anisotropy.isEnabled = !0, this._material.anisotropy.intensity = e;+ }+ /**+ * Gets the specular roughness anisotropy.+ * @returns The anisotropy intensity value+ */+ get specularRoughnessAnisotropy() {+ return this._material.anisotropy.intensity;+ }+ /**+ * Sets the anisotropy rotation (mapped to PBR anisotropy.angle).+ * Automatically enables anisotropy.+ * @param value The anisotropy rotation angle in radians+ */+ set geometryTangentAngle(e) {+ this._material.anisotropy.isEnabled = !0, this._material.anisotropy.angle = e;+ }+ /**+ * Sets the geometry tangent texture (mapped to PBR anisotropy.texture).+ * Automatically enables anisotropy.+ * @param value The anisotropy texture or null+ */+ set geometryTangentTexture(e) {+ this._material.anisotropy.isEnabled = !0, this._material.anisotropy.texture = e;+ }+ /**+ * Gets the geometry tangent texture.+ * @returns The anisotropy texture or null+ */+ get geometryTangentTexture() {+ return this._material.anisotropy.texture;+ }+ /**+ * Configures glTF-style anisotropy for the material.+ * Note: PBR materials don't need this configuration, so this is a no-op.+ * @param useGltfStyle Whether to use glTF-style anisotropy (ignored for PBR)+ */+ configureGltfStyleAnisotropy(e = !0) {+ }+ // ========================================+ // THIN FILM IRIDESCENCE+ // ========================================+ /**+ * Sets the iridescence weight (mapped to PBR iridescence.intensity).+ * Automatically enables iridescence.+ * @param value The iridescence intensity value+ */+ set thinFilmWeight(e) {+ this._material.iridescence.isEnabled = e > 0, this._material.iridescence.intensity = e;+ }+ /**+ * Sets the iridescence IOR (mapped to PBR iridescence.indexOfRefraction).+ * @param value The iridescence IOR value+ */+ set thinFilmIor(e) {+ this._material.iridescence.indexOfRefraction = e;+ }+ /**+ * Sets the iridescence thickness minimum (mapped to PBR iridescence.minimumThickness).+ * @param value The minimum thickness value in nanometers+ */+ set thinFilmThicknessMinimum(e) {+ this._material.iridescence.minimumThickness = e;+ }+ /**+ * Sets the iridescence thickness maximum (mapped to PBR iridescence.maximumThickness).+ * @param value The maximum thickness value in nanometers+ */+ set thinFilmThicknessMaximum(e) {+ this._material.iridescence.maximumThickness = e;+ }+ /**+ * Sets the thin film weight texture (mapped to PBR iridescence.texture).+ * @param value The thin film weight texture or null+ */+ set thinFilmWeightTexture(e) {+ this._material.iridescence.texture = e;+ }+ /**+ * Sets the iridescence thickness texture (mapped to PBR iridescence.thicknessTexture).+ * @param value The iridescence thickness texture or null+ */+ set thinFilmThicknessTexture(e) {+ this._material.iridescence.thicknessTexture = e;+ }+ // ========================================+ // UNLIT MATERIALS+ // ========================================+ /**+ * Sets whether the material is unlit.+ * @param value True to make the material unlit+ */+ set unlit(e) {+ this._material.unlit = e;+ }+ // ========================================+ // GEOMETRY PARAMETERS+ // ========================================+ /**+ * Sets the geometry opacity (mapped to PBR alpha).+ * @param value The opacity value (0-1)+ */+ set geometryOpacity(e) {+ this._material.alpha = e;+ }+ /**+ * Gets the geometry opacity.+ * @returns The opacity value (0-1)+ */+ get geometryOpacity() {+ return this._material.alpha;+ }+ /**+ * Sets the geometry normal texture (mapped to PBR bumpTexture).+ * Also forces irradiance computation in fragment shader for better lighting.+ * @param value The normal texture or null+ */+ set geometryNormalTexture(e) {+ this._material.bumpTexture = e, this._material.forceIrradianceInFragment = !0;+ }+ /**+ * Gets the geometry normal texture.+ * @returns The normal texture or null+ */+ get geometryNormalTexture() {+ return this._material.bumpTexture;+ }+ /**+ * Sets the normal map inversions for the material.+ * @param invertX Whether to invert the normal map on the X axis+ * @param invertY Whether to invert the normal map on the Y axis+ */+ setNormalMapInversions(e, s) {+ this._material.invertNormalMapX = e, this._material.invertNormalMapY = s;+ }+ /**+ * Sets the geometry coat normal texture (mapped to PBR clearCoat.bumpTexture).+ * Automatically enables clear coat.+ * @param value The coat normal texture or null+ */+ set geometryCoatNormalTexture(e) {+ this._material.clearCoat.isEnabled = !0, this._material.clearCoat.bumpTexture = e;+ }+ /**+ * Gets the geometry coat normal texture.+ * @returns The coat normal texture or null+ */+ get geometryCoatNormalTexture() {+ return this._material.clearCoat.bumpTexture;+ }+ /**+ * Sets the geometry coat normal texture scale.+ * @param value The scale value for the coat normal texture+ */+ set geometryCoatNormalTextureScale(e) {+ this._material.clearCoat.bumpTexture && (this._material.clearCoat.bumpTexture.level = e);+ }+}+export {+ h as PBRMaterialLoadingAdapter+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-BJlKwOsV.jsadded+70@@ -0,0 +1,70 @@+import { bW as i } from "./chunk-IERganv1.js";+const e = "normalPixelShader", n = `precision highp float;uniform vec4 vEyePosition;uniform vec4 vDiffuseColor;varying vec3 vPositionW;+#ifdef NORMAL+varying vec3 vNormalW;+#endif+#ifdef LIGHTING+#include<helperFunctions>+#include<__decl__lightFragment>[0]+#include<__decl__lightFragment>[1]+#include<__decl__lightFragment>[2]+#include<__decl__lightFragment>[3]+#include<lightsFragmentFunctions>+#include<shadowsFragmentFunctions>+#endif+#ifdef DIFFUSE+varying vec2 vDiffuseUV;uniform sampler2D diffuseSampler;uniform vec2 vDiffuseInfos;+#endif+#include<clipPlaneFragmentDeclaration>+#ifdef LOGARITHMICDEPTH+#extension GL_EXT_frag_depth : enable+#endif+#include<logDepthDeclaration>+#include<fogFragmentDeclaration>+#if defined(CLUSTLIGHT_BATCH) && CLUSTLIGHT_BATCH>0+varying float vViewDepth;+#endif+#define CUSTOM_FRAGMENT_DEFINITIONS+void main(void) {+#define CUSTOM_FRAGMENT_MAIN_BEGIN+#include<clipPlaneFragment>+vec3 viewDirectionW=normalize(vEyePosition.xyz-vPositionW);vec4 baseColor=vec4(1.,1.,1.,1.);vec3 diffuseColor=vDiffuseColor.rgb;float alpha=vDiffuseColor.a;+#ifdef DIFFUSE+baseColor=texture2D(diffuseSampler,vDiffuseUV);+#ifdef ALPHATEST+if (baseColor.a<0.4)+discard;+#endif+#include<depthPrePass>+baseColor.rgb*=vDiffuseInfos.y;+#endif+#ifdef NORMAL+baseColor=mix(baseColor,vec4(vNormalW,1.0),0.5);+#endif+#ifdef NORMAL+vec3 normalW=normalize(vNormalW);+#else+vec3 normalW=vec3(1.0,1.0,1.0);+#endif+#ifdef LIGHTING+vec3 diffuseBase=vec3(0.,0.,0.);lightingInfo info;float shadow=1.;float glossiness=0.;float aggShadow=0.;float numLights=0.;+#include<lightFragment>[0]+#include<lightFragment>[1]+#include<lightFragment>[2]+#include<lightFragment>[3]+vec3 finalDiffuse=clamp(diffuseBase*diffuseColor,0.0,1.0)*baseColor.rgb;+#else+vec3 finalDiffuse= baseColor.rgb;+#endif+vec4 color=vec4(finalDiffuse,alpha);+#include<logDepthFragment>+#include<fogFragment>+gl_FragColor=color;+#include<imageProcessingCompatibility>+#define CUSTOM_FRAGMENT_MAIN_END+}`;+i.ShadersStore[e] || (i.ShadersStore[e] = n);+const l = { name: e, shader: n };+export {+ l as normalPixelShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-BKpenvUR.jsadded+69@@ -0,0 +1,69 @@+import { bW as o } from "./chunk-IERganv1.js";+const e = "skyPixelShader", t = `precision highp float;varying vec3 vPositionW;+#ifdef VERTEXCOLOR+varying vec4 vColor;+#endif+#include<clipPlaneFragmentDeclaration>+uniform vec3 cameraPosition;uniform vec3 cameraOffset;uniform vec3 up;uniform float luminance;uniform float turbidity;uniform float rayleigh;uniform float mieCoefficient;uniform float mieDirectionalG;uniform vec3 sunPosition;+#ifdef LOGARITHMICDEPTH+#extension GL_EXT_frag_depth : enable+#endif+#include<logDepthDeclaration>+#include<fogFragmentDeclaration>+const float e=2.71828182845904523536028747135266249775724709369995957;const float pi=3.141592653589793238462643383279502884197169;const float n=1.0003;const float N=2.545E25;const float pn=0.035;const vec3 lambda=vec3(680E-9,550E-9,450E-9);const vec3 K=vec3(0.686,0.678,0.666);const float v=4.0;const float rayleighZenithLength=8.4E3;const float mieZenithLength=1.25E3;const float EE=1000.0;const float sunAngularDiameterCos=0.999956676946448443553574619906976478926848692873900859324;const float cutoffAngle=pi/1.95;const float steepness=1.5;vec3 totalRayleigh(vec3 lambda)+{return (8.0*pow(pi,3.0)*pow(pow(n,2.0)-1.0,2.0)*(6.0+3.0*pn))/(3.0*N*pow(lambda,vec3(4.0))*(6.0-7.0*pn));}+vec3 simplifiedRayleigh()+{return 0.0005/vec3(94,40,18);}+float rayleighPhase(float cosTheta)+{ +return (3.0/(16.0*pi))*(1.0+pow(cosTheta,2.0));}+vec3 totalMie(vec3 lambda,vec3 K,float T)+{float c=(0.2*T )*10E-18;return 0.434*c*pi*pow((2.0*pi)/lambda,vec3(v-2.0))*K;}+float hgPhase(float cosTheta,float g)+{return (1.0/(4.0*pi))*((1.0-pow(g,2.0))/pow(1.0-2.0*g*cosTheta+pow(g,2.0),1.5));}+float sunIntensity(float zenithAngleCos)+{return EE*max(0.0,1.0-exp((-(cutoffAngle-acos(zenithAngleCos))/steepness)));}+float A=0.15;float B=0.50;float C=0.10;float D=0.20;float EEE=0.02;float F=0.30;float W=1000.0;vec3 Uncharted2Tonemap(vec3 x)+{return ((x*(A*x+C*B)+D*EEE)/(x*(A*x+B)+D*F))-EEE/F;}+#if DITHER+#include<helperFunctions>+#endif+#define CUSTOM_FRAGMENT_DEFINITIONS+void main(void) {+#define CUSTOM_FRAGMENT_MAIN_BEGIN+#include<clipPlaneFragment>+/**+*--------------------------------------------------------------------------------------------------+* Sky Color+*--------------------------------------------------------------------------------------------------+*/+float sunfade=1.0-clamp(1.0-exp((sunPosition.y/450000.0)),0.0,1.0);float rayleighCoefficient=rayleigh-(1.0*(1.0-sunfade));vec3 sunDirection=normalize(sunPosition);float sunE=sunIntensity(dot(sunDirection,up));vec3 betaR=simplifiedRayleigh()*rayleighCoefficient;vec3 betaM=totalMie(lambda,K,turbidity)*mieCoefficient;float zenithAngle=acos(max(0.0,dot(up,normalize(vPositionW-cameraPosition+cameraOffset))));float sR=rayleighZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));float sM=mieZenithLength/(cos(zenithAngle)+0.15*pow(93.885-((zenithAngle*180.0)/pi),-1.253));vec3 Fex=exp(-(betaR*sR+betaM*sM));float cosTheta=dot(normalize(vPositionW-cameraPosition),sunDirection);float rPhase=rayleighPhase(cosTheta*0.5+0.5);vec3 betaRTheta=betaR*rPhase;float mPhase=hgPhase(cosTheta,mieDirectionalG);vec3 betaMTheta=betaM*mPhase;vec3 Lin=pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*(1.0-Fex),vec3(1.5));Lin*=mix(vec3(1.0),pow(sunE*((betaRTheta+betaMTheta)/(betaR+betaM))*Fex,vec3(1.0/2.0)),clamp(pow(1.0-dot(up,sunDirection),5.0),0.0,1.0));vec3 direction=normalize(vPositionW-cameraPosition);float theta=acos(direction.y);float phi=atan(direction.z,direction.x);vec2 uv=vec2(phi,theta)/vec2(2.0*pi,pi)+vec2(0.5,0.0);vec3 L0=vec3(0.1)*Fex;float sundisk=smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);L0+=(sunE*19000.0*Fex)*sundisk;vec3 whiteScale=1.0/Uncharted2Tonemap(vec3(W));vec3 texColor=(Lin+L0);texColor*=0.04 ;texColor+=vec3(0.0,0.001,0.0025)*0.3;float g_fMaxLuminance=1.0;float fLumScaled=0.1/luminance; +float fLumCompressed=(fLumScaled*(1.0+(fLumScaled/(g_fMaxLuminance*g_fMaxLuminance))))/(1.0+fLumScaled); +float ExposureBias=fLumCompressed;vec3 curr=Uncharted2Tonemap((log2(2.0/pow(luminance,4.0)))*texColor);vec3 retColor=curr*whiteScale;/**+*--------------------------------------------------------------------------------------------------+* Sky Color+*--------------------------------------------------------------------------------------------------+*/+float alpha=1.0;+#ifdef VERTEXCOLOR+retColor.rgb*=vColor.rgb;+#endif+#if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES)+alpha*=vColor.a;+#endif+#if DITHER+retColor.rgb+=dither(gl_FragCoord.xy,0.5);+#endif+vec4 color=clamp(vec4(retColor.rgb,alpha),0.0,1.0);+#include<logDepthFragment>+#include<fogFragment>+gl_FragColor=color;+#include<imageProcessingCompatibility>+#define CUSTOM_FRAGMENT_MAIN_END+}+`;+o.ShadersStore[e] || (o.ShadersStore[e] = t);+const i = { name: e, shader: t };+export {+ i as skyPixelShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-BQ8Dy87L.jsadded+13@@ -0,0 +1,13 @@+import { bW as e } from "./chunk-IERganv1.js";+const o = "msdfVertexShader", r = `#define BILLBOARD 1+#define BILLBOARDSCREENPROJECTED 2+attribute vec2 offsets;attribute vec4 world0;attribute vec4 world1;attribute vec4 world2;attribute vec4 world3;attribute vec4 uvs;uniform mat4 transform;uniform mat4 parentWorld;uniform mat4 view;uniform mat4 projection;uniform vec3 center;uniform int mode;varying vec2 atlasUV;void main(void) {mat4 world=mat4(world0,world1,world2,world3);vec4 worldPos=transform*(world*vec4(offsets.xy-vec2(0.5,0.5),0.,1.0));if (mode>=BILLBOARD) {vec3 viewPos=(view*parentWorld*vec4(0.,0.,0.,1.0)).xyz; +if (mode==BILLBOARDSCREENPROJECTED) {viewPos.x/=viewPos.z;viewPos.y/=viewPos.z;viewPos.z=1.0;}+gl_Position=projection*vec4(viewPos+worldPos.xyz,1.0); } else {vec3 viewPos=(view*parentWorld*worldPos).xyz; +gl_Position=projection*vec4(viewPos,1.0); }+atlasUV=vec2(uvs.x+offsets.x*uvs.z,uvs.y+(1.0-offsets.y)*uvs.w);}`;+e.ShadersStore[o] || (e.ShadersStore[o] = r);+const i = { shader: r };+export {+ i as msdfVertexShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-B_Vl0aRN.jsadded+18@@ -0,0 +1,18 @@+import { bW as o } from "./chunk-IERganv1.js";+const e = "gaussianSplattingVoxelPixelShader", t = `var voxel_storage: texture_storage_3d<r8unorm,write>;varying vNormalizedPosition: vec3f;varying vNormalizedCenterPosition: vec3f;varying vAlpha: f32;varying vPatchPosition: vec2f;fn gsVoxelPrngCanonical1d(co: f32)->f32 {return fract(sin(co*91.3458)*47453.5453);}+fn gsVoxelPrngCanonical2d(co: vec2f)->f32 {return fract(sin(dot(co,vec2f(12.9898,78.233)))*43758.5453);}+fn gsVoxelPrngCanonical3d(co: vec3f)->f32 {return gsVoxelPrngCanonical2d(vec2f(co.x,co.y)+gsVoxelPrngCanonical1d(co.z));}+@fragment+fn main(input: FragmentInputs)->FragmentOutputs {let normPos: vec3f=input.vNormalizedPosition;let stepSize: f32=1.0/f32(textureDimensions(voxel_storage).x);let diff: vec3f=abs(input.vNormalizedCenterPosition-normPos);let distToCenter: f32=max(max(diff.x,diff.y),diff.z);let gaussian: f32=exp(-dot(input.vPatchPosition,input.vPatchPosition));let shadowingOpacity: f32=clamp(+select(gaussian,1.0,distToCenter<stepSize)*input.vAlpha,+0.0,1.0+);if (shadowingOpacity<1.0 && shadowingOpacity<gsVoxelPrngCanonical3d(normPos/stepSize)) {discard;}+let size: vec3f=vec3f(textureDimensions(voxel_storage));textureStore(voxel_storage,+vec3<i32>(i32(normPos.x*size.x),i32(normPos.y*size.y),i32(normPos.z*size.z)),+vec4f(1.0,1.0,1.0,1.0));fragmentOutputs.color=vec4f(0.0,0.0,0.0,0.0);}+`;+o.ShadersStoreWGSL[e] || (o.ShadersStoreWGSL[e] = t);+const i = { name: e, shader: t };+export {+ i as gaussianSplattingVoxelPixelShaderWGSL+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-BiVWof0k.jsadded+41@@ -0,0 +1,41 @@+import { bW as i } from "./chunk-IERganv1.js";+const e = "selectionPixelShader", f = `#ifdef INSTANCES+flat varying vSelectionId: f32;+#else+uniform selectionId: f32;+#endif+#ifdef STORE_CAMERASPACE_Z+varying vViewPosZ: f32;+#else+varying vDepthMetric: f32;+#endif+#ifdef ALPHATEST+varying vUV: vec2f;var diffuseSamplerSampler: sampler;var diffuseSampler: texture_2d<f32>;+#endif+#include<clipPlaneFragmentDeclaration>+#define CUSTOM_FRAGMENT_DEFINITIONS+@fragment+fn main(input: FragmentInputs)->FragmentOutputs {+#define CUSTOM_FRAGMENT_MAIN_BEGIN+#include<clipPlaneFragment>+#ifdef ALPHATEST+if (textureSample(diffuseSampler,diffuseSamplerSampler,fragmentInputs.vUV).a<0.4) {discard;}+#endif+#ifdef INSTANCES+var id: f32=fragmentInputs.vSelectionId;+#else+var id: f32=uniforms.selectionId;+#endif+#ifdef STORE_CAMERASPACE_Z+fragmentOutputs.color=vec4(id,fragmentInputs.vViewPosZ,0.0,1.0);+#else+fragmentOutputs.color=vec4(id,fragmentInputs.vDepthMetric,0.0,1.0);+#endif+#define CUSTOM_FRAGMENT_MAIN_END+}+`;+i.ShadersStoreWGSL[e] || (i.ShadersStoreWGSL[e] = f);+const r = { name: e, shader: f };+export {+ r as selectionPixelShaderWGSL+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-Bj6IQT5Z.jsadded+79@@ -0,0 +1,79 @@+import { bW as i } from "./chunk-IERganv1.js";+const e = "selectionVertexShader", t = `attribute vec3 position;+#ifdef INSTANCES+attribute float instanceSelectionId;+#endif+#include<bonesDeclaration>+#include<bakedVertexAnimationDeclaration>+#include<morphTargetsVertexGlobalDeclaration>+#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]+#include<clipPlaneVertexDeclaration>+#include<instancesDeclaration>+uniform mat4 viewProjection;+#ifdef STORE_CAMERASPACE_Z+uniform mat4 view;+#else+uniform vec2 depthValues;+#endif+#ifdef INSTANCES+flat varying float vSelectionId;+#endif+#ifdef STORE_CAMERASPACE_Z+varying float vViewPosZ;+#else+varying float vDepthMetric;+#endif+#ifdef ALPHATEST+varying vec2 vUV;uniform mat4 diffuseMatrix;+#ifdef UV1+attribute vec2 uv;+#endif+#ifdef UV2+attribute vec2 uv2;+#endif+#endif+#define CUSTOM_VERTEX_DEFINITIONS+void main(void) {+#define CUSTOM_VERTEX_MAIN_BEGIN+vec3 positionUpdated=position;+#ifdef UV1+vec2 uvUpdated=uv;+#endif+#ifdef UV2+vec2 uv2Updated=uv2;+#endif+#include<morphTargetsVertexGlobal>+#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]+#include<instancesVertex>+#include<bonesVertex>+#include<bakedVertexAnimation>+vec4 worldPos=finalWorld*vec4(positionUpdated,1.0);gl_Position=viewProjection*worldPos;+#ifdef ALPHATEST+#ifdef UV1+vUV=vec2(diffuseMatrix*vec4(uvUpdated,1.0,0.0));+#endif+#ifdef UV2+vUV=vec2(diffuseMatrix*vec4(uv2Updated,1.0,0.0));+#endif+#endif+#ifdef STORE_CAMERASPACE_Z+vViewPosZ=(view*worldPos).z;+#else+#ifdef USE_REVERSE_DEPTHBUFFER+vDepthMetric=((-gl_Position.z+depthValues.x)/(depthValues.y));+#else+vDepthMetric=((gl_Position.z+depthValues.x)/(depthValues.y));+#endif+#endif+#ifdef INSTANCES+vSelectionId=instanceSelectionId;+#endif+#include<clipPlaneVertex>+#define CUSTOM_VERTEX_MAIN_END+}+`;+i.ShadersStore[e] || (i.ShadersStore[e] = t);+const n = { name: e, shader: t };+export {+ n as selectionVertexShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-BloWGZPN.jsadded+80@@ -0,0 +1,80 @@+import { bW as t } from "./chunk-IERganv1.js";+const e = "selectionVertexShader", i = `attribute position: vec3f;+#ifdef INSTANCES+attribute instanceSelectionId: f32;+#endif+#include<bonesDeclaration>+#include<bakedVertexAnimationDeclaration>+#include<morphTargetsVertexGlobalDeclaration>+#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]+#include<clipPlaneVertexDeclaration>+#include<instancesDeclaration>+uniform viewProjection: mat4x4f;+#ifdef STORE_CAMERASPACE_Z+uniform view: mat4x4f;+#else+uniform depthValues: vec2f;+#endif+#ifdef INSTANCES+flat varying vSelectionId: f32;+#endif+#ifdef STORE_CAMERASPACE_Z+varying vViewPosZ: f32;+#else+varying vDepthMetric: f32;+#endif+#ifdef ALPHATEST+varying vUV: vec2f;uniform diffuseMatrix: mat4x4f; +#ifdef UV1+attribute uv: vec2f;+#endif+#ifdef UV2+attribute uv2: vec2f;+#endif+#endif+#define CUSTOM_VERTEX_DEFINITIONS+@vertex+fn main(input: VertexInputs)->FragmentInputs {+#define CUSTOM_VERTEX_MAIN_BEGIN+var positionUpdated: vec3f=vertexInputs.position;+#ifdef UV1+var uvUpdated: vec2f=vertexInputs.uv;+#endif+#ifdef UV2+var uv2Updated: vec2f=vertexInputs.uv2;+#endif+#include<morphTargetsVertexGlobal>+#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]+#include<instancesVertex>+#include<bonesVertex>+#include<bakedVertexAnimation>+var worldPos: vec4f=finalWorld*vec4f(positionUpdated,1.0);vertexOutputs.position=uniforms.viewProjection*worldPos;+#ifdef ALPHATEST+#ifdef UV1+vertexOutputs.vUV=(uniforms.diffuseMatrix*vec4f(uvUpdated,1.0,0.0)).xy;+#endif+#ifdef UV2+vertexOutputs.vUV=(uniforms.diffuseMatrix*vec4f(uv2Updated,1.0,0.0)).xy;+#endif+#endif+#ifdef STORE_CAMERASPACE_Z+vertexOutputs.vViewPosZ=(uniforms.view*worldPos).z;+#else+#ifdef USE_REVERSE_DEPTHBUFFER+vertexOutputs.vDepthMetric=((-vertexOutputs.position.z+uniforms.depthValues.x)/(uniforms.depthValues.y));+#else+vertexOutputs.vDepthMetric=((vertexOutputs.position.z+uniforms.depthValues.x)/(uniforms.depthValues.y));+#endif+#endif+#ifdef INSTANCES+vertexOutputs.vSelectionId=vertexInputs.instanceSelectionId;+#endif+#include<clipPlaneVertex>+#define CUSTOM_VERTEX_MAIN_END+}+`;+t.ShadersStoreWGSL[e] || (t.ShadersStoreWGSL[e] = i);+const r = { name: e, shader: i };+export {+ r as selectionVertexShaderWGSL+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-BrLl4i-D.jsadded+3426@@ -0,0 +1,3426 @@+import { j as D, a as k, r as g, u as te, o as z, P as E, b as be, c as C, m as I, d as Ge, _ as m, e as b, f as H, g as A, h as he, i as me, k as V, l as Ee, n as ke, p as G, q as U, s as We, t as Ve, v as Me, w as Oe, E as Xe, x as Ue, y as $e, S as Je, z as Ke, A as u, D as Ye, B as ce, T as ye, C as X, F as Qe, G as Ze, H as er, I as rr, J as or, K as ar, L as tr, M as ir, N as nr, O as lr, Q as fr, R as cr, U as sr, V as dr, W as ur, X as xe, Y as vr, Z as gr, $ as pr, a0 as br, a1 as hr, a2 as mr, a3 as kr, a4 as yr, a5 as xr, a6 as Br, a7 as wr, a8 as P } from "./chunk-CODtpsMq.js";+import { a3 as zr } from "./chunk-IERganv1.js";+function qr(e, o) {+ const r = {};+ for (const a in e)+ o.indexOf(a) === -1 && e.hasOwnProperty(a) && (r[a] = e[a]);+ return r;+}+const jr = (e) => /* @__PURE__ */ D(e.root, {+ children: [+ e.initials && /* @__PURE__ */ k(e.initials, {}),+ e.icon && /* @__PURE__ */ k(e.icon, {}),+ e.image && /* @__PURE__ */ k(e.image, {}),+ e.badge && /* @__PURE__ */ k(e.badge, {}),+ e.activeAriaLabelElement+ ]+}), Sr = /[\(\[\{][^\)\]\}]*[\)\]\}]/g, Cr = /[\0-\u001F\!-/:-@\[-`\{-\u00BF\u0250-\u036F\uE000-\uFFFF]/g, Tr = /^\d+[\d\s]*(:?ext|x|)\s*\d+$/i, Pr = /\s+/g, Nr = /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\u1100-\u11FF\u3130-\u318F\uA960-\uA97F\uAC00-\uD7AF\uD7B0-\uD7FF\u3040-\u309F\u30A0-\u30FF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF]/;+function O(e) {+ if (!e)+ return "";+ const o = e.codePointAt(0);+ return o === void 0 ? "" : String.fromCodePoint(o);+}+function Ar(e, o, r) {+ let a = "";+ const t = e.split(" ");+ if (t.length !== 0 && (a += O(t[0]).toUpperCase()), r || (t.length === 2 ? a += O(t[1]).toUpperCase() : t.length === 3 && (a += O(t[2]).toUpperCase())), o && [+ ...a+ ].length > 1) {+ const n = [+ ...a+ ];+ return n[1] + n[0];+ }+ return a;+}+function _r(e) {+ return e = e.replace(Sr, ""), e = e.replace(Cr, ""), e = e.replace(Pr, " "), e = e.trim(), e;+}+function Be(e, o, r) {+ if (!e)+ return "";+ e = _r(e);+ const a = O(e);+ return Nr.test(a) || !r?.allowPhoneInitials && Tr.test(e) ? "" : Ar(e, o, r?.firstInitialOnly);+}+const we = g.createContext(void 0), Dr = {};+we.Provider;+const Fr = () => {+ var e;+ return (e = g.useContext(we)) !== null && e !== void 0 ? e : Dr;+}, Hr = {+ active: "active",+ inactive: "inactive"+}, Rr = (e, o) => {+ const { dir: r } = te(), { shape: a, size: t } = Fr(), { size: n = t ?? 32, shape: c = a ?? "circular", active: l = "unset", activeAppearance: f = "ring", idForColor: i, color: s = "neutral", ...d } = e, v = Ir(d, o);+ var p;+ const h = s === "colorful" ? se[Gr((p = i ?? e.name) !== null && p !== void 0 ? p : "") % se.length] : s;+ if (v.initials) {+ var j;+ v.initials = z(e.initials, {+ renderByDefault: !0,+ defaultProps: {+ children: Be(e.name, r === "rtl", {+ firstInitialOnly: n <= 16+ }),+ id: (j = v.initials) === null || j === void 0 ? void 0 : j.id+ },+ elementType: "span"+ });+ }+ v.icon && !v.icon.hasOwnProperty("children") && (v.icon.children = /* @__PURE__ */ g.createElement(Ge, null));+ const y = z(e.badge, {+ defaultProps: {+ size: Lr(n),+ id: v.root.id + "__badge"+ },+ elementType: E+ });+ let B = v.activeAriaLabelElement;+ const q = e["aria-label"] !== void 0, x = e["aria-labelledby"] !== void 0;+ if (!q && !x && (e.name ? y && (v.root["aria-labelledby"] = v.root.id + " " + y.id) : v.initials && (v.root["aria-labelledby"] = v.initials.id + (y ? " " + y.id : ""), delete v.root["aria-label"]), l === "active" || l === "inactive")) {+ const T = Hr[l];+ if (v.root["aria-labelledby"]) {+ const _ = v.root.id + "__active";+ v.root["aria-labelledby"] += " " + _, B = /* @__PURE__ */ g.createElement("span", {+ hidden: !0,+ id: _+ }, T);+ } else v.root["aria-label"] && (v.root["aria-label"] += " " + T);+ }+ return {+ ...v,+ size: n,+ shape: c,+ active: l,+ activeAppearance: f,+ activeAriaLabelElement: B,+ color: h,+ badge: y,+ // eslint-disable-next-line @typescript-eslint/no-deprecated+ components: {+ ...v.components,+ badge: E+ }+ };+}, Ir = (e, o) => {+ const { dir: r } = te(), { name: a, image: t, initials: n, ...c } = e, l = be("avatar-"), f = C({+ role: "img",+ id: l,+ ref: o,+ ...c+ }, {+ elementType: "span"+ }), [i, s] = g.useState(void 0);+ let d = z(t, {+ defaultProps: {+ alt: "",+ role: "presentation",+ "aria-hidden": !0,+ hidden: i+ },+ elementType: "img"+ });+ d?.src || (d = void 0), d && (d.onError = I(d.onError, () => s(!0)), d.onLoad = I(d.onLoad, () => s(void 0)));+ let v = z(n, {+ renderByDefault: !0,+ defaultProps: {+ children: Be(a, r === "rtl"),+ id: l + "__initials"+ },+ elementType: "span"+ });+ v?.children || (v = void 0);+ let p;+ !v && (!d || i) && (p = z(e.icon, {+ renderByDefault: !0,+ defaultProps: {+ "aria-hidden": !0+ },+ elementType: "span"+ }));+ let h;+ return !f["aria-label"] && !f["aria-labelledby"] && (a ? f["aria-label"] = a : v && (f["aria-labelledby"] = v.id)), {+ activeAriaLabelElement: h,+ components: {+ root: "span",+ initials: "span",+ icon: "span",+ image: "img"+ },+ root: f,+ initials: v,+ icon: p,+ image: d+ };+}, Lr = (e) => e >= 96 ? "extra-large" : e >= 64 ? "large" : e >= 56 ? "medium" : e >= 40 ? "small" : e >= 28 ? "extra-small" : "tiny", se = [+ "dark-red",+ "cranberry",+ "red",+ "pumpkin",+ "peach",+ "marigold",+ "gold",+ "brass",+ "brown",+ "forest",+ "seafoam",+ "dark-green",+ "light-teal",+ "teal",+ "steel",+ "blue",+ "royal-blue",+ "cornflower",+ "navy",+ "lavender",+ "purple",+ "grape",+ "lilac",+ "pink",+ "magenta",+ "plum",+ "beige",+ "mink",+ "platinum",+ "anchor"+], Gr = (e) => {+ let o = 0;+ for (let r = e.length - 1; r >= 0; r--) {+ const a = e.charCodeAt(r), t = r % 8;+ o ^= (a << t) + (a >> 8 - t);+ }+ return o;+}, L = {+ root: "fui-Avatar",+ image: "fui-Avatar__image",+ initials: "fui-Avatar__initials",+ icon: "fui-Avatar__icon",+ badge: "fui-Avatar__badge"+}, Er = /* @__PURE__ */ H("r81b29z", "r1aatmv", {+ r: [".r81b29z{display:inline-block;flex-shrink:0;position:relative;vertical-align:middle;border-radius:var(--borderRadiusCircular);font-family:var(--fontFamilyBase);font-weight:var(--fontWeightSemibold);font-size:var(--fontSizeBase300);width:32px;height:32px;}", ".r81b29z::before,.r81b29z::after{position:absolute;top:0;left:0;bottom:0;right:0;z-index:-1;margin:calc(-2 * var(--fui-Avatar-ringWidth, 0px));border-radius:inherit;transition-property:margin,opacity;transition-timing-function:var(--curveEasyEaseMax),var(--curveLinear);transition-duration:var(--durationUltraSlow),var(--durationSlower);}", ".r81b29z::before{border-style:solid;border-width:var(--fui-Avatar-ringWidth);}", ".r1aatmv{display:inline-block;flex-shrink:0;position:relative;vertical-align:middle;border-radius:var(--borderRadiusCircular);font-family:var(--fontFamilyBase);font-weight:var(--fontWeightSemibold);font-size:var(--fontSizeBase300);width:32px;height:32px;}", ".r1aatmv::before,.r1aatmv::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;margin:calc(-2 * var(--fui-Avatar-ringWidth, 0px));border-radius:inherit;transition-property:margin,opacity;transition-timing-function:var(--curveEasyEaseMax),var(--curveLinear);transition-duration:var(--durationUltraSlow),var(--durationSlower);}", ".r1aatmv::before{border-style:solid;border-width:var(--fui-Avatar-ringWidth);}"],+ s: ["@media screen and (prefers-reduced-motion: reduce){.r81b29z::before,.r81b29z::after{transition-duration:0.01ms;}}", "@media screen and (prefers-reduced-motion: reduce){.r1aatmv::before,.r1aatmv::after{transition-duration:0.01ms;}}"]+}), Wr = /* @__PURE__ */ H("r136dc0n", "rjly0nl", [".r136dc0n{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:inherit;object-fit:cover;vertical-align:top;}", ".rjly0nl{position:absolute;top:0;right:0;width:100%;height:100%;border-radius:inherit;object-fit:cover;vertical-align:top;}"]), Vr = /* @__PURE__ */ H("rip04v", "r31uzil", [".rip04v{position:absolute;box-sizing:border-box;top:0;left:0;width:100%;height:100%;line-height:1;border:var(--strokeWidthThin) solid var(--colorTransparentStroke);display:flex;align-items:center;justify-content:center;vertical-align:center;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;border-radius:inherit;}", ".r31uzil{position:absolute;box-sizing:border-box;top:0;right:0;width:100%;height:100%;line-height:1;border:var(--strokeWidthThin) solid var(--colorTransparentStroke);display:flex;align-items:center;justify-content:center;vertical-align:center;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;border-radius:inherit;}"]), Mr = /* @__PURE__ */ m({+ textCaption2Strong: {+ Be2twd7: "f13mqy1h"+ },+ textCaption1Strong: {+ Be2twd7: "fy9rknc"+ },+ textSubtitle2: {+ Be2twd7: "fod5ikn"+ },+ textSubtitle1: {+ Be2twd7: "f1pp30po"+ },+ textTitle3: {+ Be2twd7: "f1x0m3f5"+ },+ squareSmall: {+ Beyfa6y: 0,+ Bbmb7ep: 0,+ Btl43ni: 0,+ B7oj6ja: 0,+ Dimara: "fq9zq91"+ },+ squareMedium: {+ Beyfa6y: 0,+ Bbmb7ep: 0,+ Btl43ni: 0,+ B7oj6ja: 0,+ Dimara: "ft85np5"+ },+ squareLarge: {+ Beyfa6y: 0,+ Bbmb7ep: 0,+ Btl43ni: 0,+ B7oj6ja: 0,+ Dimara: "f1o0qvyv"+ },+ squareXLarge: {+ Beyfa6y: 0,+ Bbmb7ep: 0,+ Btl43ni: 0,+ B7oj6ja: 0,+ Dimara: "f1kijzfu"+ },+ activeOrInactive: {+ Bz10aip: "ftfx35i",+ Bmy1vo4: "fv0atk9",+ B3o57yi: "f1iry5bo",+ Bkqvd7p: "f15n41j8",+ Bg24rqe: "f9ttr0w"+ },+ ring: {+ Ftih45: "f1wl9k8s"+ },+ ringBadgeCutout: {+ f4a502: "fp2gujx"+ },+ ringThick: {+ of393c: "fq1w1vq"+ },+ ringThicker: {+ of393c: "fzg6ace"+ },+ ringThickest: {+ of393c: "f1nu8p71"+ },+ shadow: {+ Bsft5z2: "f13zj6fq"+ },+ shadow4: {+ Be6vj1x: "fcjn15l"+ },+ shadow8: {+ Be6vj1x: "f1tm8t9f"+ },+ shadow16: {+ Be6vj1x: "f1a1aohj"+ },+ shadow28: {+ Be6vj1x: "fond6v5"+ },+ inactive: {+ abs64n: "fp25eh",+ Bz10aip: "f1clczzi",+ Bkqvd7p: "f1l3s34x",+ Bfgortx: 0,+ Bnvr3x9: 0,+ b2tv09: 0,+ Bucmhp4: 0,+ iayac2: "flkahu5",+ b6ubon: "fw457kn",+ Bqinb2h: "f1wmllxl"+ },+ badge: {+ qhf8xq: "f1euv43f",+ B5kzvoi: "f1yab3r1",+ j35jbq: ["f1e31b4d", "f1vgc2s3"]+ },+ badgeCutout: {+ btxmck: "f1eugkqs"+ },+ badgeAlign: {+ Dnlfbu: ["f1tlnv9o", "f1y9kyih"]+ },+ tiny: {+ Bdjeniz: "f1uwoubl",+ niu6jh: "fid048z"+ },+ "extra-small": {+ Bdjeniz: "f13ar0e0",+ niu6jh: "fid048z"+ },+ small: {+ Bdjeniz: "fwwuruf",+ niu6jh: "fid048z"+ },+ medium: {+ Bdjeniz: "f1af27q5",+ niu6jh: "fid048z"+ },+ large: {+ Bdjeniz: "f18yy57a",+ niu6jh: "f924bxt"+ },+ "extra-large": {+ Bdjeniz: "f2jg042",+ niu6jh: "f924bxt"+ },+ icon12: {+ Be2twd7: "f1ugzwwg"+ },+ icon16: {+ Be2twd7: "f4ybsrx"+ },+ icon20: {+ Be2twd7: "fe5j1ua"+ },+ icon24: {+ Be2twd7: "f1rt2boy"+ },+ icon28: {+ Be2twd7: "f24l1pt"+ },+ icon32: {+ Be2twd7: "ffl51b"+ },+ icon48: {+ Be2twd7: "f18m8u13"+ }+}, {+ d: [".f13mqy1h{font-size:var(--fontSizeBase100);}", ".fy9rknc{font-size:var(--fontSizeBase200);}", ".fod5ikn{font-size:var(--fontSizeBase400);}", ".f1pp30po{font-size:var(--fontSizeBase500);}", ".f1x0m3f5{font-size:var(--fontSizeBase600);}", [".fq9zq91{border-radius:var(--borderRadiusSmall);}", {+ p: -1+ }], [".ft85np5{border-radius:var(--borderRadiusMedium);}", {+ p: -1+ }], [".f1o0qvyv{border-radius:var(--borderRadiusLarge);}", {+ p: -1+ }], [".f1kijzfu{border-radius:var(--borderRadiusXLarge);}", {+ p: -1+ }], ".ftfx35i{transform:perspective(1px);}", ".fv0atk9{transition-property:transform,opacity;}", ".f1iry5bo{transition-duration:var(--durationUltraSlow),var(--durationFaster);}", ".f15n41j8{transition-timing-function:var(--curveEasyEaseMax),var(--curveLinear);}", '.f1wl9k8s::before{content:"";}', ".fp2gujx::before{-webkit-mask-image:radial-gradient(circle at bottom calc(var(--fui-Avatar-badgeRadius) + 2 * var(--fui-Avatar-ringWidth)) var(--fui-Avatar-badgeAlign) calc(var(--fui-Avatar-badgeRadius) + 2 * var(--fui-Avatar-ringWidth)), transparent calc(var(--fui-Avatar-badgeRadius) + var(--fui-Avatar-badgeGap) - 0.25px), white calc(var(--fui-Avatar-badgeRadius) + var(--fui-Avatar-badgeGap) + 0.25px));mask-image:radial-gradient(circle at bottom calc(var(--fui-Avatar-badgeRadius) + 2 * var(--fui-Avatar-ringWidth)) var(--fui-Avatar-badgeAlign) calc(var(--fui-Avatar-badgeRadius) + 2 * var(--fui-Avatar-ringWidth)), transparent calc(var(--fui-Avatar-badgeRadius) + var(--fui-Avatar-badgeGap) - 0.25px), white calc(var(--fui-Avatar-badgeRadius) + var(--fui-Avatar-badgeGap) + 0.25px));}", ".fq1w1vq{--fui-Avatar-ringWidth:var(--strokeWidthThick);}", ".fzg6ace{--fui-Avatar-ringWidth:var(--strokeWidthThicker);}", ".f1nu8p71{--fui-Avatar-ringWidth:var(--strokeWidthThickest);}", '.f13zj6fq::after{content:"";}', ".fcjn15l::after{box-shadow:var(--shadow4);}", ".f1tm8t9f::after{box-shadow:var(--shadow8);}", ".f1a1aohj::after{box-shadow:var(--shadow16);}", ".fond6v5::after{box-shadow:var(--shadow28);}", ".fp25eh{opacity:0.8;}", ".f1clczzi{transform:scale(0.875);}", ".f1l3s34x{transition-timing-function:var(--curveDecelerateMin),var(--curveLinear);}", [".flkahu5::before,.flkahu5::after{margin:0;}", {+ p: -1+ }], ".fw457kn::before,.fw457kn::after{opacity:0;}", ".f1wmllxl::before,.f1wmllxl::after{transition-timing-function:var(--curveDecelerateMin),var(--curveLinear);}", ".f1euv43f{position:absolute;}", ".f1yab3r1{bottom:0;}", ".f1e31b4d{right:0;}", ".f1vgc2s3{left:0;}", ".f1eugkqs{-webkit-mask-image:radial-gradient(circle at bottom var(--fui-Avatar-badgeRadius) var(--fui-Avatar-badgeAlign) var(--fui-Avatar-badgeRadius), transparent calc(var(--fui-Avatar-badgeRadius) + var(--fui-Avatar-badgeGap) - 0.25px), white calc(var(--fui-Avatar-badgeRadius) + var(--fui-Avatar-badgeGap) + 0.25px));mask-image:radial-gradient(circle at bottom var(--fui-Avatar-badgeRadius) var(--fui-Avatar-badgeAlign) var(--fui-Avatar-badgeRadius), transparent calc(var(--fui-Avatar-badgeRadius) + var(--fui-Avatar-badgeGap) - 0.25px), white calc(var(--fui-Avatar-badgeRadius) + var(--fui-Avatar-badgeGap) + 0.25px));}", ".f1tlnv9o{--fui-Avatar-badgeAlign:right;}", ".f1y9kyih{--fui-Avatar-badgeAlign:left;}", ".f1uwoubl{--fui-Avatar-badgeRadius:3px;}", ".fid048z{--fui-Avatar-badgeGap:var(--strokeWidthThin);}", ".f13ar0e0{--fui-Avatar-badgeRadius:5px;}", ".fwwuruf{--fui-Avatar-badgeRadius:6px;}", ".f1af27q5{--fui-Avatar-badgeRadius:8px;}", ".f18yy57a{--fui-Avatar-badgeRadius:10px;}", ".f924bxt{--fui-Avatar-badgeGap:var(--strokeWidthThick);}", ".f2jg042{--fui-Avatar-badgeRadius:14px;}", ".f1ugzwwg{font-size:12px;}", ".f4ybsrx{font-size:16px;}", ".fe5j1ua{font-size:20px;}", ".f1rt2boy{font-size:24px;}", ".f24l1pt{font-size:28px;}", ".ffl51b{font-size:32px;}", ".f18m8u13{font-size:48px;}"],+ m: [["@media screen and (prefers-reduced-motion: reduce){.f9ttr0w{transition-duration:0.01ms;}}", {+ m: "screen and (prefers-reduced-motion: reduce)"+ }]]+}), ie = /* @__PURE__ */ m({+ 16: {+ a9b677: "fjw5fx7",+ Bqenvij: "fd461yt"+ },+ 20: {+ a9b677: "f64fuq3",+ Bqenvij: "fjamq6b"+ },+ 24: {+ a9b677: "fq4mcun",+ Bqenvij: "frvgh55"+ },+ 28: {+ a9b677: "f1w9dchk",+ Bqenvij: "fxldao9"+ },+ 32: {+ a9b677: "f1szoe96",+ Bqenvij: "f1d2rq10"+ },+ 36: {+ a9b677: "fpdz1er",+ Bqenvij: "f8ljn23"+ },+ 40: {+ a9b677: "feqmc2u",+ Bqenvij: "fbhnoac"+ },+ 48: {+ a9b677: "f124akge",+ Bqenvij: "ff2sm71"+ },+ 56: {+ a9b677: "f1u66zr1",+ Bqenvij: "fzki0ko"+ },+ 64: {+ a9b677: "fa9ln6p",+ Bqenvij: "f16k9i2m"+ },+ 72: {+ a9b677: "fhcae8x",+ Bqenvij: "f1shusfg"+ },+ 96: {+ a9b677: "f1kyr2gn",+ Bqenvij: "fypu0ge"+ },+ 120: {+ a9b677: "fwfqyga",+ Bqenvij: "fjr5b71"+ },+ 128: {+ a9b677: "f1iksgmy",+ Bqenvij: "fele2au"+ }+}, {+ d: [".fjw5fx7{width:16px;}", ".fd461yt{height:16px;}", ".f64fuq3{width:20px;}", ".fjamq6b{height:20px;}", ".fq4mcun{width:24px;}", ".frvgh55{height:24px;}", ".f1w9dchk{width:28px;}", ".fxldao9{height:28px;}", ".f1szoe96{width:32px;}", ".f1d2rq10{height:32px;}", ".fpdz1er{width:36px;}", ".f8ljn23{height:36px;}", ".feqmc2u{width:40px;}", ".fbhnoac{height:40px;}", ".f124akge{width:48px;}", ".ff2sm71{height:48px;}", ".f1u66zr1{width:56px;}", ".fzki0ko{height:56px;}", ".fa9ln6p{width:64px;}", ".f16k9i2m{height:64px;}", ".fhcae8x{width:72px;}", ".f1shusfg{height:72px;}", ".f1kyr2gn{width:96px;}", ".fypu0ge{height:96px;}", ".fwfqyga{width:120px;}", ".fjr5b71{height:120px;}", ".f1iksgmy{width:128px;}", ".fele2au{height:128px;}"]+}), Or = /* @__PURE__ */ m({+ neutral: {+ sj55zd: "f11d4kpn",+ De3pzq: "f18f03hv"+ },+ brand: {+ sj55zd: "fonrgv7",+ De3pzq: "f1blnnmj"+ },+ "dark-red": {+ sj55zd: "fqjd1y1",+ De3pzq: "f1vq2oo4"+ },+ cranberry: {+ sj55zd: "fg9gses",+ De3pzq: "f1lwxszt"+ },+ red: {+ sj55zd: "f23f7i0",+ De3pzq: "f1q9qhfq"+ },+ pumpkin: {+ sj55zd: "fjnan08",+ De3pzq: "fz91bi3"+ },+ peach: {+ sj55zd: "fknu15p",+ De3pzq: "f1b9nr51"+ },+ marigold: {+ sj55zd: "f9603vw",+ De3pzq: "f3z4w6d"+ },+ gold: {+ sj55zd: "fmq0uwp",+ De3pzq: "fg50kya"+ },+ brass: {+ sj55zd: "f28g5vo",+ De3pzq: "f4w2gd0"+ },+ brown: {+ sj55zd: "ftl572b",+ De3pzq: "f14wu1f4"+ },+ forest: {+ sj55zd: "f1gymlvd",+ De3pzq: "f19ut4y6"+ },+ seafoam: {+ sj55zd: "fnnb6wn",+ De3pzq: "f1n057jc"+ },+ "dark-green": {+ sj55zd: "ff58qw8",+ De3pzq: "f11t05wk"+ },+ "light-teal": {+ sj55zd: "f1up9qbj",+ De3pzq: "f42feg1"+ },+ teal: {+ sj55zd: "f135dsb4",+ De3pzq: "f6hvv1p"+ },+ steel: {+ sj55zd: "f151dlcp",+ De3pzq: "f1lnp8zf"+ },+ blue: {+ sj55zd: "f1rjv50u",+ De3pzq: "f1ggcpy6"+ },+ "royal-blue": {+ sj55zd: "f1emykk5",+ De3pzq: "f12rj61f"+ },+ cornflower: {+ sj55zd: "fqsigj7",+ De3pzq: "f8k7hur"+ },+ navy: {+ sj55zd: "f1nj97xi",+ De3pzq: "f19gw0ux"+ },+ lavender: {+ sj55zd: "fwctg0i",+ De3pzq: "ff379vm"+ },+ purple: {+ sj55zd: "fjrsgpu",+ De3pzq: "f1mzf1e1"+ },+ grape: {+ sj55zd: "f1fiiydq",+ De3pzq: "f1o4k8oy"+ },+ lilac: {+ sj55zd: "f1res9jt",+ De3pzq: "f1x6mz1o"+ },+ pink: {+ sj55zd: "fv3fbbi",+ De3pzq: "fydlv6t"+ },+ magenta: {+ sj55zd: "f1f1fwnz",+ De3pzq: "f4xb6j5"+ },+ plum: {+ sj55zd: "f8ptl6j",+ De3pzq: "fqo8e26"+ },+ beige: {+ sj55zd: "f1ntv3ld",+ De3pzq: "f101elhj"+ },+ mink: {+ sj55zd: "f1fscmp",+ De3pzq: "f13g8o5c"+ },+ platinum: {+ sj55zd: "f1dr00v2",+ De3pzq: "fkh7blw"+ },+ anchor: {+ sj55zd: "f1f3ti53",+ De3pzq: "fu4yj0j"+ }+}, {+ d: [".f11d4kpn{color:var(--colorNeutralForeground3);}", ".f18f03hv{background-color:var(--colorNeutralBackground6);}", ".fonrgv7{color:var(--colorNeutralForegroundStaticInverted);}", ".f1blnnmj{background-color:var(--colorBrandBackgroundStatic);}", ".fqjd1y1{color:var(--colorPaletteDarkRedForeground2);}", ".f1vq2oo4{background-color:var(--colorPaletteDarkRedBackground2);}", ".fg9gses{color:var(--colorPaletteCranberryForeground2);}", ".f1lwxszt{background-color:var(--colorPaletteCranberryBackground2);}", ".f23f7i0{color:var(--colorPaletteRedForeground2);}", ".f1q9qhfq{background-color:var(--colorPaletteRedBackground2);}", ".fjnan08{color:var(--colorPalettePumpkinForeground2);}", ".fz91bi3{background-color:var(--colorPalettePumpkinBackground2);}", ".fknu15p{color:var(--colorPalettePeachForeground2);}", ".f1b9nr51{background-color:var(--colorPalettePeachBackground2);}", ".f9603vw{color:var(--colorPaletteMarigoldForeground2);}", ".f3z4w6d{background-color:var(--colorPaletteMarigoldBackground2);}", ".fmq0uwp{color:var(--colorPaletteGoldForeground2);}", ".fg50kya{background-color:var(--colorPaletteGoldBackground2);}", ".f28g5vo{color:var(--colorPaletteBrassForeground2);}", ".f4w2gd0{background-color:var(--colorPaletteBrassBackground2);}", ".ftl572b{color:var(--colorPaletteBrownForeground2);}", ".f14wu1f4{background-color:var(--colorPaletteBrownBackground2);}", ".f1gymlvd{color:var(--colorPaletteForestForeground2);}", ".f19ut4y6{background-color:var(--colorPaletteForestBackground2);}", ".fnnb6wn{color:var(--colorPaletteSeafoamForeground2);}", ".f1n057jc{background-color:var(--colorPaletteSeafoamBackground2);}", ".ff58qw8{color:var(--colorPaletteDarkGreenForeground2);}", ".f11t05wk{background-color:var(--colorPaletteDarkGreenBackground2);}", ".f1up9qbj{color:var(--colorPaletteLightTealForeground2);}", ".f42feg1{background-color:var(--colorPaletteLightTealBackground2);}", ".f135dsb4{color:var(--colorPaletteTealForeground2);}", ".f6hvv1p{background-color:var(--colorPaletteTealBackground2);}", ".f151dlcp{color:var(--colorPaletteSteelForeground2);}", ".f1lnp8zf{background-color:var(--colorPaletteSteelBackground2);}", ".f1rjv50u{color:var(--colorPaletteBlueForeground2);}", ".f1ggcpy6{background-color:var(--colorPaletteBlueBackground2);}", ".f1emykk5{color:var(--colorPaletteRoyalBlueForeground2);}", ".f12rj61f{background-color:var(--colorPaletteRoyalBlueBackground2);}", ".fqsigj7{color:var(--colorPaletteCornflowerForeground2);}", ".f8k7hur{background-color:var(--colorPaletteCornflowerBackground2);}", ".f1nj97xi{color:var(--colorPaletteNavyForeground2);}", ".f19gw0ux{background-color:var(--colorPaletteNavyBackground2);}", ".fwctg0i{color:var(--colorPaletteLavenderForeground2);}", ".ff379vm{background-color:var(--colorPaletteLavenderBackground2);}", ".fjrsgpu{color:var(--colorPalettePurpleForeground2);}", ".f1mzf1e1{background-color:var(--colorPalettePurpleBackground2);}", ".f1fiiydq{color:var(--colorPaletteGrapeForeground2);}", ".f1o4k8oy{background-color:var(--colorPaletteGrapeBackground2);}", ".f1res9jt{color:var(--colorPaletteLilacForeground2);}", ".f1x6mz1o{background-color:var(--colorPaletteLilacBackground2);}", ".fv3fbbi{color:var(--colorPalettePinkForeground2);}", ".fydlv6t{background-color:var(--colorPalettePinkBackground2);}", ".f1f1fwnz{color:var(--colorPaletteMagentaForeground2);}", ".f4xb6j5{background-color:var(--colorPaletteMagentaBackground2);}", ".f8ptl6j{color:var(--colorPalettePlumForeground2);}", ".fqo8e26{background-color:var(--colorPalettePlumBackground2);}", ".f1ntv3ld{color:var(--colorPaletteBeigeForeground2);}", ".f101elhj{background-color:var(--colorPaletteBeigeBackground2);}", ".f1fscmp{color:var(--colorPaletteMinkForeground2);}", ".f13g8o5c{background-color:var(--colorPaletteMinkBackground2);}", ".f1dr00v2{color:var(--colorPalettePlatinumForeground2);}", ".fkh7blw{background-color:var(--colorPalettePlatinumBackground2);}", ".f1f3ti53{color:var(--colorPaletteAnchorForeground2);}", ".fu4yj0j{background-color:var(--colorPaletteAnchorBackground2);}"]+}), Xr = /* @__PURE__ */ m({+ neutral: {+ Bic5iru: "f1uuiafn"+ },+ brand: {+ Bic5iru: "f1uuiafn"+ },+ "dark-red": {+ Bic5iru: "f1t2x9on"+ },+ cranberry: {+ Bic5iru: "f1pvshc9"+ },+ red: {+ Bic5iru: "f1ectbk9"+ },+ pumpkin: {+ Bic5iru: "fvzpl0b"+ },+ peach: {+ Bic5iru: "fwj2kd7"+ },+ marigold: {+ Bic5iru: "fr120vy"+ },+ gold: {+ Bic5iru: "f8xmmar"+ },+ brass: {+ Bic5iru: "f1hbety2"+ },+ brown: {+ Bic5iru: "f1vg3s4g"+ },+ forest: {+ Bic5iru: "f1m3olm5"+ },+ seafoam: {+ Bic5iru: "f17xiqtr"+ },+ "dark-green": {+ Bic5iru: "fx32vyh"+ },+ "light-teal": {+ Bic5iru: "f1mkihwv"+ },+ teal: {+ Bic5iru: "fecnooh"+ },+ steel: {+ Bic5iru: "f15hfgzm"+ },+ blue: {+ Bic5iru: "fqproka"+ },+ "royal-blue": {+ Bic5iru: "f17v2w59"+ },+ cornflower: {+ Bic5iru: "fp0q1mo"+ },+ navy: {+ Bic5iru: "f1nlym55"+ },+ lavender: {+ Bic5iru: "f62vk8h"+ },+ purple: {+ Bic5iru: "f15zl69q"+ },+ grape: {+ Bic5iru: "f53w4j7"+ },+ lilac: {+ Bic5iru: "fu2771t"+ },+ pink: {+ Bic5iru: "fzflscs"+ },+ magenta: {+ Bic5iru: "fb6rmqc"+ },+ plum: {+ Bic5iru: "f1a4gm5b"+ },+ beige: {+ Bic5iru: "f1qpf9z1"+ },+ mink: {+ Bic5iru: "f1l7or83"+ },+ platinum: {+ Bic5iru: "fzrj0iu"+ },+ anchor: {+ Bic5iru: "f8oz6wf"+ }+}, {+ d: [".f1uuiafn::before{color:var(--colorBrandStroke1);}", ".f1t2x9on::before{color:var(--colorPaletteDarkRedBorderActive);}", ".f1pvshc9::before{color:var(--colorPaletteCranberryBorderActive);}", ".f1ectbk9::before{color:var(--colorPaletteRedBorderActive);}", ".fvzpl0b::before{color:var(--colorPalettePumpkinBorderActive);}", ".fwj2kd7::before{color:var(--colorPalettePeachBorderActive);}", ".fr120vy::before{color:var(--colorPaletteMarigoldBorderActive);}", ".f8xmmar::before{color:var(--colorPaletteGoldBorderActive);}", ".f1hbety2::before{color:var(--colorPaletteBrassBorderActive);}", ".f1vg3s4g::before{color:var(--colorPaletteBrownBorderActive);}", ".f1m3olm5::before{color:var(--colorPaletteForestBorderActive);}", ".f17xiqtr::before{color:var(--colorPaletteSeafoamBorderActive);}", ".fx32vyh::before{color:var(--colorPaletteDarkGreenBorderActive);}", ".f1mkihwv::before{color:var(--colorPaletteLightTealBorderActive);}", ".fecnooh::before{color:var(--colorPaletteTealBorderActive);}", ".f15hfgzm::before{color:var(--colorPaletteSteelBorderActive);}", ".fqproka::before{color:var(--colorPaletteBlueBorderActive);}", ".f17v2w59::before{color:var(--colorPaletteRoyalBlueBorderActive);}", ".fp0q1mo::before{color:var(--colorPaletteCornflowerBorderActive);}", ".f1nlym55::before{color:var(--colorPaletteNavyBorderActive);}", ".f62vk8h::before{color:var(--colorPaletteLavenderBorderActive);}", ".f15zl69q::before{color:var(--colorPalettePurpleBorderActive);}", ".f53w4j7::before{color:var(--colorPaletteGrapeBorderActive);}", ".fu2771t::before{color:var(--colorPaletteLilacBorderActive);}", ".fzflscs::before{color:var(--colorPalettePinkBorderActive);}", ".fb6rmqc::before{color:var(--colorPaletteMagentaBorderActive);}", ".f1a4gm5b::before{color:var(--colorPalettePlumBorderActive);}", ".f1qpf9z1::before{color:var(--colorPaletteBeigeBorderActive);}", ".f1l7or83::before{color:var(--colorPaletteMinkBorderActive);}", ".fzrj0iu::before{color:var(--colorPalettePlatinumBorderActive);}", ".f8oz6wf::before{color:var(--colorPaletteAnchorBorderActive);}"]+}), Ur = (e) => {+ "use no memo";+ const {+ size: o,+ shape: r,+ active: a,+ activeAppearance: t,+ color: n+ } = e, c = Er(), l = Wr(), f = Vr(), i = Mr(), s = ie(), d = Or(), v = Xr(), p = [c, o !== 32 && s[o]];+ if (e.badge && p.push(i.badgeAlign, i[e.badge.size || "medium"]), o <= 24 ? p.push(i.textCaption2Strong) : o <= 28 ? p.push(i.textCaption1Strong) : o <= 40 || (o <= 56 ? p.push(i.textSubtitle2) : o <= 96 ? p.push(i.textSubtitle1) : p.push(i.textTitle3)), r === "square" && (o <= 24 ? p.push(i.squareSmall) : o <= 48 ? p.push(i.squareMedium) : o <= 72 ? p.push(i.squareLarge) : p.push(i.squareXLarge)), (a === "active" || a === "inactive") && (p.push(i.activeOrInactive), (t === "ring" || t === "ring-shadow") && (p.push(i.ring, v[n]), e.badge && p.push(i.ringBadgeCutout), o <= 48 ? p.push(i.ringThick) : o <= 64 ? p.push(i.ringThicker) : p.push(i.ringThickest)), (t === "shadow" || t === "ring-shadow") && (p.push(i.shadow), o <= 28 ? p.push(i.shadow4) : o <= 48 ? p.push(i.shadow8) : o <= 64 ? p.push(i.shadow16) : p.push(i.shadow28)), a === "inactive" && p.push(i.inactive)), e.root.className = b(L.root, ...p, e.root.className), e.badge && (e.badge.className = b(L.badge, i.badge, e.badge.className)), e.image && (e.image.className = b(L.image, l, d[n], e.badge && i.badgeCutout, e.image.className)), e.initials && (e.initials.className = b(L.initials, f, d[n], e.badge && i.badgeCutout, e.initials.className)), e.icon) {+ let h;+ o <= 16 ? h = i.icon12 : o <= 24 ? h = i.icon16 : o <= 40 ? h = i.icon20 : o <= 48 ? h = i.icon24 : o <= 56 ? h = i.icon28 : o <= 72 ? h = i.icon32 : h = i.icon48, e.icon.className = b(L.icon, f, h, d[n], e.badge && i.badgeCutout, e.icon.className);+ }+ return e;+}, W = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = Rr(e, o);+ return Ur(r), A("useAvatarStyles_unstable")(r), jr(r);+});+W.displayName = "Avatar";+const ne = he(void 0), $r = {}, Jr = ne.Provider, Y = (e) => me(ne, (o = $r) => e(o)), Kr = (e, o) => /* @__PURE__ */ k(Jr, {+ value: o.avatarGroup,+ children: /* @__PURE__ */ k(e.root, {})+}), Yr = (e, o) => {+ const { size: r = ze, ...a } = e, t = Qr(a, o);+ return {+ size: r,+ ...t+ };+}, Qr = (e, o) => {+ const { layout: r = "spread" } = e, a = C(V("div", {+ role: "group",+ ...e,+ ref: o+ }), {+ elementType: "div"+ });+ return {+ layout: r,+ components: {+ root: "div"+ },+ root: a+ };+}, ze = 32, Zr = (e) => {+ const { layout: o, size: r } = e;+ return {+ avatarGroup: g.useMemo(() => ({+ layout: o,+ size: r+ }), [+ o,+ r+ ])+ };+}, eo = {+ root: "fui-AvatarGroup"+}, ro = /* @__PURE__ */ m({+ base: {+ mc9l5x: "ftuwxu6",+ qhf8xq: "f10pi13n"+ },+ pie: {+ Bgl5zvf: "f1uz6ud1",+ De3pzq: "f1ganh6p",+ By8wz76: "f1wgxgin"+ }+}, {+ d: [".ftuwxu6{display:inline-flex;}", ".f10pi13n{position:relative;}", ".f1uz6ud1{clip-path:circle(50%);}", ".f1ganh6p{background-color:var(--colorTransparentStroke);}"],+ m: [["@media (forced-colors: active){.f1wgxgin{background-color:CanvasText;}}", {+ m: "(forced-colors: active)"+ }]]+}), oo = (e) => {+ "use no memo";+ const {+ layout: o,+ size: r+ } = e, a = ro(), t = ie();+ return e.root.className = b(eo.root, a.base, o === "pie" && t[r], o === "pie" && a.pie, e.root.className), e;+}, qe = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = Yr(e, o), a = Zr(r);+ return oo(r), A("useAvatarGroupStyles_unstable")(r), Kr(r, a);+});+qe.displayName = "AvatarGroup";+const ao = (e) => /* @__PURE__ */ D(e.root, {+ children: [+ /* @__PURE__ */ k(e.avatar, {}),+ e.isOverflowItem && /* @__PURE__ */ k(e.overflowLabel, {})+ ]+}), to = (e, o) => {+ const r = io(e, o), a = Y((n) => n.size), t = a ?? ze;+ return {+ size: t,+ ...r,+ components: {+ // eslint-disable-next-line @typescript-eslint/no-deprecated+ ...r.components,+ avatar: W+ },+ avatar: C(e.avatar, {+ defaultProps: {+ size: t,+ color: "colorful",+ ...r.avatar+ },+ elementType: W+ })+ };+}, io = (e, o) => {+ const r = Y((f) => f.isOverflow), a = Y((f) => f.layout), { style: t, className: n, overflowLabel: c, ...l } = e;+ return Ee(ne), {+ isOverflowItem: r,+ layout: a,+ components: {+ root: r ? "li" : "div",+ avatar: "span",+ overflowLabel: "span"+ },+ root: C(e.root, {+ defaultProps: {+ style: t,+ className: n+ },+ elementType: r ? "li" : "div"+ }),+ avatar: C(e.avatar, {+ defaultProps: {+ ref: o,+ ...l+ },+ elementType: "span"+ }),+ overflowLabel: C(c, {+ defaultProps: {+ // Avatar already has its aria-label set to the name, this will prevent the name to be read twice.+ "aria-hidden": !0,+ children: e.name+ },+ elementType: "span"+ })+ };+}, J = {+ root: "fui-AvatarGroupItem",+ avatar: "fui-AvatarGroupItem__avatar",+ overflowLabel: "fui-AvatarGroupItem__overflowLabel"+}, no = /* @__PURE__ */ m({+ base: {+ Bt984gj: "f122n59",+ mc9l5x: "ftuwxu6",+ Bnnss6s: "fi64zpg",+ qhf8xq: "f10pi13n"+ },+ overflowItem: {+ Byoj8tv: 0,+ uwmqm3: 0,+ z189sj: 0,+ z8tnut: 0,+ B0ocmuz: "f16d74zd"+ },+ nonOverflowItem: {+ Beyfa6y: 0,+ Bbmb7ep: 0,+ Btl43ni: 0,+ B7oj6ja: 0,+ Dimara: "f44lkw9"+ }+}, {+ d: [".f122n59{align-items:center;}", ".ftuwxu6{display:inline-flex;}", ".fi64zpg{flex-shrink:0;}", ".f10pi13n{position:relative;}", [".f16d74zd{padding:var(--spacingVerticalXS) var(--spacingHorizontalXS);}", {+ p: -1+ }], [".f44lkw9{border-radius:var(--borderRadiusCircular);}", {+ p: -1+ }]]+}), lo = /* @__PURE__ */ m({+ nonOverflowItem: {+ qhf8xq: "f1euv43f"+ },+ pie: {+ Beyfa6y: 0,+ Bbmb7ep: 0,+ Btl43ni: 0,+ B7oj6ja: 0,+ Dimara: "fokr779"+ }+}, {+ d: [".f1euv43f{position:absolute;}", [".fokr779{border-radius:0;}", {+ p: -1+ }]]+}), fo = /* @__PURE__ */ m({+ base: {+ Frg6f3: ["foyynoy", "f1vcna3q"],+ sj55zd: "f19n0e5",+ Bahqtrf: "fk6fouc",+ Be2twd7: "fkhj508",+ Bhrd7zp: "figsok6",+ Bg96gwp: "f1i3iumi"+ }+}, {+ d: [".foyynoy{margin-left:var(--spacingHorizontalS);}", ".f1vcna3q{margin-right:var(--spacingHorizontalS);}", ".f19n0e5{color:var(--colorNeutralForeground1);}", ".fk6fouc{font-family:var(--fontFamilyBase);}", ".fkhj508{font-size:var(--fontSizeBase300);}", ".figsok6{font-weight:var(--fontWeightRegular);}", ".f1i3iumi{line-height:var(--lineHeightBase300);}"]+}), co = /* @__PURE__ */ m({+ thick: {+ E5pizo: "foiuzp5"+ },+ thicker: {+ E5pizo: "f1x6o7w7"+ },+ thickest: {+ E5pizo: "f2aml1u"+ },+ xxs: {+ jhia2w: ["f1cjco14", "f13dxjc9"]+ },+ xs: {+ jhia2w: ["f15p6bln", "f1bab3ru"]+ },+ s: {+ jhia2w: ["f1v53ncc", "f17pu8r8"]+ },+ l: {+ jhia2w: ["flv48ch", "fnh1ydj"]+ }+}, {+ d: [".foiuzp5{box-shadow:0 0 0 var(--strokeWidthThick) var(--colorNeutralBackground2);}", ".f1x6o7w7{box-shadow:0 0 0 var(--strokeWidthThicker) var(--colorNeutralBackground2);}", ".f2aml1u{box-shadow:0 0 0 var(--strokeWidthThickest) var(--colorNeutralBackground2);}", ".f1cjco14:not(:first-child){margin-left:calc(-1 * var(--spacingHorizontalXXS));}", ".f13dxjc9:not(:first-child){margin-right:calc(-1 * var(--spacingHorizontalXXS));}", ".f15p6bln:not(:first-child){margin-left:calc(-1 * var(--spacingHorizontalXS));}", ".f1bab3ru:not(:first-child){margin-right:calc(-1 * var(--spacingHorizontalXS));}", ".f1v53ncc:not(:first-child){margin-left:calc(-1 * var(--spacingHorizontalS));}", ".f17pu8r8:not(:first-child){margin-right:calc(-1 * var(--spacingHorizontalS));}", ".flv48ch:not(:first-child){margin-left:calc(-1 * var(--spacingHorizontalL));}", ".fnh1ydj:not(:first-child){margin-right:calc(-1 * var(--spacingHorizontalL));}"]+}), so = /* @__PURE__ */ m({+ s: {+ jhia2w: ["f7lhxv7", "f6ou2b0"]+ },+ mNudge: {+ jhia2w: ["f1h0okno", "fnnqava"]+ },+ m: {+ jhia2w: ["f1wkt588", "f1maio5g"]+ },+ l: {+ jhia2w: ["f1l333zn", "f1r41m4c"]+ },+ xl: {+ jhia2w: ["fahr13a", "f2n7rbo"]+ }+}, {+ d: [".f7lhxv7:not(:first-child){margin-left:var(--spacingHorizontalS);}", ".f6ou2b0:not(:first-child){margin-right:var(--spacingHorizontalS);}", ".f1h0okno:not(:first-child){margin-left:var(--spacingHorizontalMNudge);}", ".fnnqava:not(:first-child){margin-right:var(--spacingHorizontalMNudge);}", ".f1wkt588:not(:first-child){margin-left:var(--spacingHorizontalM);}", ".f1maio5g:not(:first-child){margin-right:var(--spacingHorizontalM);}", ".f1l333zn:not(:first-child){margin-left:var(--spacingHorizontalL);}", ".f1r41m4c:not(:first-child){margin-right:var(--spacingHorizontalL);}", ".fahr13a:not(:first-child){margin-left:var(--spacingHorizontalXL);}", ".f2n7rbo:not(:first-child){margin-right:var(--spacingHorizontalXL);}"]+}), uo = /* @__PURE__ */ m({+ base: {+ qhf8xq: "f1euv43f"+ },+ slices: {+ B3gf25r: "f16m7w7k",+ Be2twx7: ["f1o4hhgz", "fb4gjrz"],+ Bvaow4n: "f1pgb5nx",+ Gpecfs: ["fugirid", "f4sk99m"],+ bhabj1: "fjreaf3",+ B7rc6i7: ["f1k4vw81", "f1w1xcy7"],+ Bwrfys5: "f1ef8vxk",+ Bwuzm9m: ["f1x2qbfv", "f1xwf4nz"],+ fflka: "ff6xuso",+ do7bja: "fzpvk6c",+ Be8zqhl: "f4onu7f",+ Bij0kh0: ["f1ydfez1", "fjensob"],+ Bwexnyt: "f1yv732j",+ Bhe5x6o: "fchq2fj",+ B3kv7bh: "ff5binh"+ },+ rtlSlices: {+ B3gf25r: "f5vdl61",+ Bvaow4n: "f1bnra92",+ bhabj1: "f4ibo7t",+ Bwrfys5: "f17heuis",+ Bwuzm9m: ["f64f2ud", "f1yjglu3"],+ Be8zqhl: "fa6l61x",+ Bij0kh0: ["f1w2396a", "f14ab3yo"]+ },+ thick: {+ uiicq7: "fnyfzln"+ },+ thicker: {+ uiicq7: "f1xdzzot"+ },+ thickest: {+ uiicq7: "f1auhru5"+ }+}, {+ d: [".f1euv43f{position:absolute;}", ".f16m7w7k:nth-of-type(1):nth-last-of-type(2){clip-path:inset(0 calc(25% + (var(--fuiAvatarGroupItem__divider--width) / 2)) 0 25%);}", ".f1o4hhgz:nth-of-type(1):nth-last-of-type(2){left:-25%;}", ".fb4gjrz:nth-of-type(1):nth-last-of-type(2){right:-25%;}", ".f1pgb5nx:nth-of-type(2):nth-last-of-type(1){clip-path:inset(0 25% 0 calc(25% + (var(--fuiAvatarGroupItem__divider--width) / 2)));}", ".fugirid:nth-of-type(2):nth-last-of-type(1){left:25%;}", ".f4sk99m:nth-of-type(2):nth-last-of-type(1){right:25%;}", ".fjreaf3:nth-of-type(1):nth-last-of-type(3){clip-path:inset(0 calc(25% + (var(--fuiAvatarGroupItem__divider--width) / 2)) 0 25%);}", ".f1k4vw81:nth-of-type(1):nth-last-of-type(3){left:-25%;}", ".f1w1xcy7:nth-of-type(1):nth-last-of-type(3){right:-25%;}", ".f1ef8vxk:nth-of-type(2):nth-last-of-type(2){clip-path:inset(0 0 var(--fuiAvatarGroupItem__divider--width) var(--fuiAvatarGroupItem__divider--width));}", ".f1x2qbfv:nth-of-type(2):nth-last-of-type(2){left:50%;}", ".f1xwf4nz:nth-of-type(2):nth-last-of-type(2){right:50%;}", ".ff6xuso:nth-of-type(2):nth-last-of-type(2){transform:scale(0.5);}", ".fzpvk6c:nth-of-type(2):nth-last-of-type(2){transform-origin:0 0;}", ".f4onu7f:nth-of-type(3):nth-last-of-type(1){clip-path:inset(var(--fuiAvatarGroupItem__divider--width) 0 0 var(--fuiAvatarGroupItem__divider--width));}", ".f1ydfez1:nth-of-type(3):nth-last-of-type(1){left:50%;}", ".fjensob:nth-of-type(3):nth-last-of-type(1){right:50%;}", ".f1yv732j:nth-of-type(3):nth-last-of-type(1){top:50%;}", ".fchq2fj:nth-of-type(3):nth-last-of-type(1){transform:scale(0.5);}", ".ff5binh:nth-of-type(3):nth-last-of-type(1){transform-origin:0 0;}", ".f5vdl61:nth-of-type(1):nth-last-of-type(2){clip-path:inset(0 25% 0 calc(25% + (var(--fuiAvatarGroupItem__divider--width) / 2)));}", ".f1bnra92:nth-of-type(2):nth-last-of-type(1){clip-path:inset(0 calc(25% + (var(--fuiAvatarGroupItem__divider--width) / 2)) 0 25%);}", ".f4ibo7t:nth-of-type(1):nth-last-of-type(3){clip-path:inset(0 25% 0 calc(25% + (var(--fuiAvatarGroupItem__divider--width) / 2)));}", ".f17heuis:nth-of-type(2):nth-last-of-type(2){clip-path:inset(0 var(--fuiAvatarGroupItem__divider--width) var(--fuiAvatarGroupItem__divider--width) 0);}", ".f64f2ud:nth-of-type(2):nth-last-of-type(2){left:0;}", ".f1yjglu3:nth-of-type(2):nth-last-of-type(2){right:0;}", ".fa6l61x:nth-of-type(3):nth-last-of-type(1){clip-path:inset(var(--fuiAvatarGroupItem__divider--width) var(--fuiAvatarGroupItem__divider--width) 0 0);}", ".f1w2396a:nth-of-type(3):nth-last-of-type(1){left:0;}", ".f14ab3yo:nth-of-type(3):nth-last-of-type(1){right:0;}", ".fnyfzln{--fuiAvatarGroupItem__divider--width:var(--strokeWidthThick);}", ".f1xdzzot{--fuiAvatarGroupItem__divider--width:var(--strokeWidthThicker);}", ".f1auhru5{--fuiAvatarGroupItem__divider--width:var(--strokeWidthThickest);}"]+}), vo = (e) => {+ "use no memo";+ const {+ isOverflowItem: o,+ layout: r,+ size: a+ } = e, {+ dir: t+ } = te(), n = lo(), c = fo(), l = uo(), f = no(), i = ie(), s = go(r, a), d = [f.base];+ return o ? d.push(f.overflowItem) : (d.push(f.nonOverflowItem), d.push(s), d.push(i[a]), r === "pie" && (d.push(l.base), a < 56 ? d.push(l.thick) : a < 72 ? d.push(l.thicker) : d.push(l.thickest), d.push(l.slices), t === "rtl" && d.push(l.rtlSlices))), e.root.className = b(J.root, ...d, e.root.className), e.avatar.className = b(J.avatar, !o && n.nonOverflowItem, r === "pie" && n.pie, e.avatar.className), e.overflowLabel && (e.overflowLabel.className = b(J.overflowLabel, c.base, e.overflowLabel.className)), e;+}, go = (e, o) => {+ const r = co(), a = so(), t = [];+ return o && (e === "stack" ? (o < 56 ? t.push(r.thick) : o < 72 ? t.push(r.thicker) : t.push(r.thickest), o < 24 ? t.push(r.xxs) : o < 48 ? t.push(r.xs) : o < 96 ? t.push(r.s) : t.push(r.l)) : e === "spread" && (o < 20 ? t.push(a.s) : o < 32 ? t.push(a.mNudge) : o < 64 ? t.push(a.l) : t.push(a.xl))), b(...t);+}, je = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = to(e, o);+ return vo(r), A("useAvatarGroupItemStyles_unstable")(r), ao(r);+});+je.displayName = "AvatarGroupItem";+const po = (e) => {+ const { presenceOnly: o, textPosition: r } = e, a = o ? e.presence && /* @__PURE__ */ k(e.presence, {}) : e.avatar && /* @__PURE__ */ k(e.avatar, {});+ return /* @__PURE__ */ D(e.root, {+ children: [+ (r === "after" || r === "below") && a,+ e.primaryText && /* @__PURE__ */ k(e.primaryText, {}),+ e.secondaryText && /* @__PURE__ */ k(e.secondaryText, {}),+ e.tertiaryText && /* @__PURE__ */ k(e.tertiaryText, {}),+ e.quaternaryText && /* @__PURE__ */ k(e.quaternaryText, {}),+ r === "before" && a+ ]+ });+}, bo = (e, o) => {+ const { avatar: r, presenceOnly: a = !1, size: t = "medium", textAlignment: n = "start", textPosition: c = "after", presence: l, ...f } = e, i = ho(f, o);+ return {+ ...i,+ presenceOnly: a,+ size: t,+ textAlignment: n,+ textPosition: c,+ components: {+ // eslint-disable-next-line @typescript-eslint/no-deprecated+ ...i.components,+ avatar: W,+ presence: E+ },+ avatar: a ? void 0 : z(r, {+ renderByDefault: !0,+ defaultProps: {+ name: e.name,+ badge: l,+ size: ko[t]+ },+ elementType: W+ }),+ presence: a ? z(l, {+ defaultProps: {+ size: mo[t]+ },+ elementType: E+ }) : void 0+ };+}, ho = (e, o) => {+ const { name: r, primaryText: a, secondaryText: t, tertiaryText: n, quaternaryText: c, ...l } = e, f = z(a, {+ renderByDefault: !0,+ defaultProps: {+ children: r+ },+ elementType: "span"+ }), i = z(t, {+ elementType: "span"+ }), s = z(n, {+ elementType: "span"+ }), d = z(c, {+ elementType: "span"+ });+ return {+ numTextLines: [+ f,+ i,+ s,+ d+ ].filter(Boolean).length,+ components: {+ root: "div",+ primaryText: "span",+ secondaryText: "span",+ tertiaryText: "span",+ quaternaryText: "span"+ },+ root: C({+ ref: o,+ ...l+ }, {+ elementType: "div"+ }),+ primaryText: f,+ secondaryText: i,+ tertiaryText: s,+ quaternaryText: d+ };+}, mo = {+ "extra-small": "tiny",+ small: "extra-small",+ medium: "small",+ large: "medium",+ "extra-large": "large",+ huge: "large"+}, ko = {+ "extra-small": 20,+ small: 28,+ medium: 32,+ large: 36,+ "extra-large": 40,+ huge: 56+}, F = {+ root: "fui-Persona",+ avatar: "fui-Persona__avatar",+ presence: "fui-Persona__presence",+ primaryText: "fui-Persona__primaryText",+ secondaryText: "fui-Persona__secondaryText",+ tertiaryText: "fui-Persona__tertiaryText",+ quaternaryText: "fui-Persona__quaternaryText"+}, yo = /* @__PURE__ */ H("rlroi9i", null, [".rlroi9i{display:inline-grid;grid-auto-rows:max-content;grid-auto-flow:column;justify-items:start;grid-template-columns:max-content [middle] auto;}"]), xo = /* @__PURE__ */ m({+ beforeAfterCenter: {+ wkccdc: "f1iantul"+ },+ after: {},+ before: {+ B7hvi0a: "f1tll2w5",+ Budl1dq: "ffvkwdr"+ },+ below: {+ Bxotwcr: "f1nkeedh",+ B7hvi0a: "f1oiokrs",+ Budl1dq: "f1emgwh2"+ },+ media: {+ Ijaq50: "f1hek2iy"+ },+ mediaBeforeAfterCenter: {+ Ijaq50: "fa4dipu"+ },+ start: {+ qb2dma: "f9h729m"+ },+ center: {+ qb2dma: "f7nlbp4"+ },+ afterAlignToPrimary: {+ qb2dma: "f7nlbp4",+ Ijaq50: "f1rnkkuc",+ Bw0ie65: "f1warjpf"+ },+ beforeAlignToPrimary: {+ qb2dma: "f7nlbp4",+ Ijaq50: "f1rnkkuc",+ Br312pm: "fwu52yu"+ },+ secondLineSpacing: {+ B6of3ja: "f1ryq6si"+ },+ primary: {+ Ijaq50: "f1q3ipgb"+ },+ secondary: {+ Ijaq50: "f3drtdk"+ },+ tertiary: {+ Ijaq50: "fa1o6s1"+ },+ quaternary: {+ Ijaq50: "f1tuwaia"+ }+}, {+ d: [".f1iantul{grid-template-rows:1fr [primary] max-content [secondary] max-content [tertiary] max-content [quaternary] max-content 1fr;}", ".f1tll2w5{justify-items:end;}", ".ffvkwdr{grid-template-columns:auto [middle] max-content;}", ".f1nkeedh{grid-auto-flow:unset;}", ".f1oiokrs{justify-items:center;}", ".f1emgwh2{grid-template-columns:unset;}", ".f1hek2iy{grid-row-start:span 5;}", ".fa4dipu{grid-row-start:span 6;}", ".f9h729m{align-self:start;}", ".f7nlbp4{align-self:center;}", ".f1rnkkuc{grid-row-start:unset;}", ".f1warjpf{grid-column-end:middle;}", ".fwu52yu{grid-column-start:middle;}", ".f1ryq6si{margin-top:-2px;}", ".f1q3ipgb{grid-row-start:primary;}", ".f3drtdk{grid-row-start:secondary;}", ".fa1o6s1{grid-row-start:tertiary;}", ".f1tuwaia{grid-row-start:quaternary;}"]+}), Bo = /* @__PURE__ */ m({+ "extra-small": {+ Bs1gm4r: "f1e48tse"+ },+ small: {+ Bs1gm4r: "f18q9vkd"+ },+ medium: {+ Bs1gm4r: "f18q9vkd"+ },+ large: {+ Bs1gm4r: "fx34bi6"+ },+ "extra-large": {+ Bs1gm4r: "fx34bi6"+ },+ huge: {+ Bs1gm4r: "f1o96qtm"+ },+ after: {+ t21cq0: ["f103ycu4", "f1tao51"]+ },+ below: {+ jrapky: "fbo7acy"+ },+ before: {+ Frg6f3: ["f1tao51", "f103ycu4"]+ }+}, {+ d: [".f1e48tse{--fui-Persona__avatar--spacing:var(--spacingHorizontalSNudge);}", ".f18q9vkd{--fui-Persona__avatar--spacing:var(--spacingHorizontalS);}", ".fx34bi6{--fui-Persona__avatar--spacing:var(--spacingHorizontalMNudge);}", ".f1o96qtm{--fui-Persona__avatar--spacing:var(--spacingHorizontalM);}", ".f103ycu4{margin-right:var(--fui-Persona__avatar--spacing);}", ".f1tao51{margin-left:var(--fui-Persona__avatar--spacing);}", ".fbo7acy{margin-bottom:var(--fui-Persona__avatar--spacing);}"]+}), wo = /* @__PURE__ */ m({+ small: {+ Bs1gm4r: "f1e48tse"+ }+}, {+ d: [".f1e48tse{--fui-Persona__avatar--spacing:var(--spacingHorizontalSNudge);}"]+}), zo = (e) => {+ "use no memo";+ const {+ presenceOnly: o,+ size: r,+ textAlignment: a,+ textPosition: t+ } = e, n = o && a === "start" && r !== "extra-large" && r !== "huge", c = t !== "below" && a === "center", {+ primaryTextClassName: l,+ optionalTextClassName: f+ } = Co(e, n), i = yo(), s = xo(), d = Bo(), v = {+ ...d,+ ...wo()+ };+ return e.root.className = b(F.root, i, c && s.beforeAfterCenter, s[t], e.root.className), e.avatar && (e.avatar.className = b(F.avatar, t !== "below" && s.media, c && s.mediaBeforeAfterCenter, s[a], d[r], d[t], e.avatar.className)), e.presence && (e.presence.className = b(F.presence, t !== "below" && s.media, c && s.mediaBeforeAfterCenter, s[a], v[r], v[t], t === "after" && n && s.afterAlignToPrimary, t === "before" && n && s.beforeAlignToPrimary, e.presence.className)), e.primaryText && (e.primaryText.className = b(F.primaryText, c && s.primary, l, e.primaryText.className)), e.secondaryText && (e.secondaryText.className = b(F.secondaryText, c && s.secondary, f, s.secondLineSpacing, e.secondaryText.className)), e.tertiaryText && (e.tertiaryText.className = b(F.tertiaryText, c && s.tertiary, f, e.tertiaryText.className)), e.quaternaryText && (e.quaternaryText.className = b(F.quaternaryText, c && s.quaternary, f, e.quaternaryText.className)), e;+}, qo = /* @__PURE__ */ H("rvj41k9", null, [".rvj41k9{display:block;color:var(--colorNeutralForeground1);font-family:var(--fontFamilyBase);font-size:var(--fontSizeBase300);font-weight:var(--fontWeightRegular);line-height:var(--lineHeightBase300);}"]), jo = /* @__PURE__ */ H("rp1pf9e", null, [".rp1pf9e{display:block;color:var(--colorNeutralForeground2);font-family:var(--fontFamilyBase);font-size:var(--fontSizeBase200);font-weight:var(--fontWeightRegular);line-height:var(--lineHeightBase200);}"]), So = /* @__PURE__ */ m({+ beforeAlignToPrimary: {+ Bw0ie65: "f1warjpf"+ },+ afterAlignToPrimary: {+ Br312pm: "fwu52yu"+ },+ body1: {+ Bahqtrf: "fk6fouc",+ Be2twd7: "fkhj508",+ Bhrd7zp: "figsok6",+ Bg96gwp: "f1i3iumi"+ },+ caption1: {+ Bahqtrf: "fk6fouc",+ Be2twd7: "fy9rknc",+ Bhrd7zp: "figsok6",+ Bg96gwp: "fwrc4pm"+ },+ subtitle2: {+ Bahqtrf: "fk6fouc",+ Be2twd7: "fod5ikn",+ Bhrd7zp: "fl43uef",+ Bg96gwp: "faaz57k"+ }+}, {+ d: [".f1warjpf{grid-column-end:middle;}", ".fwu52yu{grid-column-start:middle;}", ".fk6fouc{font-family:var(--fontFamilyBase);}", ".fkhj508{font-size:var(--fontSizeBase300);}", ".figsok6{font-weight:var(--fontWeightRegular);}", ".f1i3iumi{line-height:var(--lineHeightBase300);}", ".fy9rknc{font-size:var(--fontSizeBase200);}", ".fwrc4pm{line-height:var(--lineHeightBase200);}", ".fod5ikn{font-size:var(--fontSizeBase400);}", ".fl43uef{font-weight:var(--fontWeightSemibold);}", ".faaz57k{line-height:var(--lineHeightBase400);}"]+}), Co = (e, o) => {+ const {+ presenceOnly: r,+ size: a,+ textPosition: t+ } = e, n = qo(), c = jo(), l = So();+ let f, i;+ return r ? (a === "extra-small" ? f = e.numTextLines <= 1 && l.caption1 : (a === "extra-large" || a === "huge") && (f = l.subtitle2), o && (t === "before" ? i = l.beforeAlignToPrimary : t === "after" && (i = l.afterAlignToPrimary))) : (a === "huge" || a === "extra-large") && (f = l.subtitle2), {+ primaryTextClassName: b(n, f, i),+ optionalTextClassName: b(c, !r && a === "huge" && l.body1, i)+ };+}, le = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = bo(e, o);+ return zo(r), A("usePersonaStyles_unstable")(r), po(r);+});+le.displayName = "Persona";+const To = (e, o) => {+ const { appearance: r = "transparent", reserveSelectedTabSpace: a = !0, size: t = "medium" } = e, n = Po(e, o), c = No({+ vertical: n.vertical+ });+ return {+ ...n,+ root: {+ ...c,+ ...n.root+ },+ appearance: r,+ reserveSelectedTabSpace: a,+ size: t+ };+}, Po = (e, o) => {+ const { disabled: r = !1, onTabSelect: a, selectTabOnFocus: t = !1, vertical: n = !1, selectedValue: c, defaultSelectedValue: l, ...f } = e, i = g.useRef(null), [s, d] = ke({+ state: c,+ defaultState: l,+ initialState: void 0+ }), v = g.useRef(void 0), p = g.useRef(void 0);+ g.useEffect(() => {+ p.current = v.current, v.current = s;+ }, [+ s+ ]);+ const h = G((x, T) => {+ d(T.value), a?.(x, T);+ }), j = g.useRef({}), y = G((x) => {+ const T = JSON.stringify(x.value);+ j.current[T] = x;+ }), B = G((x) => {+ delete j.current[JSON.stringify(x.value)];+ }), q = g.useCallback(() => ({+ selectedValue: v.current,+ previousSelectedValue: p.current,+ registeredTabs: j.current+ }), []);+ return {+ components: {+ root: "div"+ },+ root: C({+ ref: U(o, i),+ role: "tablist",+ "aria-orientation": n ? "vertical" : "horizontal",+ ...f+ }, {+ elementType: "div"+ }),+ disabled: r,+ selectTabOnFocus: t,+ selectedValue: s,+ onRegister: y,+ onUnregister: B,+ onSelect: h,+ getRegisteredTabs: q,+ vertical: n+ };+}, No = ({ vertical: e }) => We({+ circular: !0,+ axis: e ? "vertical" : "horizontal",+ memorizeCurrent: !1,+ // eslint-disable-next-line @typescript-eslint/naming-convention+ unstable_hasDefault: !0+}), Ao = {+ appearance: "transparent",+ reserveSelectedTabSpace: !0,+ selectTabOnFocus: !1,+ disabled: !1,+ selectedValue: void 0,+ onRegister: () => {+ },+ onUnregister: () => {+ },+ onSelect: () => {+ },+ getRegisteredTabs: () => ({+ registeredTabs: {}+ }),+ size: "medium",+ vertical: !1+}, Se = he(void 0), _o = Se.Provider, N = (e) => me(Se, (o = Ao) => e(o)), Do = (e, o) => /* @__PURE__ */ k(e.root, {+ children: /* @__PURE__ */ k(_o, {+ value: o.tabList,+ children: e.root.children+ })+}), Fo = {+ root: "fui-TabList"+}, Ho = /* @__PURE__ */ m({+ root: {+ mc9l5x: "f22iagw",+ Beiy3e4: "f1063pyq",+ Bnnss6s: "fi64zpg",+ Eh141a: "flvyvdh",+ qhf8xq: "f10pi13n"+ },+ horizontal: {+ Bt984gj: "f1q9h2pe",+ Beiy3e4: "f1063pyq"+ },+ vertical: {+ Bt984gj: "f1q9h2pe",+ Beiy3e4: "f1vx9l62"+ },+ roundedSmall: {+ i8kkvl: 0,+ Belr9w4: 0,+ rmohyg: "f1eyhf9v"+ },+ rounded: {+ i8kkvl: 0,+ Belr9w4: 0,+ rmohyg: "faqewft"+ }+}, {+ d: [".f22iagw{display:flex;}", ".f1063pyq{flex-direction:row;}", ".fi64zpg{flex-shrink:0;}", ".flvyvdh{flex-wrap:nowrap;}", ".f10pi13n{position:relative;}", ".f1q9h2pe{align-items:stretch;}", ".f1vx9l62{flex-direction:column;}", [".f1eyhf9v{gap:var(--spacingHorizontalSNudge);}", {+ p: -1+ }], [".faqewft{gap:var(--spacingHorizontalS);}", {+ p: -1+ }]]+}), Ro = (e) => {+ "use no memo";+ const {+ appearance: o,+ vertical: r,+ size: a+ } = e, t = Ho(), n = o === "subtle-circular" || o === "filled-circular";+ return e.root.className = b(Fo.root, t.root, r ? t.vertical : t.horizontal, n && (a === "small" ? t.roundedSmall : t.rounded), e.root.className), e;+};+function Io(e) {+ const { appearance: o, reserveSelectedTabSpace: r, disabled: a, selectTabOnFocus: t, selectedValue: n, onRegister: c, onUnregister: l, onSelect: f, getRegisteredTabs: i, size: s, vertical: d } = e;+ return {+ tabList: g.useMemo(() => ({+ appearance: o,+ reserveSelectedTabSpace: r,+ disabled: a,+ selectTabOnFocus: t,+ selectedValue: n,+ onSelect: f,+ onRegister: c,+ onUnregister: l,+ getRegisteredTabs: i,+ size: s,+ vertical: d+ }), [+ o,+ r,+ a,+ t,+ n,+ f,+ c,+ l,+ i,+ s,+ d+ ])+ };+}+const Ce = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = To(e, o), a = Io(r);+ return Ro(r), A("useTabListStyles_unstable")(r), Do(r, a);+});+Ce.displayName = "TabList";+const Lo = (e, o) => {+ const { content: r } = e, a = Go(e, o), t = Eo(a), n = N((i) => i.appearance), c = N((i) => i.reserveSelectedTabSpace), l = N((i) => {+ var s;+ return (s = i.size) !== null && s !== void 0 ? s : "medium";+ }), f = r && typeof r == "object" ? qr(r, [+ "ref"+ ]) : r;+ return {+ ...a,+ // eslint-disable-next-line @typescript-eslint/no-deprecated+ components: {+ ...a.components,+ contentReservedSpace: "span"+ },+ root: {+ ...t,+ ...a.root+ },+ contentReservedSpace: z(f, {+ renderByDefault: !a.selected && !a.iconOnly && c,+ defaultProps: {+ children: e.children+ },+ elementType: "span"+ }),+ appearance: n,+ size: l+ };+}, Go = (e, o) => {+ const { content: r, disabled: a = !1, icon: t, onClick: n, onFocus: c, value: l, ...f } = e, i = N((w) => w.selectTabOnFocus), s = N((w) => w.disabled), d = N((w) => w.selectedValue === l), v = N((w) => w.onRegister), p = N((w) => w.onUnregister), h = N((w) => w.onSelect), j = N((w) => !!w.vertical), y = s || a, B = g.useRef(null), q = (w) => h(w, {+ value: l+ }), x = G(I(n, q)), T = G(I(c, q));+ g.useEffect(() => (v({+ value: l,+ ref: B+ }), () => {+ p({+ value: l,+ ref: B+ });+ }), [+ v,+ p,+ B,+ l+ ]);+ const _ = z(t, {+ elementType: "span"+ }), M = C(r, {+ defaultProps: {+ children: e.children+ },+ elementType: "span"+ }), S = !!(_?.children && !M.children);+ return {+ components: {+ root: "button",+ icon: "span",+ content: "span",+ contentReservedSpace: "span"+ },+ root: C({+ ref: U(o, B),+ role: "tab",+ type: "button",+ // aria-selected undefined indicates it is not selectable+ // according to https://www.w3.org/TR/wai-aria-1.1/#aria-selected+ "aria-selected": y ? void 0 : `${d}`,+ value: l,+ ...f,+ disabled: y,+ onClick: x,+ onFocus: i ? T : c+ }, {+ elementType: "button"+ }),+ icon: _,+ iconOnly: S,+ content: M,+ disabled: y,+ selected: d,+ value: l,+ vertical: j+ };+}, Eo = ({ selected: e }) => Ve({+ focusable: {+ isDefault: e+ }+}), Wo = (e) => /* @__PURE__ */ D(e.root, {+ children: [+ e.icon && /* @__PURE__ */ k(e.icon, {}),+ !e.iconOnly && /* @__PURE__ */ k(e.content, {}),+ e.contentReservedSpace && /* @__PURE__ */ k(e.contentReservedSpace, {})+ ]+}), de = {+ offsetVar: "--fui-Tab__indicator--offset",+ scaleVar: "--fui-Tab__indicator--scale"+}, Vo = /* @__PURE__ */ m({+ base: {+ B68tc82: 0,+ Bmxbyg5: 0,+ Bpg54ce: "f1gl81tg"+ },+ animated: {+ Ba2ppi3: "fhwpy7i",+ F2fol1: "f6zz20j",+ B1dyfl9: "f1ai4sc1",+ Bu93a1u: "f1rnm8gg",+ Bdasjez: "f1x3cmqg"+ },+ horizontal: {+ sjv3b2: ["fug4aj8", "f1i5xzg7"],+ b1kco5: "f1q7ujh"+ },+ vertical: {+ sjv3b2: "f1hqboyk",+ b1kco5: "f1dxupa6"+ }+}, {+ d: [[".f1gl81tg{overflow:visible;}", {+ p: -1+ }], ".fhwpy7i::after{transition-property:transform;}", ".f6zz20j::after{transition-duration:var(--durationSlow);}", ".f1ai4sc1::after{transition-timing-function:var(--curveDecelerateMax);}", ".fug4aj8::after{transform-origin:left;}", ".f1i5xzg7::after{transform-origin:right;}", ".f1q7ujh::after{transform:translateX(var(--fui-Tab__indicator--offset)) scaleX(var(--fui-Tab__indicator--scale));}", ".f1hqboyk::after{transform-origin:top;}", ".f1dxupa6::after{transform:translateY(var(--fui-Tab__indicator--offset)) scaleY(var(--fui-Tab__indicator--scale));}"],+ m: [["@media (prefers-reduced-motion: reduce){.f1rnm8gg::after{transition-property:none;}}", {+ m: "(prefers-reduced-motion: reduce)"+ }], ["@media (prefers-reduced-motion: reduce){.f1x3cmqg::after{transition-duration:0.01ms;}}", {+ m: "(prefers-reduced-motion: reduce)"+ }]]+}), Mo = (e) => {+ if (e) {+ var o;+ const r = ((o = e.parentElement) === null || o === void 0 ? void 0 : o.getBoundingClientRect()) || {+ x: 0,+ y: 0+ }, a = e.getBoundingClientRect();+ return {+ x: a.x - r.x,+ y: a.y - r.y,+ width: a.width,+ height: a.height+ };+ }+}, ue = (e, o) => {+ var r;+ const a = Q(o) ? (r = e[JSON.stringify(o)]) === null || r === void 0 ? void 0 : r.ref.current : void 0;+ return a ? Mo(a) : void 0;+}, Q = (e) => e != null, Oo = (e) => {+ const {+ disabled: o,+ selected: r,+ vertical: a+ } = e, t = Vo(), [n, c] = g.useState(), [l, f] = g.useState({+ offset: 0,+ scale: 1+ }), i = N((p) => p.getRegisteredTabs), [s] = Me();+ if (r) {+ const {+ previousSelectedValue: p,+ selectedValue: h,+ registeredTabs: j+ } = i();+ if (Q(p) && n !== p) {+ const y = ue(j, p), B = ue(j, h);+ if (B && y) {+ const q = a ? y.y - B.y : y.x - B.x, x = a ? y.height / B.height : y.width / B.width;+ f({+ offset: q,+ scale: x+ }), c(p), s(() => f({+ offset: 0,+ scale: 1+ }));+ }+ }+ } else Q(n) && c(void 0);+ if (o)+ return e;+ const d = l.offset === 0 && l.scale === 1;+ e.root.className = b(e.root.className, r && t.base, r && d && t.animated, r && (a ? t.vertical : t.horizontal));+ const v = {+ [de.offsetVar]: `${l.offset}px`,+ [de.scaleVar]: `${l.scale}`+ };+ return e.root.style = {+ ...v,+ ...e.root.style+ }, e;+}, Z = {+ root: "fui-Tab",+ icon: "fui-Tab__icon",+ content: "fui-Tab__content"+}, Xo = {+ content: "fui-Tab__content--reserved-space"+}, Te = /* @__PURE__ */ m({+ root: {+ Bt984gj: "f122n59",+ mc9l5x: "f13qh94s",+ Bnnss6s: "fi64zpg",+ Bxotwcr: "f1u07yai",+ Budl1dq: "frn2hmy",+ wkccdc: "f1olsevy",+ oeaueh: "f1s6fcnf",+ qhf8xq: "f10pi13n"+ },+ button: {+ Bt984gj: "f122n59",+ Bgfg5da: 0,+ B9xav0g: 0,+ oivjwe: 0,+ Bn0qgzm: 0,+ B4g9neb: 0,+ zhjwy3: 0,+ wvpqe5: 0,+ ibv6hh: 0,+ u1mtju: 0,+ h3c5rm: 0,+ vrafjx: 0,+ Bekrc4i: 0,+ i8vvqc: 0,+ g2u3we: 0,+ icvyot: 0,+ B4j52fo: 0,+ irswps: "f3bhgqh",+ Beyfa6y: 0,+ Bbmb7ep: 0,+ Btl43ni: 0,+ B7oj6ja: 0,+ Dimara: "ft85np5",+ Bceei9c: "f1k6fduh",+ mc9l5x: "f13qh94s",+ Bnnss6s: "fi64zpg",+ Bxotwcr: "f1u07yai",+ Budl1dq: "frn2hmy",+ wkccdc: "f1olsevy",+ Bahqtrf: "fk6fouc",+ Bg96gwp: "f1i3iumi",+ oeaueh: "f1s6fcnf",+ qhf8xq: "f10pi13n",+ B68tc82: 0,+ Bmxbyg5: 0,+ Bpg54ce: "f1a3p1vp",+ B9bfxx9: "f1cxpek8"+ },+ horizontal: {+ Brf1p80: "f4d9j23"+ },+ vertical: {+ Brf1p80: "f1s9ku6b"+ },+ smallHorizontal: {+ i8kkvl: "f14mj54c",+ Byoj8tv: 0,+ uwmqm3: 0,+ z189sj: 0,+ z8tnut: 0,+ B0ocmuz: "f1wmopi4"+ },+ smallVertical: {+ i8kkvl: "f14mj54c",+ Byoj8tv: 0,+ uwmqm3: 0,+ z189sj: 0,+ z8tnut: 0,+ B0ocmuz: "f12or63q"+ },+ mediumHorizontal: {+ i8kkvl: "f1rjii52",+ Byoj8tv: 0,+ uwmqm3: 0,+ z189sj: 0,+ z8tnut: 0,+ B0ocmuz: "f1w08f2p"+ },+ mediumVertical: {+ i8kkvl: "f1rjii52",+ Byoj8tv: 0,+ uwmqm3: 0,+ z189sj: 0,+ z8tnut: 0,+ B0ocmuz: "fymxs25"+ },+ largeHorizontal: {+ i8kkvl: "f1rjii52",+ Byoj8tv: 0,+ uwmqm3: 0,+ z189sj: 0,+ z8tnut: 0,+ B0ocmuz: "f1ssfvub"+ },+ largeVertical: {+ i8kkvl: "f1rjii52",+ Byoj8tv: 0,+ uwmqm3: 0,+ z189sj: 0,+ z8tnut: 0,+ B0ocmuz: "fwkd1rq"+ },+ transparent: {+ De3pzq: "f1c21dwh",+ B95qlz1: "f9rvdkv",+ B7xitij: "f1051ucx",+ Bptxc3x: "fmmjozx",+ Bwqhzpy: "fqhzt5g",+ iyk698: "f7l5cgy",+ cl4aha: "fpkze5g",+ B0q3jbp: "f1iywnoi",+ Be9ayug: "f9n45c4"+ },+ subtle: {+ De3pzq: "fhovq9v",+ B95qlz1: "f1bifk9c",+ B7xitij: "fo6hitd",+ Bptxc3x: "fmmjozx",+ Bwqhzpy: "fqhzt5g",+ iyk698: "f7l5cgy",+ cl4aha: "fpkze5g",+ B0q3jbp: "f1iywnoi",+ Be9ayug: "f9n45c4"+ },+ disabledCursor: {+ Bceei9c: "fdrzuqr"+ },+ disabled: {+ De3pzq: "f1c21dwh",+ Bptxc3x: "fato7r6",+ cl4aha: "fao1bnu"+ },+ selected: {+ Bptxc3x: "f1cadz5z",+ Bwqhzpy: "fwhdxxj",+ iyk698: "fintccb",+ cl4aha: "ffplhdr",+ B0q3jbp: "fjo17wb",+ Be9ayug: "f148789c"+ }+}, {+ d: [".f122n59{align-items:center;}", ".f13qh94s{display:grid;}", ".fi64zpg{flex-shrink:0;}", ".f1u07yai{grid-auto-flow:column;}", ".frn2hmy{grid-template-columns:auto;}", ".f1olsevy{grid-template-rows:auto;}", ".f1s6fcnf{outline-style:none;}", ".f10pi13n{position:relative;}", [".f3bhgqh{border:none;}", {+ p: -2+ }], [".ft85np5{border-radius:var(--borderRadiusMedium);}", {+ p: -1+ }], ".f1k6fduh{cursor:pointer;}", ".fk6fouc{font-family:var(--fontFamilyBase);}", ".f1i3iumi{line-height:var(--lineHeightBase300);}", [".f1a3p1vp{overflow:hidden;}", {+ p: -1+ }], ".f1cxpek8{text-transform:none;}", ".f4d9j23{justify-content:center;}", ".f1s9ku6b{justify-content:start;}", ".f14mj54c{column-gap:var(--spacingHorizontalXXS);}", [".f1wmopi4{padding:var(--spacingVerticalSNudge) var(--spacingHorizontalSNudge);}", {+ p: -1+ }], [".f12or63q{padding:var(--spacingVerticalXXS) var(--spacingHorizontalSNudge);}", {+ p: -1+ }], ".f1rjii52{column-gap:var(--spacingHorizontalSNudge);}", [".f1w08f2p{padding:var(--spacingVerticalM) var(--spacingHorizontalMNudge);}", {+ p: -1+ }], [".fymxs25{padding:var(--spacingVerticalSNudge) var(--spacingHorizontalMNudge);}", {+ p: -1+ }], [".f1ssfvub{padding:var(--spacingVerticalL) var(--spacingHorizontalMNudge);}", {+ p: -1+ }], [".fwkd1rq{padding:var(--spacingVerticalS) var(--spacingHorizontalMNudge);}", {+ p: -1+ }], ".f1c21dwh{background-color:var(--colorTransparentBackground);}", ".f9rvdkv:enabled:hover{background-color:var(--colorTransparentBackgroundHover);}", ".f1051ucx:enabled:active{background-color:var(--colorTransparentBackgroundPressed);}", ".fmmjozx .fui-Tab__icon{color:var(--colorNeutralForeground2);}", ".fqhzt5g:enabled:hover .fui-Tab__icon{color:var(--colorNeutralForeground2Hover);}", ".f7l5cgy:enabled:active .fui-Tab__icon{color:var(--colorNeutralForeground2Pressed);}", ".fpkze5g .fui-Tab__content{color:var(--colorNeutralForeground2);}", ".f1iywnoi:enabled:hover .fui-Tab__content{color:var(--colorNeutralForeground2Hover);}", ".f9n45c4:enabled:active .fui-Tab__content{color:var(--colorNeutralForeground2Pressed);}", ".fhovq9v{background-color:var(--colorSubtleBackground);}", ".f1bifk9c:enabled:hover{background-color:var(--colorSubtleBackgroundHover);}", ".fo6hitd:enabled:active{background-color:var(--colorSubtleBackgroundPressed);}", ".fdrzuqr{cursor:not-allowed;}", ".fato7r6 .fui-Tab__icon{color:var(--colorNeutralForegroundDisabled);}", ".fao1bnu .fui-Tab__content{color:var(--colorNeutralForegroundDisabled);}", ".f1cadz5z .fui-Tab__icon{color:var(--colorCompoundBrandForeground1);}", ".fwhdxxj:enabled:hover .fui-Tab__icon{color:var(--colorCompoundBrandForeground1Hover);}", ".fintccb:enabled:active .fui-Tab__icon{color:var(--colorCompoundBrandForeground1Pressed);}", ".ffplhdr .fui-Tab__content{color:var(--colorNeutralForeground1);}", ".fjo17wb:enabled:hover .fui-Tab__content{color:var(--colorNeutralForeground1Hover);}", ".f148789c:enabled:active .fui-Tab__content{color:var(--colorNeutralForeground1Pressed);}"]+}), Uo = /* @__PURE__ */ m({+ base: {+ Beyfa6y: 0,+ Bbmb7ep: 0,+ Btl43ni: 0,+ B7oj6ja: 0,+ Dimara: "f44lkw9",+ Bgfg5da: 0,+ B9xav0g: 0,+ oivjwe: 0,+ Bn0qgzm: 0,+ B4g9neb: 0,+ zhjwy3: 0,+ wvpqe5: 0,+ ibv6hh: 0,+ u1mtju: 0,+ h3c5rm: 0,+ vrafjx: 0,+ Bekrc4i: 0,+ i8vvqc: 0,+ g2u3we: 0,+ icvyot: 0,+ B4j52fo: 0,+ irswps: "fp7rvkm",+ Bptxc3x: "ftorr8m",+ cl4aha: "f16lqpmv"+ },+ small: {+ Dbcxam: 0,+ rjzwhg: 0,+ Bblux5w: "fzklhed"+ },+ medium: {+ Dbcxam: 0,+ rjzwhg: 0,+ Bblux5w: "f1j721cc"+ },+ large: {+ Dbcxam: 0,+ rjzwhg: 0,+ Bblux5w: "frx9knr"+ },+ subtle: {+ De3pzq: "fhovq9v",+ sj55zd: "fkfq4zb",+ B95qlz1: "f1bifk9c",+ Eo63ln: 0,+ r9osk6: 0,+ Itrz8y: 0,+ zeg6vx: 0,+ l65xgk: 0,+ Bw4olcx: 0,+ Folb0i: 0,+ I2h8y4: 0,+ Bgxgoyi: 0,+ Bvlkotb: 0,+ Fwyncl: 0,+ Byh5edv: 0,+ Becqvjq: 0,+ uumbiq: 0,+ B73q3dg: 0,+ Bblwbaf: 0,+ B0ezav: "ft57sj0",+ r4wkhp: "f1fcoy83",+ B7xitij: "fo6hitd",+ d3wsvi: 0,+ Hdqn7s: 0,+ zu5y1p: 0,+ owqphb: 0,+ g9c53k: 0,+ Btmu08z: 0,+ Bthxvy6: 0,+ gluvuq: 0,+ tb88gp: 0,+ wns6jk: 0,+ kdfdk4: 0,+ Bbw008l: 0,+ Bayi1ib: 0,+ B1kkfu3: 0,+ J1oqyp: 0,+ kem6az: 0,+ goa3yj: "fhn220o",+ p743kt: "f15qf7sh",+ wmvzou: 0,+ sc4o1m: 0,+ wymq9i: 0,+ u9orzk: 0,+ puiv5t: 0,+ Bosien3: 0,+ b2z72d: 0,+ Beulxaw: 0,+ B57pkaw: 0,+ Jcjdmf: 0,+ B8qgbzl: 0,+ Bbmb0sr: 0,+ B14q8qp: 0,+ Bcq6wej: 0,+ Byz1pjr: 0,+ kr9cjb: 0,+ Ff9ifp: "f1mljprk"+ },+ subtleSelected: {+ De3pzq: "f16xkysk",+ Bgfg5da: 0,+ B9xav0g: 0,+ oivjwe: 0,+ Bn0qgzm: 0,+ B4g9neb: 0,+ zhjwy3: 0,+ wvpqe5: 0,+ ibv6hh: 0,+ u1mtju: 0,+ h3c5rm: 0,+ vrafjx: 0,+ Bekrc4i: 0,+ i8vvqc: 0,+ g2u3we: 0,+ icvyot: 0,+ B4j52fo: 0,+ irswps: "f1c2pc3t",+ sj55zd: "faj9fo0",+ B95qlz1: "fsm7zmf",+ Eo63ln: 0,+ r9osk6: 0,+ Itrz8y: 0,+ zeg6vx: 0,+ l65xgk: 0,+ Bw4olcx: 0,+ Folb0i: 0,+ I2h8y4: 0,+ Bgxgoyi: 0,+ Bvlkotb: 0,+ Fwyncl: 0,+ Byh5edv: 0,+ Becqvjq: 0,+ uumbiq: 0,+ B73q3dg: 0,+ Bblwbaf: 0,+ B0ezav: "f1wo0sfq",+ r4wkhp: "f1afuynh",+ B7xitij: "f94ddyl",+ d3wsvi: 0,+ Hdqn7s: 0,+ zu5y1p: 0,+ owqphb: 0,+ g9c53k: 0,+ Btmu08z: 0,+ Bthxvy6: 0,+ gluvuq: 0,+ tb88gp: 0,+ wns6jk: 0,+ kdfdk4: 0,+ Bbw008l: 0,+ Bayi1ib: 0,+ B1kkfu3: 0,+ J1oqyp: 0,+ kem6az: 0,+ goa3yj: "fmle6oo",+ p743kt: "f1d3itm4",+ wmvzou: 0,+ sc4o1m: 0,+ wymq9i: 0,+ u9orzk: 0,+ puiv5t: 0,+ Bosien3: 0,+ b2z72d: 0,+ Beulxaw: 0,+ B57pkaw: 0,+ Jcjdmf: 0,+ B8qgbzl: 0,+ Bbmb0sr: 0,+ B14q8qp: 0,+ Bcq6wej: 0,+ Byz1pjr: 0,+ kr9cjb: 0,+ Ff9ifp: "f1e9l2u"+ },+ subtleDisabled: {+ De3pzq: "fhovq9v",+ sj55zd: "f1s2aq7o"+ },+ subtleDisabledSelected: {+ De3pzq: "f1bg9a2p",+ Bgfg5da: 0,+ B9xav0g: 0,+ oivjwe: 0,+ Bn0qgzm: 0,+ B4g9neb: 0,+ zhjwy3: 0,+ wvpqe5: 0,+ ibv6hh: 0,+ u1mtju: 0,+ h3c5rm: 0,+ vrafjx: 0,+ Bekrc4i: 0,+ i8vvqc: 0,+ g2u3we: 0,+ icvyot: 0,+ B4j52fo: 0,+ irswps: "fegtqic",+ sj55zd: "f1s2aq7o"+ },+ filled: {+ De3pzq: "f16xq7d1",+ sj55zd: "fkfq4zb",+ B95qlz1: "fwwxidx",+ r4wkhp: "f1fcoy83",+ B7xitij: "f14i52sd",+ p743kt: "f15qf7sh",+ Hhssn: "f1cpi5f4",+ uaurb9: "f6pj1s0",+ B401qx7: "f12sz5kj",+ Buyp1jb: "f17588c3",+ gsp74p: "fnthgdt"+ },+ filledSelected: {+ De3pzq: "ffp7eso",+ sj55zd: "f1phragk",+ B95qlz1: "f1lm9dni",+ r4wkhp: "f1mn5ei1",+ B7xitij: "f1g6ncd0",+ p743kt: "fl71aob",+ Gedr8k: "f14zl92z",+ Bm69vlq: "f16zy3eu",+ Bodipah: "f1gdgb7p",+ B5kpen0: "f1tua9ng"+ },+ filledDisabled: {+ De3pzq: "f1bg9a2p",+ sj55zd: "f1s2aq7o"+ },+ filledDisabledSelected: {+ De3pzq: "f1bg9a2p",+ Bgfg5da: 0,+ B9xav0g: 0,+ oivjwe: 0,+ Bn0qgzm: 0,+ B4g9neb: 0,+ zhjwy3: 0,+ wvpqe5: 0,+ ibv6hh: 0,+ u1mtju: 0,+ h3c5rm: 0,+ vrafjx: 0,+ Bekrc4i: 0,+ i8vvqc: 0,+ g2u3we: 0,+ icvyot: 0,+ B4j52fo: 0,+ irswps: "fegtqic",+ sj55zd: "f1s2aq7o"+ }+}, {+ d: [[".f44lkw9{border-radius:var(--borderRadiusCircular);}", {+ p: -1+ }], [".fp7rvkm{border:solid var(--strokeWidthThin) var(--colorTransparentStroke);}", {+ p: -2+ }], ".ftorr8m .fui-Tab__icon{color:inherit;}", ".f16lqpmv .fui-Tab__content{color:inherit;}", [".fzklhed{padding-block:calc(var(--spacingVerticalXXS) - var(--strokeWidthThin));}", {+ p: -1+ }], [".f1j721cc{padding-block:calc(var(--spacingVerticalSNudge) - var(--strokeWidthThin));}", {+ p: -1+ }], [".frx9knr{padding-block:calc(var(--spacingVerticalS) - var(--strokeWidthThin));}", {+ p: -1+ }], ".fhovq9v{background-color:var(--colorSubtleBackground);}", ".fkfq4zb{color:var(--colorNeutralForeground2);}", ".f1bifk9c:enabled:hover{background-color:var(--colorSubtleBackgroundHover);}", [".ft57sj0:enabled:hover{border:solid var(--strokeWidthThin) var(--colorNeutralStroke1Hover);}", {+ p: -2+ }], ".f1fcoy83:enabled:hover{color:var(--colorNeutralForeground2Hover);}", ".fo6hitd:enabled:active{background-color:var(--colorSubtleBackgroundPressed);}", [".fhn220o:enabled:active{border:solid var(--strokeWidthThin) var(--colorNeutralStroke1Pressed);}", {+ p: -2+ }], ".f15qf7sh:enabled:active{color:var(--colorNeutralForeground2Pressed);}", ".f16xkysk{background-color:var(--colorBrandBackground2);}", [".f1c2pc3t{border:solid var(--strokeWidthThin) var(--colorCompoundBrandStroke);}", {+ p: -2+ }], ".faj9fo0{color:var(--colorBrandForeground2);}", ".fsm7zmf:enabled:hover{background-color:var(--colorBrandBackground2Hover);}", [".f1wo0sfq:enabled:hover{border:solid var(--strokeWidthThin) var(--colorCompoundBrandStrokeHover);}", {+ p: -2+ }], ".f1afuynh:enabled:hover{color:var(--colorBrandForeground2Hover);}", ".f94ddyl:enabled:active{background-color:var(--colorBrandBackground2Pressed);}", [".fmle6oo:enabled:active{border:solid var(--strokeWidthThin) var(--colorCompoundBrandStrokePressed);}", {+ p: -2+ }], ".f1d3itm4:enabled:active{color:var(--colorBrandForeground2Pressed);}", ".f1s2aq7o{color:var(--colorNeutralForegroundDisabled);}", ".f1bg9a2p{background-color:var(--colorNeutralBackgroundDisabled);}", [".fegtqic{border:solid var(--strokeWidthThin) var(--colorNeutralStrokeDisabled);}", {+ p: -2+ }], ".f16xq7d1{background-color:var(--colorNeutralBackground3);}", ".fwwxidx:enabled:hover{background-color:var(--colorNeutralBackground3Hover);}", ".f14i52sd:enabled:active{background-color:var(--colorNeutralBackground3Pressed);}", ".ffp7eso{background-color:var(--colorBrandBackground);}", ".f1phragk{color:var(--colorNeutralForegroundOnBrand);}", ".f1lm9dni:enabled:hover{background-color:var(--colorBrandBackgroundHover);}", ".f1mn5ei1:enabled:hover{color:var(--colorNeutralForegroundOnBrand);}", ".f1g6ncd0:enabled:active{background-color:var(--colorBrandBackgroundPressed);}", ".fl71aob:enabled:active{color:var(--colorNeutralForegroundOnBrand);}", [".fegtqic{border:solid var(--strokeWidthThin) var(--colorNeutralStrokeDisabled);}", {+ p: -2+ }]],+ m: [["@media (forced-colors: active){.f1mljprk{border:solid var(--strokeWidthThin) Canvas;}}", {+ p: -2,+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1e9l2u{border:solid var(--strokeWidthThin) Highlight;}}", {+ p: -2,+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1cpi5f4:enabled:hover{background-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f6pj1s0:enabled:hover{forced-color-adjust:none;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f12sz5kj:enabled:hover .fui-Tab__content{color:HighlightText;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f17588c3:enabled:hover .fui-Icon-filled{color:HighlightText;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.fnthgdt:enabled:hover .fui-Icon-regular{color:HighlightText;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f14zl92z:enabled{background-color:ButtonText;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f16zy3eu:enabled .fui-Tab__content{color:ButtonFace;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1gdgb7p:enabled .fui-Tab__content{forced-color-adjust:none;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1tua9ng:enabled .fui-Tab__icon{color:ButtonFace;}}", {+ m: "(forced-colors: active)"+ }]]+}), $o = /* @__PURE__ */ m({+ base: {+ B8q5s1w: "f8hki3x",+ Bci5o5g: ["f1d2448m", "ffh67wi"],+ n8qw10: "f1bjia2o",+ Bdrgwmp: ["ffh67wi", "f1d2448m"],+ Bn4voq9: "f1p7hgxw",+ Bfpq7zp: "f1way5bb",+ g9k6zt: "f9znhxp",+ j6ew2k: ["fqa318h", "fqa318h"],+ Bhxq17a: "f1vjpng2"+ },+ circular: {+ B8q5s1w: "f8hki3x",+ Bci5o5g: ["f1d2448m", "ffh67wi"],+ n8qw10: "f1bjia2o",+ Bdrgwmp: ["ffh67wi", "f1d2448m"],+ Bn4voq9: "f1p7hgxw",+ Bfpq7zp: "f1way5bb",+ g9k6zt: "f9znhxp",+ j6ew2k: ["fzgyhws", "fqxug60"],+ Bhxq17a: "f1vjpng2"+ }+}, {+ d: [".f8hki3x[data-fui-focus-visible]{border-top-color:transparent;}", ".f1d2448m[data-fui-focus-visible]{border-right-color:transparent;}", ".ffh67wi[data-fui-focus-visible]{border-left-color:transparent;}", ".f1bjia2o[data-fui-focus-visible]{border-bottom-color:transparent;}", ".f1p7hgxw[data-fui-focus-visible]{outline-width:var(--strokeWidthThick);}", ".f1way5bb[data-fui-focus-visible]{outline-color:transparent;}", ".f9znhxp[data-fui-focus-visible]{outline-style:solid;}", ".fqa318h[data-fui-focus-visible]{box-shadow:var(--shadow4),0 0 0 var(--strokeWidthThick) var(--colorStrokeFocus2);}", ".f1vjpng2[data-fui-focus-visible]{z-index:1;}", ".fzgyhws[data-fui-focus-visible]{box-shadow:var(--shadow4),0 0 0 var(--strokeWidthThick) var(--colorStrokeFocus2),0 0 0 var(--strokeWidthThin) var(--colorNeutralStrokeOnBrand) inset;}", ".fqxug60[data-fui-focus-visible]{box-shadow:var(--shadow4),0 0 0 var(--strokeWidthThick) var(--colorStrokeFocus2),0 0 0 var(--strokeWidthThin) var(--colorNeutralStrokeOnBrand) inset;}"]+}), Jo = /* @__PURE__ */ m({+ base: {+ az7l2e: "fhw179n",+ vqofr: 0,+ Bv4n3vi: 0,+ Bgqb9hq: 0,+ B0uxbk8: 0,+ Bf3jju6: "fg9j5n4",+ amg5m6: "f1kmhr4c",+ zkfqfm: "fl1ydde",+ Bkydozb: "f1y7maxz",+ Bka2azo: 0,+ vzq8l0: 0,+ csmgbd: 0,+ Br4ovkg: 0,+ aelrif: "fceyvr4",+ y36c18: "f16cxu0",+ B1ctymy: "f1nwgacf",+ xzc5d: "fm6alxz",+ h5yqg8: "fhx32z1"+ },+ disabled: {+ az7l2e: "f1ut20fw",+ Bkydozb: "fhrzcfn",+ xzc5d: "fw15awd",+ h5yqg8: "faqmq51"+ },+ smallHorizontal: {+ lawp4y: "fchca7p",+ Baz25je: "f1r53b5e",+ Fbdkly: ["f1s6rxz5", "fo35v8s"],+ mdwyqc: ["fo35v8s", "f1s6rxz5"]+ },+ smallVertical: {+ lawp4y: "fze4zud",+ Fbdkly: ["f1fzr1x6", "f1f351id"],+ Bciustq: "fdp32p8",+ Ccq8qp: "f1aij3q"+ },+ mediumHorizontal: {+ lawp4y: "fchca7p",+ Baz25je: "f1s2r9ax",+ Fbdkly: ["f1o0nnkk", "fxb7rol"],+ mdwyqc: ["fxb7rol", "f1o0nnkk"]+ },+ mediumVertical: {+ lawp4y: "f17jracn",+ Fbdkly: ["f1fzr1x6", "f1f351id"],+ Bciustq: "f117lcb2",+ Ccq8qp: "f1aij3q"+ },+ largeHorizontal: {+ lawp4y: "fchca7p",+ Baz25je: "f1s2r9ax",+ Fbdkly: ["f1o0nnkk", "fxb7rol"],+ mdwyqc: ["fxb7rol", "f1o0nnkk"]+ },+ largeVertical: {+ lawp4y: "fel9d3z",+ Fbdkly: ["f1fzr1x6", "f1f351id"],+ Bciustq: "f6vqlre",+ Ccq8qp: "f1aij3q"+ }+}, {+ h: [".fhw179n:hover::before{background-color:var(--colorNeutralStroke1Hover);}", [".fg9j5n4:hover::before{border-radius:var(--borderRadiusCircular);}", {+ p: -1+ }], '.f1kmhr4c:hover::before{content:"";}', ".fl1ydde:hover::before{position:absolute;}", ".f1ut20fw:hover::before{background-color:var(--colorTransparentStroke);}"],+ a: [".f1y7maxz:active::before{background-color:var(--colorNeutralStroke1Pressed);}", [".fceyvr4:active::before{border-radius:var(--borderRadiusCircular);}", {+ p: -1+ }], '.f16cxu0:active::before{content:"";}', ".f1nwgacf:active::before{position:absolute;}", ".fhrzcfn:active::before{background-color:var(--colorTransparentStroke);}"],+ m: [["@media (forced-colors: active){.fm6alxz:hover::before{background-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.fhx32z1:active::before{background-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.fw15awd:hover::before{background-color:transparent;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.faqmq51:active::before{background-color:transparent;}}", {+ m: "(forced-colors: active)"+ }]],+ d: [".fchca7p::before{bottom:0;}", ".f1r53b5e::before{height:var(--strokeWidthThick);}", ".f1s6rxz5::before{left:var(--spacingHorizontalSNudge);}", ".fo35v8s::before{right:var(--spacingHorizontalSNudge);}", ".fze4zud::before{bottom:var(--spacingVerticalXS);}", ".f1fzr1x6::before{left:0;}", ".f1f351id::before{right:0;}", ".fdp32p8::before{top:var(--spacingVerticalXS);}", ".f1aij3q::before{width:var(--strokeWidthThicker);}", ".f1s2r9ax::before{height:var(--strokeWidthThicker);}", ".f1o0nnkk::before{left:var(--spacingHorizontalM);}", ".fxb7rol::before{right:var(--spacingHorizontalM);}", ".f17jracn::before{bottom:var(--spacingVerticalS);}", ".f117lcb2::before{top:var(--spacingVerticalS);}", ".fel9d3z::before{bottom:var(--spacingVerticalMNudge);}", ".f6vqlre::before{top:var(--spacingVerticalMNudge);}"]+}), Ko = /* @__PURE__ */ m({+ base: {+ Bjyk6c5: "f1rp0jgh",+ d9w3h3: 0,+ B3778ie: 0,+ B4j8arr: 0,+ Bl18szs: 0,+ Blrzh8d: "f3b9emi",+ Bsft5z2: "f13zj6fq",+ E3zdtr: "f1mdlcz9"+ },+ selected: {+ Bjyk6c5: "f1ksivud",+ Bej4dhw: "f1476jrx",+ B7wqxwa: "f18q216b",+ Hwb57: "f1wf6u82",+ Beg08s0: "f1xwit7m",+ Bo27r1v: "f1ksfgwi"+ },+ disabled: {+ Bjyk6c5: "f13lkzet"+ },+ smallHorizontal: {+ By385i5: "fo72kxq",+ Dlnsje: "f9bb2ob",+ Eqx8gd: ["f1q70ajw", "f18rbzdx"],+ B1piin3: ["f18rbzdx", "f1q70ajw"]+ },+ smallVertical: {+ By385i5: "fqbue9b",+ Eqx8gd: ["f1n6gb5g", "f15yvnhg"],+ bn5sak: "fk1klkt",+ a2br6o: "f1o25lip"+ },+ mediumHorizontal: {+ By385i5: "fo72kxq",+ Dlnsje: "f1vx7lu8",+ Eqx8gd: ["fna7m5n", "f1oxpfwv"],+ B1piin3: ["f1oxpfwv", "fna7m5n"]+ },+ mediumVertical: {+ By385i5: "fipylg0",+ Eqx8gd: ["f1n6gb5g", "f15yvnhg"],+ bn5sak: "fqchiol",+ a2br6o: "f1o25lip"+ },+ largeHorizontal: {+ By385i5: "fo72kxq",+ Dlnsje: "f1vx7lu8",+ Eqx8gd: ["fna7m5n", "f1oxpfwv"],+ B1piin3: ["f1oxpfwv", "fna7m5n"]+ },+ largeVertical: {+ By385i5: "f1w7dm5g",+ Eqx8gd: ["f1n6gb5g", "f15yvnhg"],+ bn5sak: "f1p6em4m",+ a2br6o: "f1o25lip"+ }+}, {+ d: [".f1rp0jgh::after{background-color:var(--colorTransparentStroke);}", [".f3b9emi::after{border-radius:var(--borderRadiusCircular);}", {+ p: -1+ }], '.f13zj6fq::after{content:"";}', ".f1mdlcz9::after{position:absolute;}", ".f1ksivud::after{background-color:var(--colorCompoundBrandStroke);}", ".f1476jrx:enabled:hover::after{background-color:var(--colorCompoundBrandStrokeHover);}", ".f18q216b:enabled:active::after{background-color:var(--colorCompoundBrandStrokePressed);}", ".f13lkzet::after{background-color:var(--colorNeutralForegroundDisabled);}", ".fo72kxq::after{bottom:0;}", ".f9bb2ob::after{height:var(--strokeWidthThick);}", ".f1q70ajw::after{left:var(--spacingHorizontalSNudge);}", ".f18rbzdx::after{right:var(--spacingHorizontalSNudge);}", ".fqbue9b::after{bottom:var(--spacingVerticalXS);}", ".f1n6gb5g::after{left:0;}", ".f15yvnhg::after{right:0;}", ".fk1klkt::after{top:var(--spacingVerticalXS);}", ".f1o25lip::after{width:var(--strokeWidthThicker);}", ".f1vx7lu8::after{height:var(--strokeWidthThicker);}", ".fna7m5n::after{left:var(--spacingHorizontalM);}", ".f1oxpfwv::after{right:var(--spacingHorizontalM);}", ".fipylg0::after{bottom:var(--spacingVerticalS);}", ".fqchiol::after{top:var(--spacingVerticalS);}", ".f1w7dm5g::after{bottom:var(--spacingVerticalMNudge);}", ".f1p6em4m::after{top:var(--spacingVerticalMNudge);}"],+ m: [["@media (forced-colors: active){.f1wf6u82::after{background-color:ButtonText;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1xwit7m:enabled:hover::after{background-color:ButtonText;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1ksfgwi:enabled:active::after{background-color:ButtonText;}}", {+ m: "(forced-colors: active)"+ }]]+}), Yo = /* @__PURE__ */ m({+ base: {+ Br312pm: "fwpfdsa",+ Ijaq50: "f16hsg94",+ Bt984gj: "f122n59",+ mc9l5x: "ftuwxu6",+ Brf1p80: "f4d9j23",+ B68tc82: 0,+ Bmxbyg5: 0,+ Bpg54ce: "f1a3p1vp",+ D0sxk3: "f16u1re",+ t6yez3: "f8bsbmo"+ },+ small: {+ Be2twd7: "fe5j1ua",+ Bqenvij: "fjamq6b",+ a9b677: "f64fuq3"+ },+ medium: {+ Be2twd7: "fe5j1ua",+ Bqenvij: "fjamq6b",+ a9b677: "f64fuq3"+ },+ large: {+ Be2twd7: "f1rt2boy",+ Bqenvij: "frvgh55",+ a9b677: "fq4mcun"+ },+ selected: {+ D0sxk3: "fxoiby5",+ t6yez3: "f15q0o9g"+ }+}, {+ d: [".fwpfdsa{grid-column-start:1;}", ".f16hsg94{grid-row-start:1;}", ".f122n59{align-items:center;}", ".ftuwxu6{display:inline-flex;}", ".f4d9j23{justify-content:center;}", [".f1a3p1vp{overflow:hidden;}", {+ p: -1+ }], ".f16u1re .fui-Icon-filled{display:none;}", ".f8bsbmo .fui-Icon-regular{display:inline;}", ".fe5j1ua{font-size:20px;}", ".fjamq6b{height:20px;}", ".f64fuq3{width:20px;}", ".f1rt2boy{font-size:24px;}", ".frvgh55{height:24px;}", ".fq4mcun{width:24px;}", ".fxoiby5 .fui-Icon-filled{display:inline;}", ".f15q0o9g .fui-Icon-regular{display:none;}"]+}), Qo = /* @__PURE__ */ m({+ base: {+ Bahqtrf: "fk6fouc",+ Be2twd7: "fkhj508",+ Bhrd7zp: "figsok6",+ Bg96gwp: "f1i3iumi",+ B68tc82: 0,+ Bmxbyg5: 0,+ Bpg54ce: "f1a3p1vp",+ Byoj8tv: 0,+ uwmqm3: 0,+ z189sj: 0,+ z8tnut: 0,+ B0ocmuz: "f1bwptpd"+ },+ selected: {+ Bahqtrf: "fk6fouc",+ Be2twd7: "fkhj508",+ Bhrd7zp: "fl43uef",+ Bg96gwp: "f1i3iumi"+ },+ large: {+ Bahqtrf: "fk6fouc",+ Be2twd7: "fod5ikn",+ Bhrd7zp: "figsok6",+ Bg96gwp: "faaz57k"+ },+ largeSelected: {+ Bahqtrf: "fk6fouc",+ Be2twd7: "fod5ikn",+ Bhrd7zp: "fl43uef",+ Bg96gwp: "faaz57k"+ },+ noIconBefore: {+ Br312pm: "fwpfdsa",+ Ijaq50: "f16hsg94"+ },+ iconBefore: {+ Br312pm: "fd46tj4",+ Ijaq50: "f16hsg94"+ },+ placeholder: {+ Bcdw1i0: "fd7fpy0"+ }+}, {+ d: [".fk6fouc{font-family:var(--fontFamilyBase);}", ".fkhj508{font-size:var(--fontSizeBase300);}", ".figsok6{font-weight:var(--fontWeightRegular);}", ".f1i3iumi{line-height:var(--lineHeightBase300);}", [".f1a3p1vp{overflow:hidden;}", {+ p: -1+ }], [".f1bwptpd{padding:var(--spacingVerticalNone) var(--spacingHorizontalXXS);}", {+ p: -1+ }], ".fl43uef{font-weight:var(--fontWeightSemibold);}", ".fod5ikn{font-size:var(--fontSizeBase400);}", ".faaz57k{line-height:var(--lineHeightBase400);}", ".fwpfdsa{grid-column-start:1;}", ".f16hsg94{grid-row-start:1;}", ".fd46tj4{grid-column-start:2;}", ".fd7fpy0{visibility:hidden;}"]+}), Zo = (e) => {+ "use no memo";+ return ea(e), ra(e, e.root), oa(e), e;+}, ea = (e) => {+ "use no memo";+ const o = Te(), r = Jo(), a = Ko(), {+ appearance: t,+ disabled: n,+ selected: c,+ size: l,+ vertical: f+ } = e, i = [Z.root, o.root];+ return t !== "subtle-circular" && t !== "filled-circular" && i.push(+ // pending indicator (before pseudo element)+ r.base,+ l === "small" && (f ? r.smallVertical : r.smallHorizontal),+ l === "medium" && (f ? r.mediumVertical : r.mediumHorizontal),+ l === "large" && (f ? r.largeVertical : r.largeHorizontal),+ n && r.disabled,+ // active indicator (after pseudo element)+ c && a.base,+ c && !n && a.selected,+ c && l === "small" && (f ? a.smallVertical : a.smallHorizontal),+ c && l === "medium" && (f ? a.mediumVertical : a.mediumHorizontal),+ c && l === "large" && (f ? a.largeVertical : a.largeHorizontal),+ c && n && a.disabled+ ), e.root.className = b(...i, e.root.className), Oo(e), e;+}, ra = (e, o) => {+ "use no memo";+ const r = Te(), a = $o(), t = Uo(), {+ appearance: n,+ disabled: c,+ selected: l,+ size: f,+ vertical: i+ } = e, s = n === "subtle-circular", d = n === "filled-circular", v = s || d, p = [+ t.base,+ a.circular,+ // sizes+ f === "small" && t.small,+ f === "medium" && t.medium,+ f === "large" && t.large,+ // subtle-circular appearance+ s && t.subtle,+ l && s && t.subtleSelected,+ c && s && t.subtleDisabled,+ l && c && s && t.subtleDisabledSelected,+ // filled-circular appearance+ d && t.filled,+ l && d && t.filledSelected,+ c && d && t.filledDisabled,+ l && c && d && t.filledDisabledSelected+ ], h = [a.base, !c && n === "subtle" && r.subtle, !c && n === "transparent" && r.transparent, !c && l && r.selected, c && r.disabled];+ return o.className = b(+ r.button,+ // orientation+ i ? r.vertical : r.horizontal,+ // size+ f === "small" && (i ? r.smallVertical : r.smallHorizontal),+ f === "medium" && (i ? r.mediumVertical : r.mediumHorizontal),+ f === "large" && (i ? r.largeVertical : r.largeHorizontal),+ ...v ? p : h,+ c && r.disabledCursor,+ o.className+ ), e;+}, oa = (e) => {+ "use no memo";+ const o = Yo(), r = Qo(), {+ selected: a,+ size: t+ } = e;+ return e.icon && (e.icon.className = b(Z.icon, o.base, o[t], a && o.selected, e.icon.className)), e.contentReservedSpace && (e.contentReservedSpace.className = b(Xo.content, r.base, t === "large" ? r.largeSelected : r.selected, e.icon ? r.iconBefore : r.noIconBefore, r.placeholder, e.content.className), e.contentReservedSpaceClassName = e.contentReservedSpace.className), e.content.className = b(Z.content, r.base, t === "large" && r.large, a && (t === "large" ? r.largeSelected : r.selected), e.icon ? r.iconBefore : r.noIconBefore, e.content.className), e;+}, ee = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = Lo(e, o);+ return Zo(r), A("useTabStyles_unstable")(r), Wo(r);+});+ee.displayName = "Tab";+const aa = (e, { referenceLabel: o, referenceId: r }, a) => {+ const { checkbox: t = {}, onSelectionChange: n, floatingAction: c, onClick: l, onKeyDown: f, disabled: i } = e, { findAllFocusable: s } = Oe(), d = g.useRef(null), [v, p] = ke({+ state: e.selected,+ defaultState: e.defaultSelected,+ initialState: !1+ }), h = [+ e.selected,+ e.defaultSelected,+ n+ ].some((S) => typeof S < "u"), [j, y] = g.useState(!1), B = g.useCallback((S) => {+ if (!a.current)+ return !1;+ const w = s(a.current), fe = S.target, Re = w.some((Le) => Le.contains(fe)), Ie = d?.current === fe;+ return Re && !Ie;+ }, [+ a,+ s+ ]), q = g.useCallback((S) => {+ if (i || B(S))+ return;+ const w = !v;+ p(w), n && n(S, {+ selected: w+ });+ }, [+ i,+ n,+ v,+ p,+ B+ ]), x = g.useCallback((S) => {+ [+ Xe+ ].includes(S.key) && (S.preventDefault(), q(S));+ }, [+ q+ ]), T = g.useMemo(() => {+ if (!h || c)+ return;+ const S = {};+ return r ? S["aria-labelledby"] = r : o && (S["aria-label"] = o), z(t, {+ defaultProps: {+ ref: d,+ type: "checkbox",+ checked: v,+ disabled: i,+ onChange: (w) => q(w),+ onFocus: () => y(!0),+ onBlur: () => y(!1),+ ...S+ },+ elementType: "input"+ });+ }, [+ t,+ i,+ c,+ v,+ h,+ q,+ r,+ o+ ]), _ = g.useMemo(() => {+ if (c)+ return z(c, {+ defaultProps: {+ ref: d+ },+ elementType: "div"+ });+ }, [+ c+ ]), M = g.useMemo(() => h ? {+ onClick: I(l, q),+ onKeyDown: I(f, x)+ } : null, [+ h,+ q,+ l,+ f,+ x+ ]);+ return {+ selected: v,+ selectable: h,+ selectFocused: j,+ selectableCardProps: M,+ checkboxSlot: T,+ floatingActionSlot: _+ };+}, Pe = g.createContext(void 0), re = {+ selectableA11yProps: {+ referenceId: void 0,+ setReferenceId() {+ },+ referenceLabel: void 0,+ setReferenceLabel() {+ }+ }+}, ta = Pe.Provider, Ne = () => {+ var e;+ return (e = g.useContext(Pe)) !== null && e !== void 0 ? e : re;+}, ia = {+ off: void 0,+ "no-tab": "limited-trap-focus",+ "tab-exit": "limited",+ "tab-only": "unlimited"+}, na = ({ focusMode: e, disabled: o = !1, ...r }) => {+ const a = [+ "onClick",+ "onDoubleClick",+ "onMouseUp",+ "onMouseDown",+ "onPointerUp",+ "onPointerDown",+ "onTouchStart",+ "onTouchEnd",+ "onDragStart",+ "onDragEnd"+ ].some((c) => r[c]), t = e ?? (a ? "no-tab" : "off"), n = $e({+ tabBehavior: ia[t]+ });+ return o ? {+ interactive: !1,+ focusAttributes: null+ } : t === "off" ? {+ interactive: a,+ focusAttributes: null+ } : {+ interactive: a,+ focusAttributes: {+ ...n,+ tabIndex: 0+ }+ };+}, la = (e, o) => {+ const { appearance: r = "filled", orientation: a = "vertical", size: t = "medium", ...n } = e;+ return {+ ...fa(n, o),+ appearance: r,+ orientation: a,+ size: t+ };+}, fa = (e, o) => {+ const { disabled: r = !1, ...a } = e, [t, n] = g.useState(re.selectableA11yProps.referenceId), [c, l] = g.useState(re.selectableA11yProps.referenceId), f = Ue(), { selectable: i, selected: s, selectableCardProps: d, selectFocused: v, checkboxSlot: p, floatingActionSlot: h } = aa(e, {+ referenceId: t,+ referenceLabel: c+ }, f), j = U(f, o), { interactive: y, focusAttributes: B } = na(e);+ let q = {+ ...i ? null : B,+ ...a,+ ...d+ };+ return r && (q = {+ ...a,+ "aria-disabled": !0,+ onClick: void 0+ }), {+ interactive: y,+ selectable: i,+ selectFocused: v,+ selected: s,+ disabled: r,+ selectableA11yProps: {+ setReferenceId: n,+ referenceId: t,+ referenceLabel: c,+ setReferenceLabel: l+ },+ components: {+ root: "div",+ floatingAction: "div",+ checkbox: "input"+ },+ root: C(V("div", {+ ref: j,+ role: "group",+ ...q+ }), {+ elementType: "div"+ }),+ floatingAction: h,+ checkbox: p+ };+}, ca = (e, o) => /* @__PURE__ */ k(e.root, {+ children: /* @__PURE__ */ D(ta, {+ value: o,+ children: [+ e.checkbox ? /* @__PURE__ */ k(e.checkbox, {}) : null,+ e.floatingAction ? /* @__PURE__ */ k(e.floatingAction, {}) : null,+ e.root.children+ ]+ })+}), oe = {+ root: "fui-CardPreview",+ logo: "fui-CardPreview__logo"+}, sa = /* @__PURE__ */ m({+ root: {+ qhf8xq: "f10pi13n",+ Byfpedg: "fgourly",+ Btj6oj6: "f1vui7lx",+ B1m4t4s: "fda5zwx"+ },+ logo: {+ qhf8xq: "f1euv43f",+ B5kzvoi: "f1gcvs1y",+ oyh7mz: ["f1t6tvco", "ffrfxm3"],+ a9b677: "f1szoe96",+ Bqenvij: "f1d2rq10"+ }+}, {+ d: [".f10pi13n{position:relative;}", ".fgourly>:not(.fui-CardPreview__logo){display:block;}", ".f1vui7lx>:not(.fui-CardPreview__logo){height:100%;}", ".fda5zwx>:not(.fui-CardPreview__logo){width:100%;}", ".f1euv43f{position:absolute;}", ".f1gcvs1y{bottom:12px;}", ".f1t6tvco{left:12px;}", ".ffrfxm3{right:12px;}", ".f1szoe96{width:32px;}", ".f1d2rq10{height:32px;}"]+}), da = (e) => {+ "use no memo";+ const o = sa();+ return e.root.className = b(oe.root, o.root, e.root.className), e.logo && (e.logo.className = b(oe.logo, o.logo, e.logo.className)), e;+}, Ae = {+ root: "fui-CardHeader",+ image: "fui-CardHeader__image",+ header: "fui-CardHeader__header",+ description: "fui-CardHeader__description",+ action: "fui-CardHeader__action"+}, ua = /* @__PURE__ */ m({+ root: {+ Bkc6ea2: "fkufhic",+ Bt984gj: "f122n59"+ },+ image: {+ mc9l5x: "ftuwxu6",+ t21cq0: ["fql5097", "f6yss9k"]+ },+ header: {+ mc9l5x: "f22iagw"+ },+ description: {+ mc9l5x: "f22iagw"+ },+ action: {+ Frg6f3: ["f6yss9k", "fql5097"],+ rjrqlh: "fs9eatd",+ Boue1pl: ["fxoo9ru", "f1g0ekvh"],+ Bhz1vi0: "f1m6zfxz",+ etxrgc: ["f1g0ekvh", "fxoo9ru"],+ Bdua9ef: "f1sret3r",+ cbfxhg: "fs4gbcv"+ }+}, {+ d: [".fkufhic{--fui-CardHeader--gap:12px;}", ".f122n59{align-items:center;}", ".ftuwxu6{display:inline-flex;}", ".fql5097{margin-right:var(--fui-CardHeader--gap);}", ".f6yss9k{margin-left:var(--fui-CardHeader--gap);}", ".f22iagw{display:flex;}"],+ m: [["@media (forced-colors: active){.fs9eatd .fui-Button,.fs9eatd .fui-Link{border-top-color:currentColor;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1g0ekvh .fui-Button,.f1g0ekvh .fui-Link{border-left-color:currentColor;}.fxoo9ru .fui-Button,.fxoo9ru .fui-Link{border-right-color:currentColor;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1m6zfxz .fui-Button,.f1m6zfxz .fui-Link{border-bottom-color:currentColor;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1sret3r .fui-Button,.f1sret3r .fui-Link{color:currentColor;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.fs4gbcv .fui-Button,.fs4gbcv .fui-Link{outline-color:currentColor;}}", {+ m: "(forced-colors: active)"+ }]]+}), va = /* @__PURE__ */ m({+ root: {+ mc9l5x: "f13qh94s",+ t4k1zu: "f8a668j"+ },+ image: {+ Br312pm: "fwpfdsa",+ Ijaq50: "fldnz9j"+ },+ header: {+ Br312pm: "fd46tj4",+ Ijaq50: "f16hsg94"+ },+ description: {+ Br312pm: "fd46tj4",+ Ijaq50: "faunodf"+ },+ action: {+ Br312pm: "fis13di",+ Ijaq50: "fldnz9j"+ }+}, {+ d: [".f13qh94s{display:grid;}", ".f8a668j{grid-auto-columns:min-content 1fr min-content;}", ".fwpfdsa{grid-column-start:1;}", ".fldnz9j{grid-row-start:span 2;}", ".fd46tj4{grid-column-start:2;}", ".f16hsg94{grid-row-start:1;}", ".faunodf{grid-row-start:2;}", ".fis13di{grid-column-start:3;}"]+}), ga = /* @__PURE__ */ m({+ root: {+ mc9l5x: "f22iagw"+ },+ header: {+ Bh6795r: "fqerorx"+ },+ image: {},+ description: {},+ action: {}+}, {+ d: [".f22iagw{display:flex;}", ".fqerorx{flex-grow:1;}"]+}), pa = (e) => {+ "use no memo";+ const o = ua(), r = va(), a = ga(), t = e.description ? r : a, n = (c) => {+ var l;+ return b(Ae[c], o[c], t[c], (l = e[c]) === null || l === void 0 ? void 0 : l.className);+ };+ return e.root.className = n("root"), e.image && (e.image.className = n("image")), e.header && (e.header.className = n("header")), e.description && (e.description.className = n("description")), e.action && (e.action.className = n("action")), e;+}, ve = {+ root: "fui-CardFooter",+ action: "fui-CardFooter__action"+}, ba = /* @__PURE__ */ m({+ root: {+ mc9l5x: "f22iagw",+ Beiy3e4: "f1063pyq",+ i8kkvl: 0,+ Belr9w4: 0,+ rmohyg: "fsbu5mz"+ },+ action: {+ Frg6f3: ["fcgxt0o", "f1ujusj6"],+ rjrqlh: "fs9eatd",+ Boue1pl: ["fxoo9ru", "f1g0ekvh"],+ Bhz1vi0: "f1m6zfxz",+ etxrgc: ["f1g0ekvh", "fxoo9ru"],+ Bdua9ef: "f1sret3r",+ cbfxhg: "fs4gbcv"+ }+}, {+ d: [".f22iagw{display:flex;}", ".f1063pyq{flex-direction:row;}", [".fsbu5mz{gap:12px;}", {+ p: -1+ }], ".fcgxt0o{margin-left:auto;}", ".f1ujusj6{margin-right:auto;}"],+ m: [["@media (forced-colors: active){.fs9eatd .fui-Button,.fs9eatd .fui-Link{border-top-color:currentColor;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1g0ekvh .fui-Button,.f1g0ekvh .fui-Link{border-left-color:currentColor;}.fxoo9ru .fui-Button,.fxoo9ru .fui-Link{border-right-color:currentColor;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1m6zfxz .fui-Button,.f1m6zfxz .fui-Link{border-bottom-color:currentColor;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1sret3r .fui-Button,.f1sret3r .fui-Link{color:currentColor;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.fs4gbcv .fui-Button,.fs4gbcv .fui-Link{outline-color:currentColor;}}", {+ m: "(forced-colors: active)"+ }]]+}), ha = (e) => {+ "use no memo";+ const o = ba();+ return e.root.className = b(ve.root, o.root, e.root.className), e.action && (e.action.className = b(ve.action, o.action, e.action.className)), e;+}, K = {+ root: "fui-Card",+ floatingAction: "fui-Card__floatingAction",+ checkbox: "fui-Card__checkbox"+}, ma = /* @__PURE__ */ H("rfxo2k2", "rgle7w9", [".rfxo2k2{overflow:hidden;border-radius:var(--fui-Card--border-radius);padding:var(--fui-Card--size);gap:var(--fui-Card--size);display:flex;position:relative;box-sizing:border-box;color:var(--colorNeutralForeground1);}", '.rfxo2k2::after{position:absolute;top:0;left:0;right:0;bottom:0;content:"";pointer-events:none;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-width:var(--strokeWidthThin);border-right-width:var(--strokeWidthThin);border-bottom-width:var(--strokeWidthThin);border-left-width:var(--strokeWidthThin);border-radius:var(--fui-Card--border-radius);}', ".rfxo2k2>.fui-CardHeader,.rfxo2k2>.fui-CardFooter{flex-shrink:0;}", ".rgle7w9{overflow:hidden;border-radius:var(--fui-Card--border-radius);padding:var(--fui-Card--size);gap:var(--fui-Card--size);display:flex;position:relative;box-sizing:border-box;color:var(--colorNeutralForeground1);}", '.rgle7w9::after{position:absolute;top:0;right:0;left:0;bottom:0;content:"";pointer-events:none;border-top-style:solid;border-left-style:solid;border-bottom-style:solid;border-right-style:solid;border-top-width:var(--strokeWidthThin);border-left-width:var(--strokeWidthThin);border-bottom-width:var(--strokeWidthThin);border-right-width:var(--strokeWidthThin);border-radius:var(--fui-Card--border-radius);}', ".rgle7w9>.fui-CardHeader,.rgle7w9>.fui-CardFooter{flex-shrink:0;}"]), ka = /* @__PURE__ */ m({+ focused: {+ Brovlpu: "ftqa4ok",+ B486eqv: "f2hkw1w",+ B8q5s1w: "f8hki3x",+ Bci5o5g: ["f1d2448m", "ffh67wi"],+ n8qw10: "f1bjia2o",+ Bdrgwmp: ["ffh67wi", "f1d2448m"],+ Bqhya38: "f1j6vpng",+ Bwxa6fj: ["f1pniga2", "f1ffjurs"],+ Bdhvstf: "f987i1v",+ B7zbvrb: ["f1ffjurs", "f1pniga2"],+ Bm4h7ae: "f15bsgw9",+ B7ys5i9: "f14e48fq",+ Busjfv9: "f18yb2kv",+ Bhk32uz: "fd6o370",+ f6g5ot: 0,+ Boxcth7: 0,+ Bhdgwq3: 0,+ hgwjuy: 0,+ Bshpdp8: 0,+ Bsom6fd: 0,+ Blkhhs4: 0,+ Bonggc9: 0,+ Ddfuxk: 0,+ i03rao: 0,+ kclons: 0,+ clg4pj: 0,+ Bpqj9nj: 0,+ B6dhp37: 0,+ Bf4ptjt: 0,+ Bqtpl0w: 0,+ i4rwgc: "fpqizxz",+ Dah5zi: 0,+ B1tsrr9: 0,+ qqdqy8: 0,+ Bkh64rk: 0,+ e3fwne: "fnd8nzh",+ J0r882: "f15fr7a0",+ Bule8hv: ["fwsq40z", "fy0y4wt"],+ Bjwuhne: "f34ld9f",+ Ghsupd: ["fy0y4wt", "fwsq40z"]+ },+ selectableFocused: {+ Brovlpu: "ftqa4ok",+ B486eqv: "f2hkw1w",+ Bssx7fj: "f1b1k54r",+ uh7if5: ["f4ne723", "fqqcjud"],+ clntm0: "fh7aioi",+ Dlk2r6: ["fqqcjud", "f4ne723"],+ h6p2u: "f1ufm4qn",+ I6qiy5: ["f1qnwcb4", "fgrk5zm"],+ yzno9d: "fi52z01",+ By0wis0: ["fgrk5zm", "f1qnwcb4"],+ B2j2mmj: "ffht0p2",+ wigs8: "f1p0ul1q",+ pbfy6t: "f1c901ms",+ B0v4ure: "f1alokd7",+ Byrf0fs: 0,+ Bsiemmq: 0,+ Bwckmig: 0,+ skfxo0: 0,+ Iidy0u: 0,+ B98u21t: 0,+ Bvwlmkc: 0,+ jo1ztg: 0,+ Ba1iezr: 0,+ Blmvk6g: 0,+ B24cy0v: 0,+ Bil7v7r: 0,+ Br3gin4: 0,+ nr063g: 0,+ ghq09: 0,+ Bbgo44z: 0,+ Bseh09z: "f1i978nd",+ az1dzo: 0,+ Ba3ybja: 0,+ B6352mv: 0,+ vppk2z: 0,+ Biaj6j7: "f1nh8hsq",+ B2pnrqr: "f1amxum7",+ B29w5g4: ["f1cec8w7", "f554mv0"],+ Bhhzhcn: "f1sj6kbr",+ Bec0n69: ["f554mv0", "f1cec8w7"]+ },+ orientationHorizontal: {+ Beiy3e4: "f1063pyq",+ Bt984gj: "f122n59",+ Binpb3b: "ftrw7vg",+ qrt8p2: "f18opajm",+ k6ws3r: ["f13002it", "fqo182t"],+ Btcwela: ["f18yna97", "f1kd6wh7"],+ Fer9m8: "f4i4759"+ },+ orientationVertical: {+ Beiy3e4: "f1vx9l62",+ B5nvv7i: ["f14k419y", "f1fgo9fz"],+ Baxg94k: ["f1fgo9fz", "f14k419y"],+ tn21ii: "fvqmfsm",+ B0ud6bj: "f3am6yf",+ Bgdo4j: "f1r5wgso"+ },+ sizeSmall: {+ B7balbw: "f1pi9uxy",+ B1h88n7: "f1h1zgly"+ },+ sizeMedium: {+ B7balbw: "frsmuga",+ B1h88n7: "fuldkky"+ },+ sizeLarge: {+ B7balbw: "f1qua4xo",+ B1h88n7: "fimkt6v"+ },+ interactive: {+ rhjd8f: "f1epqm3e"+ },+ filled: {+ De3pzq: "fxugw4r",+ E5pizo: "f1whvlc6",+ B0n5ga8: "f16gxe2i",+ s924m2: ["fpgykix", "fzybk4o"],+ B1q35kw: "f1osi826",+ Gp14am: ["fzybk4o", "fpgykix"]+ },+ filledInteractive: {+ Bceei9c: "f1k6fduh",+ De3pzq: "fxugw4r",+ E5pizo: "f1whvlc6",+ B0n5ga8: "f16gxe2i",+ s924m2: ["fpgykix", "fzybk4o"],+ B1q35kw: "f1osi826",+ Gp14am: ["fzybk4o", "fpgykix"],+ Bi91k9c: "feu1g3u",+ Jwef8y: "f1knas48",+ Bvxd0ez: "f1m145df",+ ecr2s2: "fb40n2d"+ },+ filledInteractiveSelected: {+ De3pzq: "f1nfm20t",+ B0n5ga8: "f16eln5f",+ s924m2: ["fa2okxs", "fg4zq3l"],+ B1q35kw: "ff6932p",+ Gp14am: ["fg4zq3l", "fa2okxs"],+ Bi91k9c: "fx9teim",+ Jwef8y: "f1kz6goq"+ },+ filledAlternative: {+ De3pzq: "f1dmdbja",+ E5pizo: "f1whvlc6",+ B0n5ga8: "f16gxe2i",+ s924m2: ["fpgykix", "fzybk4o"],+ B1q35kw: "f1osi826",+ Gp14am: ["fzybk4o", "fpgykix"]+ },+ filledAlternativeInteractive: {+ Bceei9c: "f1k6fduh",+ De3pzq: "f1dmdbja",+ E5pizo: "f1whvlc6",+ B0n5ga8: "f16gxe2i",+ s924m2: ["fpgykix", "fzybk4o"],+ B1q35kw: "f1osi826",+ Gp14am: ["fzybk4o", "fpgykix"],+ Bi91k9c: "fnwyq0v",+ Jwef8y: "f1uvynv3",+ Bvxd0ez: "f1m145df",+ ecr2s2: "f1yhgkbh"+ },+ filledAlternativeInteractiveSelected: {+ De3pzq: "fjxa0vh",+ B0n5ga8: "f16eln5f",+ s924m2: ["fa2okxs", "fg4zq3l"],+ B1q35kw: "ff6932p",+ Gp14am: ["fg4zq3l", "fa2okxs"],+ Bi91k9c: "f1luvkty",+ Jwef8y: "fehi0vp"+ },+ outline: {+ De3pzq: "f1c21dwh",+ E5pizo: "f1couhl3",+ B0n5ga8: "ft83z1f",+ s924m2: ["f1g4150c", "f192dr6e"],+ B1q35kw: "f1qnawh6",+ Gp14am: ["f192dr6e", "f1g4150c"]+ },+ outlineInteractive: {+ Bceei9c: "f1k6fduh",+ De3pzq: "f1c21dwh",+ E5pizo: "f1couhl3",+ B0n5ga8: "ft83z1f",+ s924m2: ["f1g4150c", "f192dr6e"],+ B1q35kw: "f1qnawh6",+ Gp14am: ["f192dr6e", "f1g4150c"],+ Bi91k9c: "feu1g3u",+ Jwef8y: "fjxutwb",+ Be0v6ae: "f1llr77y",+ B5kxglz: ["fzk0khw", "fjj8tog"],+ B3pwyw6: "fb1u8ub",+ Bymgtzf: ["fjj8tog", "fzk0khw"],+ ecr2s2: "fophhak",+ dmfk: "f1uohb70",+ B4ofi8: ["f1jm7v1n", "f1bus3rq"],+ jgq6uv: "f1fbu7rr",+ Baxewws: ["f1bus3rq", "f1jm7v1n"]+ },+ outlineInteractiveSelected: {+ De3pzq: "f1q9pm1r",+ B0n5ga8: "f16eln5f",+ s924m2: ["fa2okxs", "fg4zq3l"],+ B1q35kw: "ff6932p",+ Gp14am: ["fg4zq3l", "fa2okxs"],+ Bi91k9c: "fx9teim",+ Jwef8y: "fg59vm4"+ },+ outlineDisabled: {+ De3pzq: "f1c21dwh",+ E5pizo: "f1couhl3",+ g2u3we: "f1jj8ep1",+ h3c5rm: ["f15xbau", "fy0fskl"],+ B9xav0g: "f4ikngz",+ zhjwy3: ["fy0fskl", "f15xbau"],+ ezxybo: "f1ls5moo",+ wc7uws: "f1qiza15",+ B0n5ga8: "f13dj02",+ s924m2: ["f9wngki", "f17v59j0"],+ B1q35kw: "f1vxzwsp",+ Gp14am: ["f17v59j0", "f9wngki"]+ },+ subtle: {+ De3pzq: "fhovq9v",+ E5pizo: "f1couhl3",+ B0n5ga8: "f16gxe2i",+ s924m2: ["fpgykix", "fzybk4o"],+ B1q35kw: "f1osi826",+ Gp14am: ["fzybk4o", "fpgykix"]+ },+ subtleInteractive: {+ Bceei9c: "f1k6fduh",+ De3pzq: "fhovq9v",+ E5pizo: "f1couhl3",+ B0n5ga8: "f16gxe2i",+ s924m2: ["fpgykix", "fzybk4o"],+ B1q35kw: "f1osi826",+ Gp14am: ["fzybk4o", "fpgykix"],+ Bi91k9c: "feu1g3u",+ Jwef8y: "f1t94bn6",+ ecr2s2: "f1wfn5kd"+ },+ subtleInteractiveSelected: {+ De3pzq: "fq5gl1p",+ B0n5ga8: "f16eln5f",+ s924m2: ["fa2okxs", "fg4zq3l"],+ B1q35kw: "ff6932p",+ Gp14am: ["fg4zq3l", "fa2okxs"],+ Bi91k9c: "fx9teim",+ Jwef8y: "f1uqaxdt"+ },+ highContrastSelected: {+ B8gzw0y: "f1h3a8gf",+ By8wz76: "f1nz3ub2",+ B7iucu3: "fqc85l4",+ Boo9lyk: "f1ucc5z8",+ sga51p: "fyj59f4",+ qj1yg9: ["f19v95gn", "f1n69f6i"],+ B8acmzm: "f16q7dot",+ Gezqo6: ["f1n69f6i", "f19v95gn"]+ },+ highContrastInteractive: {+ waf3gn: "f1quqgnd",+ B96h8j5: "f193utb4",+ Bpd3jnq: "f1io67iv",+ uhbujs: "f3n01jk",+ sga51p: "fyj59f4",+ qj1yg9: ["f19v95gn", "f1n69f6i"],+ B8acmzm: "f16q7dot",+ Gezqo6: ["f1n69f6i", "f19v95gn"]+ },+ select: {+ qhf8xq: "f1euv43f",+ Bhzewxz: "fqclxi7",+ j35jbq: ["fiv86kb", "f36uhnt"],+ Bj3rh1h: "fom9my7"+ },+ hiddenCheckbox: {+ B68tc82: 0,+ Bmxbyg5: 0,+ Bpg54ce: "f1a3p1vp",+ a9b677: "frkrog8",+ Bqenvij: "f1mpe4l3",+ qhf8xq: "f1euv43f",+ Bh84pgu: "fmf1zke",+ Bgl5zvf: "f1wch0ki",+ Huce71: "fz5stix"+ },+ disabled: {+ Bceei9c: "fdrzuqr",+ famaaq: "f1xqy1su",+ sj55zd: "f1s2aq7o",+ De3pzq: "f1bg9a2p",+ E5pizo: "fyed02w",+ g2u3we: "f1jj8ep1",+ h3c5rm: ["f15xbau", "fy0fskl"],+ B9xav0g: "f4ikngz",+ zhjwy3: ["fy0fskl", "f15xbau"],+ Ftih45: "f1wl9k8s",+ Brfgrao: "f1j7ml58",+ lawp4y: 0,+ Fbdkly: 0,+ mdwyqc: 0,+ Bciustq: 0,+ gc50h5: "f13vvzas",+ Ehzi8l: "f198lalb",+ B0n5ga8: "f13dj02",+ s924m2: ["f9wngki", "f17v59j0"],+ B1q35kw: "f1vxzwsp",+ Gp14am: ["f17v59j0", "f9wngki"],+ Bikrtoi: "f11og98d",+ G8qf51: "f1rg3h4v",+ Brxh4y7: "fbm2y3b",+ ezxybo: "f4yodeu",+ wc7uws: "fcwfbwp",+ gp3uxg: "f1repx37",+ Fohawp: ["f1ybi8ct", "f1h4eg6q"],+ Bxulg6k: "f18mejnb",+ vcjq4m: ["f1h4eg6q", "f1ybi8ct"],+ Bsqkqe9: "f1nift3m",+ fskg1g: "f1wu3i8x",+ iwiei9: 0,+ Effecx: 0,+ Bkt1b9m: 0,+ jfmxvr: 0,+ orauir: "f6v4vfa",+ B2yd9ot: "folrdqs",+ Fn9tzk: "f168z5yf",+ Bv0wker: ["fpor7gj", "fzextn6"],+ Bp2dl5b: "f1yaw79v",+ pzn0iz: ["fzextn6", "fpor7gj"]+ }+}, {+ f: [".ftqa4ok:focus{outline-style:none;}"],+ i: [".f2hkw1w:focus-visible{outline-style:none;}"],+ d: [".f8hki3x[data-fui-focus-visible]{border-top-color:transparent;}", ".f1d2448m[data-fui-focus-visible]{border-right-color:transparent;}", ".ffh67wi[data-fui-focus-visible]{border-left-color:transparent;}", ".f1bjia2o[data-fui-focus-visible]{border-bottom-color:transparent;}", '.f15bsgw9[data-fui-focus-visible]::after{content:"";}', ".f14e48fq[data-fui-focus-visible]::after{position:absolute;}", ".f18yb2kv[data-fui-focus-visible]::after{pointer-events:none;}", ".fd6o370[data-fui-focus-visible]::after{z-index:1;}", [".fpqizxz[data-fui-focus-visible]::after{border:var(--strokeWidthThick) solid var(--colorStrokeFocus2);}", {+ p: -2+ }], [".fnd8nzh[data-fui-focus-visible]::after{border-radius:var(--fui-Card--border-radius);}", {+ p: -1+ }], ".f15fr7a0[data-fui-focus-visible]::after{top:calc(0px - var(--strokeWidthThick) - -2px);}", ".fwsq40z[data-fui-focus-visible]::after{right:calc(0px - var(--strokeWidthThick) - -2px);}", ".fy0y4wt[data-fui-focus-visible]::after{left:calc(0px - var(--strokeWidthThick) - -2px);}", ".f34ld9f[data-fui-focus-visible]::after{bottom:calc(0px - var(--strokeWidthThick) - -2px);}", ".f1b1k54r[data-fui-focus-within]:focus-within{border-top-color:transparent;}", ".f4ne723[data-fui-focus-within]:focus-within{border-right-color:transparent;}", ".fqqcjud[data-fui-focus-within]:focus-within{border-left-color:transparent;}", ".fh7aioi[data-fui-focus-within]:focus-within{border-bottom-color:transparent;}", '.ffht0p2[data-fui-focus-within]:focus-within::after{content:"";}', ".f1p0ul1q[data-fui-focus-within]:focus-within::after{position:absolute;}", ".f1c901ms[data-fui-focus-within]:focus-within::after{pointer-events:none;}", ".f1alokd7[data-fui-focus-within]:focus-within::after{z-index:1;}", [".f1i978nd[data-fui-focus-within]:focus-within::after{border:var(--strokeWidthThick) solid var(--colorStrokeFocus2);}", {+ p: -2+ }], [".f1nh8hsq[data-fui-focus-within]:focus-within::after{border-radius:var(--fui-Card--border-radius);}", {+ p: -1+ }], ".f1amxum7[data-fui-focus-within]:focus-within::after{top:calc(0px - var(--strokeWidthThick) - -2px);}", ".f1cec8w7[data-fui-focus-within]:focus-within::after{right:calc(0px - var(--strokeWidthThick) - -2px);}", ".f554mv0[data-fui-focus-within]:focus-within::after{left:calc(0px - var(--strokeWidthThick) - -2px);}", ".f1sj6kbr[data-fui-focus-within]:focus-within::after{bottom:calc(0px - var(--strokeWidthThick) - -2px);}", ".f1063pyq{flex-direction:row;}", ".f122n59{align-items:center;}", ".ftrw7vg>.fui-CardPreview{margin-top:calc(var(--fui-Card--size) * -1);}", ".f18opajm>.fui-CardPreview{margin-bottom:calc(var(--fui-Card--size) * -1);}", '.f13002it>:not([aria-hidden="true"]).fui-CardPreview:first-of-type{margin-left:calc(var(--fui-Card--size) * -1);}', '.fqo182t>:not([aria-hidden="true"]).fui-CardPreview:first-of-type{margin-right:calc(var(--fui-Card--size) * -1);}', '.f18yna97>:not([aria-hidden="true"]).fui-CardPreview:last-of-type{margin-right:calc(var(--fui-Card--size) * -1);}', '.f1kd6wh7>:not([aria-hidden="true"]).fui-CardPreview:last-of-type{margin-left:calc(var(--fui-Card--size) * -1);}', ".f4i4759>.fui-CardHeader:last-of-type,.f4i4759>.fui-CardFooter:last-of-type{flex-grow:1;}", ".f1vx9l62{flex-direction:column;}", ".f14k419y>.fui-CardPreview{margin-left:calc(var(--fui-Card--size) * -1);}", ".f1fgo9fz>.fui-CardPreview{margin-right:calc(var(--fui-Card--size) * -1);}", '.fvqmfsm>:not([aria-hidden="true"]).fui-CardPreview:first-of-type{margin-top:calc(var(--fui-Card--size) * -1);}', ".f3am6yf>.fui-Card__floatingAction+.fui-CardPreview{margin-top:calc(var(--fui-Card--size) * -1);}", '.f1r5wgso>:not([aria-hidden="true"]).fui-CardPreview:last-of-type{margin-bottom:calc(var(--fui-Card--size) * -1);}', ".f1pi9uxy{--fui-Card--size:8px;}", ".f1h1zgly{--fui-Card--border-radius:var(--borderRadiusSmall);}", ".frsmuga{--fui-Card--size:12px;}", ".fuldkky{--fui-Card--border-radius:var(--borderRadiusMedium);}", ".f1qua4xo{--fui-Card--size:16px;}", ".fimkt6v{--fui-Card--border-radius:var(--borderRadiusLarge);}", ".f1epqm3e .fui-Text{color:currentColor;}", ".fxugw4r{background-color:var(--colorNeutralBackground1);}", ".f1whvlc6{box-shadow:var(--shadow4);}", ".f16gxe2i::after{border-top-color:var(--colorTransparentStroke);}", ".fpgykix::after{border-right-color:var(--colorTransparentStroke);}", ".fzybk4o::after{border-left-color:var(--colorTransparentStroke);}", ".f1osi826::after{border-bottom-color:var(--colorTransparentStroke);}", ".f1k6fduh{cursor:pointer;}", ".f1nfm20t{background-color:var(--colorNeutralBackground1Selected);}", ".f16eln5f::after{border-top-color:var(--colorNeutralStroke1Selected);}", ".fa2okxs::after{border-right-color:var(--colorNeutralStroke1Selected);}", ".fg4zq3l::after{border-left-color:var(--colorNeutralStroke1Selected);}", ".ff6932p::after{border-bottom-color:var(--colorNeutralStroke1Selected);}", ".f1dmdbja{background-color:var(--colorNeutralBackground2);}", ".fjxa0vh{background-color:var(--colorNeutralBackground2Selected);}", ".f1c21dwh{background-color:var(--colorTransparentBackground);}", ".f1couhl3{box-shadow:none;}", ".ft83z1f::after{border-top-color:var(--colorNeutralStroke1);}", ".f1g4150c::after{border-right-color:var(--colorNeutralStroke1);}", ".f192dr6e::after{border-left-color:var(--colorNeutralStroke1);}", ".f1qnawh6::after{border-bottom-color:var(--colorNeutralStroke1);}", ".f1q9pm1r{background-color:var(--colorTransparentBackgroundSelected);}", ".f1jj8ep1{border-top-color:var(--colorNeutralStrokeDisabled);}", ".f15xbau{border-right-color:var(--colorNeutralStrokeDisabled);}", ".fy0fskl{border-left-color:var(--colorNeutralStrokeDisabled);}", ".f4ikngz{border-bottom-color:var(--colorNeutralStrokeDisabled);}", ".f13dj02::after{border-top-color:var(--colorNeutralStrokeDisabled);}", ".f9wngki::after{border-right-color:var(--colorNeutralStrokeDisabled);}", ".f17v59j0::after{border-left-color:var(--colorNeutralStrokeDisabled);}", ".f1vxzwsp::after{border-bottom-color:var(--colorNeutralStrokeDisabled);}", ".fhovq9v{background-color:var(--colorSubtleBackground);}", ".fq5gl1p{background-color:var(--colorSubtleBackgroundSelected);}", ".f1euv43f{position:absolute;}", ".fqclxi7{top:4px;}", ".fiv86kb{right:4px;}", ".f36uhnt{left:4px;}", ".fom9my7{z-index:var(--zIndexContent, 1);}", [".f1a3p1vp{overflow:hidden;}", {+ p: -1+ }], ".frkrog8{width:1px;}", ".f1mpe4l3{height:1px;}", ".fmf1zke{clip:rect(0 0 0 0);}", ".f1wch0ki{clip-path:inset(50%);}", ".fz5stix{white-space:nowrap;}", ".fdrzuqr{cursor:not-allowed;}", ".f1xqy1su{-webkit-user-select:none;-moz-user-select:none;user-select:none;}", ".f1s2aq7o{color:var(--colorNeutralForegroundDisabled);}", ".f1bg9a2p{background-color:var(--colorNeutralBackgroundDisabled);}", ".fyed02w{box-shadow:var(--shadow2);}", '.f1wl9k8s::before{content:"";}', ".f1j7ml58::before{position:absolute;}", [".f13vvzas::before{inset:0;}", {+ p: -1+ }], ".f198lalb::before{z-index:calc(var(--zIndexContent, 1) + 1);}"],+ m: [["@media (forced-colors: active){.f1j6vpng[data-fui-focus-visible]::after{border-top-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1ffjurs[data-fui-focus-visible]::after{border-left-color:Highlight;}.f1pniga2[data-fui-focus-visible]::after{border-right-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f987i1v[data-fui-focus-visible]::after{border-bottom-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1ufm4qn[data-fui-focus-within]:focus-within::after{border-top-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1qnwcb4[data-fui-focus-within]:focus-within::after{border-right-color:Highlight;}.fgrk5zm[data-fui-focus-within]:focus-within::after{border-left-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.fi52z01[data-fui-focus-within]:focus-within::after{border-bottom-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1h3a8gf{forced-color-adjust:none;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1nz3ub2{background-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.fqc85l4{color:HighlightText;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1ucc5z8 .fui-CardPreview,.f1ucc5z8 .fui-CardFooter{forced-color-adjust:auto;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.fyj59f4::after{border-top-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f19v95gn::after{border-right-color:Highlight;}.f1n69f6i::after{border-left-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f16q7dot::after{border-bottom-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1quqgnd:hover,.f1quqgnd :active{forced-color-adjust:none;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f193utb4:hover,.f193utb4 :active{background-color:Highlight;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f1io67iv:hover,.f1io67iv :active{color:HighlightText;}}", {+ m: "(forced-colors: active)"+ }], ["@media (forced-colors: active){.f3n01jk:hover .fui-CardPreview,.f3n01jk :active .fui-CardPreview,.f3n01jk:hover .fui-CardFooter,.f3n01jk :active .fui-CardFooter{forced-color-adjust:auto;}}", {+ m: "(forced-colors: active)"+ }]],+ h: [".feu1g3u:hover{color:var(--colorNeutralForeground1Hover);}", ".f1knas48:hover{background-color:var(--colorNeutralBackground1Hover);}", ".f1m145df:hover{box-shadow:var(--shadow8);}", ".fx9teim:hover{color:var(--colorNeutralForeground1Selected);}", ".f1kz6goq:hover{background-color:var(--colorNeutralBackground1Selected);}", ".fnwyq0v:hover{color:var(--colorNeutralForeground2Hover);}", ".f1uvynv3:hover{background-color:var(--colorNeutralBackground2Hover);}", ".f1luvkty:hover{color:var(--colorNeutralForeground2Selected);}", ".fehi0vp:hover{background-color:var(--colorNeutralBackground2Selected);}", ".fjxutwb:hover{background-color:var(--colorTransparentBackgroundHover);}", ".f1llr77y:hover::after{border-top-color:var(--colorNeutralStroke1Hover);}", ".fzk0khw:hover::after{border-right-color:var(--colorNeutralStroke1Hover);}", ".fjj8tog:hover::after{border-left-color:var(--colorNeutralStroke1Hover);}", ".fb1u8ub:hover::after{border-bottom-color:var(--colorNeutralStroke1Hover);}", ".fg59vm4:hover{background-color:var(--colorTransparentBackgroundSelected);}", ".f1ls5moo:hover,.f1ls5moo:active{background-color:var(--colorTransparentBackground);}", ".f1qiza15:hover,.f1qiza15:active{box-shadow:none;}", ".f1t94bn6:hover{background-color:var(--colorSubtleBackgroundHover);}", ".f1uqaxdt:hover{background-color:var(--colorSubtleBackgroundSelected);}", ".f11og98d:hover,.f11og98d:active{cursor:not-allowed;}", ".f1rg3h4v:hover,.f1rg3h4v:active{-webkit-user-select:none;-moz-user-select:none;user-select:none;}", ".fbm2y3b:hover,.fbm2y3b:active{color:var(--colorNeutralForegroundDisabled);}", ".f4yodeu:hover,.f4yodeu:active{background-color:var(--colorNeutralBackgroundDisabled);}", ".fcwfbwp:hover,.fcwfbwp:active{box-shadow:var(--shadow2);}", ".f1repx37:hover,.f1repx37:active{border-top-color:var(--colorNeutralStrokeDisabled);}", ".f1ybi8ct:hover,.f1ybi8ct:active{border-right-color:var(--colorNeutralStrokeDisabled);}", ".f1h4eg6q:hover,.f1h4eg6q:active{border-left-color:var(--colorNeutralStrokeDisabled);}", ".f18mejnb:hover,.f18mejnb:active{border-bottom-color:var(--colorNeutralStrokeDisabled);}", '.f1nift3m:hover::before,.f1nift3m:active::before{content:"";}', ".f1wu3i8x:hover::before,.f1wu3i8x:active::before{position:absolute;}", [".f6v4vfa:hover::before,.f6v4vfa:active::before{inset:0;}", {+ p: -1+ }], ".folrdqs:hover::before,.folrdqs:active::before{z-index:calc(var(--zIndexContent, 1) + 1);}", ".f168z5yf:hover::after,.f168z5yf:active::after{border-top-color:var(--colorNeutralStrokeDisabled);}", ".fpor7gj:hover::after,.fpor7gj:active::after{border-right-color:var(--colorNeutralStrokeDisabled);}", ".fzextn6:hover::after,.fzextn6:active::after{border-left-color:var(--colorNeutralStrokeDisabled);}", ".f1yaw79v:hover::after,.f1yaw79v:active::after{border-bottom-color:var(--colorNeutralStrokeDisabled);}"],+ a: [".fb40n2d:active{background-color:var(--colorNeutralBackground1Pressed);}", ".f1yhgkbh:active{background-color:var(--colorNeutralBackground2Pressed);}", ".fophhak:active{background-color:var(--colorTransparentBackgroundPressed);}", ".f1uohb70:active::after{border-top-color:var(--colorNeutralStroke1Pressed);}", ".f1jm7v1n:active::after{border-right-color:var(--colorNeutralStroke1Pressed);}", ".f1bus3rq:active::after{border-left-color:var(--colorNeutralStroke1Pressed);}", ".f1fbu7rr:active::after{border-bottom-color:var(--colorNeutralStroke1Pressed);}", ".f1wfn5kd:active{background-color:var(--colorSubtleBackgroundPressed);}"]+}), ya = (e) => {+ "use no memo";+ const o = ma(), r = ka(), a = {+ horizontal: r.orientationHorizontal,+ vertical: r.orientationVertical+ }, t = {+ small: r.sizeSmall,+ medium: r.sizeMedium,+ large: r.sizeLarge+ }, n = {+ filled: r.filled,+ "filled-alternative": r.filledAlternative,+ outline: r.outline,+ subtle: r.subtle+ }, c = {+ filled: r.filledInteractiveSelected,+ "filled-alternative": r.filledAlternativeInteractiveSelected,+ outline: r.outlineInteractiveSelected,+ subtle: r.subtleInteractiveSelected+ }, l = {+ filled: r.filledInteractive,+ "filled-alternative": r.filledAlternativeInteractive,+ outline: r.outlineInteractive,+ subtle: r.subtleInteractive+ }, f = !e.disabled && (e.interactive || e.selectable), i = g.useMemo(() => e.disabled ? "" : e.selectable ? e.selectFocused ? r.selectableFocused : "" : r.focused, [e.disabled, e.selectFocused, e.selectable, r.focused, r.selectableFocused]);+ return e.root.className = b(K.root, o, a[e.orientation], t[e.size], n[e.appearance], f && r.interactive, f && l[e.appearance], e.selected && c[e.appearance], i, f && r.highContrastInteractive, e.selected && r.highContrastSelected, e.disabled && r.disabled, e.disabled && e.appearance === "outline" && r.outlineDisabled, e.root.className), e.floatingAction && (e.floatingAction.className = b(K.floatingAction, r.select, e.floatingAction.className)), e.checkbox && (e.checkbox.className = b(K.checkbox, r.hiddenCheckbox, e.checkbox.className)), e;+};+function xa({ selectableA11yProps: e }) {+ return {+ selectableA11yProps: e+ };+}+const _e = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = la(e, o), a = xa(r);+ return ya(r), A("useCardStyles_unstable")(r), ca(r, a);+});+_e.displayName = "Card";+const Ba = (e, o) => wa(e, o), wa = (e, o) => {+ const { action: r } = e;+ return {+ components: {+ root: "div",+ action: "div"+ },+ root: C(V("div", {+ // FIXME:+ // `ref` is wrongly assigned to be `HTMLElement` instead of `HTMLDivElement`+ // but since it would be a breaking change to fix it, we are casting ref to it's proper type+ ref: o,+ ...e+ }), {+ elementType: "div"+ }),+ action: z(r, {+ elementType: "div"+ })+ };+}, za = (e) => /* @__PURE__ */ D(e.root, {+ children: [+ e.root.children,+ e.action && /* @__PURE__ */ k(e.action, {})+ ]+}), De = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = Ba(e, o);+ return ha(r), A("useCardFooterStyles_unstable")(r), za(r);+});+De.displayName = "CardFooter";+function qa(e) {+ function o(r) {+ return g.isValidElement(r) && !!r.props.id;+ }+ return g.Children.toArray(e).find(o);+}+function ja(e, o, r) {+ return e || (o?.props.id ? o.props.id : r);+}+const Sa = (e, o) => Ca(e, o), Ca = (e, o) => {+ const { image: r, header: a, description: t, action: n } = e, { selectableA11yProps: { referenceId: c, setReferenceId: l } } = Ne(), f = g.useRef(null), i = g.useRef(!1), s = be(Ae.header, c), d = z(a, {+ renderByDefault: !0,+ defaultProps: {+ ref: f,+ id: i.current ? void 0 : c+ },+ elementType: "div"+ });+ return g.useEffect(() => {+ var v;+ const p = i.current || (v = f.current) === null || v === void 0 ? void 0 : v.id, h = qa(d?.children);+ i.current = !!h, l(ja(p, h, s));+ }, [+ s,+ a,+ d,+ l+ ]), {+ components: {+ root: "div",+ image: "div",+ header: "div",+ description: "div",+ action: "div"+ },+ root: C(V("div", {+ // FIXME:+ // `ref` is wrongly assigned to be `HTMLElement` instead of `HTMLDivElement`+ // but since it would be a breaking change to fix it, we are casting ref to it's proper type+ ref: o,+ ...e+ }), {+ elementType: "div"+ }),+ image: z(r, {+ elementType: "div"+ }),+ header: d,+ description: z(t, {+ elementType: "div"+ }),+ action: z(n, {+ elementType: "div"+ })+ };+}, Ta = (e) => /* @__PURE__ */ D(e.root, {+ children: [+ e.image && /* @__PURE__ */ k(e.image, {}),+ e.header && /* @__PURE__ */ k(e.header, {}),+ e.description && /* @__PURE__ */ k(e.description, {}),+ e.action && /* @__PURE__ */ k(e.action, {})+ ]+}), Fe = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = Sa(e, o);+ return pa(r), A("useCardHeaderStyles_unstable")(r), Ta(r);+});+Fe.displayName = "CardHeader";+const Pa = (e, o) => Na(e, o), Na = (e, o) => {+ const { logo: r } = e, { selectableA11yProps: { referenceLabel: a, referenceId: t, setReferenceLabel: n, setReferenceId: c } } = Ne(), l = U(o, g.useRef(null));+ return g.useEffect(() => {+ if (!(a && t) && l.current && l.current.parentNode) {+ const f = l.current.parentNode.querySelector(`.${oe.root} > img`);+ if (f) {+ const i = f.getAttribute("aria-label"), s = f.getAttribute("aria-describedby");+ s ? c(s) : f.alt ? n(f.alt) : i && n(i);+ }+ }+ }, [+ n,+ a,+ l,+ t,+ c+ ]), {+ components: {+ root: "div",+ logo: "div"+ },+ root: C(V("div", {+ ref: l,+ ...e+ }), {+ elementType: "div"+ }),+ logo: z(r, {+ elementType: "div"+ })+ };+}, Aa = (e) => /* @__PURE__ */ D(e.root, {+ children: [+ e.root.children,+ e.logo && /* @__PURE__ */ k(e.logo, {})+ ]+}), He = /* @__PURE__ */ g.forwardRef((e, o) => {+ const r = Pa(e, o);+ return da(r), A("useCardPreviewStyles_unstable")(r), Aa(r);+});+He.displayName = "CardPreview";+const $ = ir({+ extensionButton: {},+ extensionsDialogSurface: {+ height: "auto",+ width: "70vw",+ maxWidth: "600px",+ maxHeight: "70vh",+ backgroundColor: P.colorNeutralBackground2+ },+ extensionDialogBody: {+ maxWidth: "100%",+ maxHeight: "100%"+ },+ extensionDialogContent: {+ marginLeft: `calc(-1 * ${P.spacingHorizontalM})`,+ marginRight: `calc(-1 * ${P.spacingHorizontalS})`+ },+ extensionHeader: {},+ extensionItem: {},+ extensionCardPreview: {+ padding: `${P.spacingVerticalM} ${P.spacingHorizontalM}`,+ display: "flex",+ flexDirection: "column",+ rowGap: P.spacingVerticalL+ },+ extensionIntro: {+ display: "flex",+ alignItems: "center",+ columnGap: P.spacingHorizontalM+ },+ extensionDescription: {+ display: "flex",+ flexDirection: "row",+ columnGap: P.spacingHorizontalS+ },+ extensionButtonContainer: {+ marginLeft: "auto",+ alignSelf: "flex-start"+ },+ spinner: {+ animationDuration: "1s",+ animationName: {+ from: { opacity: 0 },+ to: { opacity: 1 }+ }+ },+ webResourceDiv: {+ display: "flex",+ flexDirection: "column"+ },+ webResourceLink: {+ display: "flex",+ flexDirection: "row",+ columnGap: P.spacingHorizontalS,+ alignItems: "center"+ },+ personPopoverSurfaceDiv: {+ display: "flex",+ flexDirection: "column",+ rowGap: P.spacingVerticalS+ },+ accordionHeaderDiv: {+ display: "flex",+ flexDirection: "row",+ columnGap: P.spacingHorizontalS,+ alignItems: "center"+ },+ resourceDetailsDiv: {+ display: "flex",+ flexDirection: "column",+ rowGap: P.spacingVerticalS+ },+ peopleDetailsDiv: {+ display: "flex",+ flexDirection: "row",+ columnGap: P.spacingHorizontalXL+ },+ avatarGroupItem: {+ cursor: "pointer"+ }+});+function _a(e) {+ return typeof e == "string" ? { name: e } : e;+}+function ae(e) {+ return e.avatar ? { src: `data:image/png;base64,${e.avatar}` } : void 0;+}+function ge(e) {+ const o = g.useMemo(() => e ? e.filter((r) => !!r) : [], [e]);+ return g.useMemo(() => o.map(_a), [o]);+}+const R = (e) => {+ const { url: o, urlDisplay: r, icon: a, label: t } = e, n = $();+ return u.jsx("div", { className: n.webResourceDiv, children: u.jsx(ye, { content: t, relationship: "label", positioning: "before", withArrow: !0, children: u.jsxs("div", { className: n.webResourceLink, children: [a, u.jsx(mr, { url: o, value: r || o })] }) }) });+}, pe = (e) => {+ const { person: o, title: r, disabled: a, children: t } = e, n = $();+ return a ? u.jsx(u.Fragment, { children: t }) : u.jsxs(kr, { withArrow: !0, children: [u.jsx(yr, { disableButtonEnhancement: !0, children: t }), u.jsx(xr, { children: u.jsxs("div", { className: n.personPopoverSurfaceDiv, children: [u.jsx(le, { name: o.name, secondaryText: r, avatar: { image: ae(o) } }), o.email && u.jsx(R, { url: `mailto:${o.email}`, urlDisplay: o.email, icon: u.jsx(Br, {}), label: "Email" }), o.url && u.jsx(R, { url: o.url, urlDisplay: o.url, icon: u.jsx(xe, {}), label: "Website" }), o.forumUserName && u.jsx(R, { url: `https://forum.babylonjs.com/u/${o.forumUserName}`, urlDisplay: o.forumUserName, icon: u.jsx(wr, {}), label: "Forum" })] }) })] });+}, Da = g.memo((e) => {+ const { extension: o } = e, { metadata: r } = o, a = $(), [t, n] = g.useState(!1), [c, l] = g.useState(!1), [f, i] = g.useState(!1);+ g.useEffect(() => {+ const x = () => {+ n(!o.isInstalled && !o.isStateChanging), l(o.isInstalled && !o.isStateChanging), i(o.isStateChanging);+ }, T = o.addStateChangedHandler(x);+ return x(), T.dispose;+ }, [o]);+ const [s] = ge(g.useMemo(() => [r.author], [r.author])), d = ge(r.contributors), v = r.homepage || r.repository || r.bugs, p = s || d.length > 0, h = v || p, j = s?.email || s?.url || s?.forumUserName, y = [r.version ? `${r.version}` : null, r.license ? `${r.license}` : null].filter(Boolean).join(" | "), B = g.useCallback(async () => {+ try {+ await o.installAsync();+ } catch {+ }+ }, [o]), q = g.useCallback(async () => {+ try {+ await o.uninstallAsync();+ } catch {+ }+ }, [o]);+ return u.jsxs(nr, { className: a.extensionItem, value: o.metadata.name, children: [u.jsx(lr, { className: a.extensionHeader, expandIconPosition: "end", children: u.jsxs("div", { className: a.accordionHeaderDiv, children: [u.jsx(fr, { children: o.metadata.name }), u.jsx(cr, { visible: o.isInstalled, children: u.jsx(E, { size: "small" }) })] }) }), u.jsx(sr, { children: u.jsxs(_e, { children: [u.jsx(Fe, { header: u.jsx(ur, { children: r.description }), description: u.jsx(dr, { italic: !0, children: y }) }), h && u.jsxs(He, { className: a.extensionCardPreview, children: [v && u.jsxs("div", { className: a.resourceDetailsDiv, style: { display: "flex" }, children: [r.homepage && u.jsx(R, { url: r.homepage, icon: u.jsx(xe, {}), label: "Website" }), r.repository && u.jsx(R, { url: r.repository, icon: u.jsx(vr, {}), label: "Repository" }), r.bugs && u.jsx(R, { url: r.bugs, icon: u.jsx(gr, {}), label: "Report Issues" })] }), p && u.jsxs("div", { className: a.peopleDetailsDiv, style: { display: "flex" }, children: [s && u.jsx(pe, { person: s, title: "Author", disabled: !j, children: u.jsx(le, { name: s.name, secondaryText: "Author", avatar: { image: ae(s) }, style: { cursor: j ? "pointer" : "default" } }) }), d.length > 0 && u.jsx(qe, { layout: "stack", children: d.map((x) => u.jsx(pe, { person: x, title: "Contributor", children: u.jsx(je, { name: x.name, className: a.avatarGroupItem, image: ae(x) }) }, x.name)) })] })] }), u.jsxs(De, { children: [t && u.jsx(X, { appearance: "primary", size: "small", icon: u.jsx(pr, {}), onClick: B, children: "Get" }), c && u.jsx(X, { appearance: "secondary", size: "small", icon: u.jsx(br, {}), onClick: q, children: "Remove" }), f && u.jsx(hr, { className: a.spinner, size: "extra-small" })] })] }) })] });+}), Ra = {+ friendlyName: "ExtensionList",+ consumes: [Je],+ factory: (e) => {+ const o = e.addToolbarItem({+ key: "ExtensionList",+ horizontalLocation: "right",+ verticalLocation: "top",+ teachingMoment: {+ title: "Extensions",+ description: "Extensions provide new optional features that can be useful to your specific task or workflow. Click this button to manage extensions."+ },+ order: -200,+ component: () => {+ const r = $(), [a, t] = g.useState("available"), n = Ke(), [c, l] = g.useState([]);+ return g.useEffect(() => {+ n && (async () => {+ const i = await n.queryExtensionsAsync(void 0, void 0, a === "installed"), s = await i.getExtensionsAsync(0, i.totalCount);+ l(s);+ })().catch((i) => {+ zr.Warn(`Failed to populate extensions: ${i}`);+ });+ }, [n, a]), u.jsxs(Ye, { children: [u.jsx(ce, { disableButtonEnhancement: !0, children: u.jsx(ye, { content: "Manage Extensions", relationship: "label", children: u.jsx(X, { className: r.extensionButton, appearance: "subtle", icon: u.jsx(Qe, {}) }) }) }), u.jsx(Ze, { className: r.extensionsDialogSurface, children: u.jsxs(er, { className: r.extensionDialogBody, children: [u.jsx(rr, { action: u.jsx(ce, { action: "close", children: u.jsx(X, { appearance: "subtle", "aria-label": "close", icon: u.jsx(or, {}) }) }), children: u.jsxs(u.Fragment, { children: ["Extensions", u.jsxs(Ce, { className: r.extensionDialogContent, selectedValue: a, onTabSelect: (f, i) => {+ t(i.value);+ }, children: [u.jsx(ee, { value: "available", children: "Available" }), u.jsx(ee, { value: "installed", children: "Installed" })] })] }) }), u.jsx(ar, { className: r.extensionDialogContent, children: u.jsx(tr, { collapsible: !0, children: c.map((f) => u.jsx(Da, { extension: f }, f.metadata.name)) }) })] }) })] });+ }+ });+ return {+ dispose: () => o.dispose()+ };+ }+};+export {+ Ra as ExtensionListServiceDefinition+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-C5DT99Cs.jsadded+5@@ -0,0 +1,5 @@+import { bW as r } from "./chunk-IERganv1.js";+const o = "oitFinalSimpleBlendPixelShader", t = `var uFrontColor: texture_2d<f32>;@fragment+fn main(input: FragmentInputs)->FragmentOutputs {var fragCoord: vec2i=vec2i(fragmentInputs.position.xy);var frontColor: vec4f=textureLoad(uFrontColor,fragCoord,0);fragmentOutputs.color=frontColor;}+`;+r.ShadersStoreWGSL[o] || (r.ShadersStoreWGSL[o] = t);
vendor/adom-step/vendor/3d-viewer-dist/chunk-CLk12wZ9.jsadded+72@@ -0,0 +1,72 @@+import { bW as i } from "./chunk-IERganv1.js";+const e = "normalVertexShader", n = `precision highp float;attribute vec3 position;+#ifdef NORMAL+attribute vec3 normal;+#endif+#ifdef UV1+attribute vec2 uv;+#endif+#ifdef UV2+attribute vec2 uv2;+#endif+#ifdef VERTEXCOLOR+attribute vec4 color;+#endif+#include<bonesDeclaration>+#include<bakedVertexAnimationDeclaration>+#include<instancesDeclaration>+uniform mat4 view;uniform mat4 viewProjection;+#ifdef DIFFUSE+varying vec2 vDiffuseUV;uniform mat4 diffuseMatrix;uniform vec2 vDiffuseInfos;+#endif+#ifdef POINTSIZE+uniform float pointSize;+#endif+varying vec3 vPositionW;+#ifdef NORMAL+varying vec3 vNormalW;+#endif+#include<clipPlaneVertexDeclaration>+#include<logDepthDeclaration>+#include<fogVertexDeclaration>+#include<__decl__lightFragment>[0..maxSimultaneousLights]+#if defined(CLUSTLIGHT_BATCH) && CLUSTLIGHT_BATCH>0+varying float vViewDepth;+#endif+#define CUSTOM_VERTEX_DEFINITIONS+void main(void) {+#define CUSTOM_VERTEX_MAIN_BEGIN+#include<instancesVertex>+#include<bonesVertex>+#include<bakedVertexAnimation>+vec4 worldPos=finalWorld*vec4(position,1.0);gl_Position=viewProjection*worldPos;vPositionW=vec3(worldPos);+#ifdef NORMAL+vNormalW=normalize(vec3(finalWorld*vec4(normal,0.0)));+#endif+#ifndef UV1+vec2 uv=vec2(0.,0.);+#endif+#ifndef UV2+vec2 uv2=vec2(0.,0.);+#endif+#ifdef DIFFUSE+if (vDiffuseInfos.x==0.)+{vDiffuseUV=vec2(diffuseMatrix*vec4(uv,1.0,0.0));}+else+{vDiffuseUV=vec2(diffuseMatrix*vec4(uv2,1.0,0.0));}+#endif+#include<clipPlaneVertex>+#include<logDepthVertex>+#include<fogVertex>+#include<shadowsVertex>[0..maxSimultaneousLights]+#if defined(POINTSIZE) && !defined(WEBGPU)+gl_PointSize=pointSize;+#endif+#define CUSTOM_VERTEX_MAIN_END+}+`;+i.ShadersStore[e] || (i.ShadersStore[e] = n);+const o = { name: e, shader: n };+export {+ o as normalVertexShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-CU2361BP.jsadded+10@@ -0,0 +1,10 @@+import { bW as o } from "./chunk-IERganv1.js";+const e = "volumetricLightingRenderVolumeVertexShader", r = `#include<__decl__sceneVertex>+#include<__decl__meshVertex>+attribute vec3 position;varying vec4 vWorldPos;void main(void) {vec4 worldPos=world*vec4(position,1.0);vWorldPos=worldPos;gl_Position=viewProjection*worldPos;}+`;+o.ShadersStore[e] || (o.ShadersStore[e] = r);+const t = { name: e, shader: r };+export {+ t as volumetricLightingRenderVolumeVertexShader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-CXESUAmj.jsadded+996@@ -0,0 +1,996 @@+import { i as t } from "./chunk-IERganv1.js";+class a {+ /**+ * Creates a new instance of the OpenPBRMaterialLoadingAdapter.+ * @param material - The OpenPBR material to adapt.+ */+ constructor(e) {+ this._diffuseTransmissionTint = t.White(), this._diffuseTransmissionTintTexture = null, this._material = e;+ }+ /**+ * Gets the underlying material+ */+ get material() {+ return this._material;+ }+ /**+ * Whether the material should be treated as unlit+ */+ get isUnlit() {+ return this._material.unlit;+ }+ /**+ * Sets whether the material should be treated as unlit+ */+ set isUnlit(e) {+ this._material.unlit = e;+ }+ // ========================================+ // CULLING PROPERTIES+ // ========================================+ /**+ * Sets whether back face culling is enabled.+ * @param value True to enable back face culling+ */+ set backFaceCulling(e) {+ this._material.backFaceCulling = e;+ }+ /**+ * Gets whether back face culling is enabled.+ * @returns True if back face culling is enabled+ */+ get backFaceCulling() {+ return this._material.backFaceCulling;+ }+ /**+ * Sets whether two-sided lighting is enabled.+ * @param value True to enable two-sided lighting+ */+ set twoSidedLighting(e) {+ this._material.twoSidedLighting = e;+ }+ /**+ * Gets whether two-sided lighting is enabled.+ * @returns True if two-sided lighting is enabled+ */+ get twoSidedLighting() {+ return this._material.twoSidedLighting;+ }+ // ========================================+ // ALPHA PROPERTIES+ // ========================================+ /**+ * Sets the alpha cutoff value for alpha testing.+ * Note: OpenPBR doesn't have a direct equivalent, so this is a no-op.+ * @param value The alpha cutoff threshold (ignored for OpenPBR)+ */+ set alphaCutOff(e) {+ }+ /**+ * Gets the alpha cutoff value.+ * @returns Default value of 0.5 (OpenPBR doesn't support this directly)+ */+ get alphaCutOff() {+ return 0.5;+ }+ /**+ * Sets whether to use alpha from the base color texture.+ * Note: OpenPBR handles this differently through the baseColorTexture alpha channel.+ * @param value True to use alpha from base color texture (handled automatically in OpenPBR)+ */+ set useAlphaFromBaseColorTexture(e) {+ this._material._useAlphaFromBaseColorTexture = e;+ }+ /**+ * Gets whether alpha is used from the base color texture.+ * @returns Always false for OpenPBR as it's handled automatically+ */+ get useAlphaFromBaseColorTexture() {+ return !1;+ }+ /**+ * Gets whether the transparency is treated as alpha coverage.+ */+ get transparencyAsAlphaCoverage() {+ return !1;+ }+ /**+ * Sets/Gets whether the transparency is treated as alpha coverage+ */+ set transparencyAsAlphaCoverage(e) {+ }+ // ========================================+ // BASE PARAMETERS+ // ========================================+ /**+ * Sets the base color of the OpenPBR material.+ * @param value The base color as a Color3+ */+ set baseColor(e) {+ this._material.baseColor = e;+ }+ /**+ * Gets the base color of the OpenPBR material.+ * @returns The base color as a Color3+ */+ get baseColor() {+ return this._material.baseColor;+ }+ /**+ * Sets the base color texture of the OpenPBR material.+ * @param value The base color texture or null+ */+ set baseColorTexture(e) {+ this._material.baseColorTexture = e;+ }+ /**+ * Gets the base color texture of the OpenPBR material.+ * @returns The base color texture or null+ */+ get baseColorTexture() {+ return this._material.baseColorTexture;+ }+ /**+ * Sets the base diffuse roughness of the OpenPBR material.+ * @param value The diffuse roughness value (0-1)+ */+ set baseDiffuseRoughness(e) {+ this._material.baseDiffuseRoughness = e;+ }+ /**+ * Gets the base diffuse roughness of the OpenPBR material.+ * @returns The diffuse roughness value (0-1)+ */+ get baseDiffuseRoughness() {+ return this._material.baseDiffuseRoughness;+ }+ /**+ * Sets the base diffuse roughness texture of the OpenPBR material.+ * @param value The diffuse roughness texture or null+ */+ set baseDiffuseRoughnessTexture(e) {+ this._material.baseDiffuseRoughnessTexture = e;+ }+ /**+ * Gets the base diffuse roughness texture of the OpenPBR material.+ * @returns The diffuse roughness texture or null+ */+ get baseDiffuseRoughnessTexture() {+ return this._material.baseDiffuseRoughnessTexture;+ }+ /**+ * Sets the base metalness value of the OpenPBR material.+ * @param value The metalness value (0-1)+ */+ set baseMetalness(e) {+ this._material.baseMetalness = e;+ }+ /**+ * Gets the base metalness value of the OpenPBR material.+ * @returns The metalness value (0-1)+ */+ get baseMetalness() {+ return this._material.baseMetalness;+ }+ /**+ * Sets the base metalness texture of the OpenPBR material.+ * @param value The metalness texture or null+ */+ set baseMetalnessTexture(e) {+ this._material.baseMetalnessTexture = e;+ }+ /**+ * Gets the base metalness texture of the OpenPBR material.+ * @returns The metalness texture or null+ */+ get baseMetalnessTexture() {+ return this._material.baseMetalnessTexture;+ }+ /**+ * Sets whether to use roughness from the metallic texture's green channel.+ * @param value True to use green channel for roughness+ */+ set useRoughnessFromMetallicTextureGreen(e) {+ this._material._useRoughnessFromMetallicTextureGreen = e;+ }+ /**+ * Sets whether to use metalness from the metallic texture's blue channel.+ * @param value True to use blue channel for metalness+ */+ set useMetallicFromMetallicTextureBlue(e) {+ this._material._useMetallicFromMetallicTextureBlue = e;+ }+ // ========================================+ // SPECULAR PARAMETERS+ // ========================================+ /**+ * Configures specular properties for OpenPBR material.+ * @param _enableEdgeColor Whether to enable edge color support (ignored for OpenPBR)+ */+ enableSpecularEdgeColor(e = !1) {+ }+ /**+ * Sets the specular weight of the OpenPBR material.+ * @param value The specular weight value (0-1)+ */+ set specularWeight(e) {+ this._material.specularWeight = e;+ }+ /**+ * Gets the specular weight of the OpenPBR material.+ * @returns The specular weight value (0-1)+ */+ get specularWeight() {+ return this._material.specularWeight;+ }+ /**+ * Sets the specular weight texture of the OpenPBR material.+ * If the same texture is used for specular color, optimizes by using alpha channel for weight.+ * @param value The specular weight texture or null+ */+ set specularWeightTexture(e) {+ this._material.specularColorTexture === e ? (this._material.specularWeightTexture = null, this._material._useSpecularWeightFromSpecularColorTexture = !0, this._material._useSpecularWeightFromAlpha = !0) : this._material.specularWeightTexture = e;+ }+ /**+ * Gets the specular weight texture of the OpenPBR material.+ * @returns The specular weight texture or null+ */+ get specularWeightTexture() {+ return this._material.specularWeightTexture;+ }+ /**+ * Sets the specular color of the OpenPBR material.+ * @param value The specular color as a Color3+ */+ set specularColor(e) {+ this._material.specularColor = e;+ }+ /**+ * Gets the specular color of the OpenPBR material.+ * @returns The specular color as a Color3+ */+ get specularColor() {+ return this._material.specularColor;+ }+ /**+ * Sets the specular color texture of the OpenPBR material.+ * If the same texture is used for specular weight, optimizes by using alpha channel for weight.+ * @param value The specular color texture or null+ */+ set specularColorTexture(e) {+ this._material.specularColorTexture = e, this._material.specularWeightTexture === this._material.specularColorTexture && (this._material.specularWeightTexture = null, this._material._useSpecularWeightFromSpecularColorTexture = !0, this._material._useSpecularWeightFromAlpha = !0);+ }+ /**+ * Gets the specular color texture of the OpenPBR material.+ * @returns The specular color texture or null+ */+ get specularColorTexture() {+ return this._material.specularColorTexture;+ }+ /**+ * Sets the specular roughness of the OpenPBR material.+ * @param value The roughness value (0-1)+ */+ set specularRoughness(e) {+ this._material.specularRoughness = e;+ }+ /**+ * Gets the specular roughness of the OpenPBR material.+ * @returns The roughness value (0-1)+ */+ get specularRoughness() {+ return this._material.specularRoughness;+ }+ /**+ * Sets the specular roughness texture of the OpenPBR material.+ * @param value The roughness texture or null+ */+ set specularRoughnessTexture(e) {+ this._material.specularRoughnessTexture = e;+ }+ /**+ * Gets the specular roughness texture of the OpenPBR material.+ * @returns The roughness texture or null+ */+ get specularRoughnessTexture() {+ return this._material.specularRoughnessTexture;+ }+ /**+ * Sets the specular index of refraction (IOR) of the OpenPBR material.+ * @param value The IOR value+ */+ set specularIor(e) {+ this._material.specularIor = e;+ }+ /**+ * Gets the specular index of refraction (IOR) of the OpenPBR material.+ * @returns The IOR value+ */+ get specularIor() {+ return this._material.specularIor;+ }+ // ========================================+ // EMISSION PARAMETERS+ // ========================================+ /**+ * Sets the emission color of the OpenPBR material.+ * @param value The emission color as a Color3+ */+ set emissionColor(e) {+ this._material.emissionColor = e;+ }+ /**+ * Gets the emission color of the OpenPBR material.+ * @returns The emission color as a Color3+ */+ get emissionColor() {+ return this._material.emissionColor;+ }+ /**+ * Sets the emission luminance of the OpenPBR material.+ * @param value The emission luminance value+ */+ set emissionLuminance(e) {+ this._material.emissionLuminance = e;+ }+ /**+ * Gets the emission luminance of the OpenPBR material.+ * @returns The emission luminance value+ */+ get emissionLuminance() {+ return this._material.emissionLuminance;+ }+ /**+ * Sets the emission color texture of the OpenPBR material.+ * @param value The emission texture or null+ */+ set emissionColorTexture(e) {+ this._material.emissionColorTexture = e;+ }+ /**+ * Gets the emission color texture of the OpenPBR material.+ * @returns The emission texture or null+ */+ get emissionColorTexture() {+ return this._material.emissionColorTexture;+ }+ // ========================================+ // AMBIENT OCCLUSION+ // ========================================+ /**+ * Sets the ambient occlusion texture of the OpenPBR material.+ * @param value The ambient occlusion texture or null+ */+ set ambientOcclusionTexture(e) {+ this._material.ambientOcclusionTexture = e;+ }+ /**+ * Gets the ambient occlusion texture of the OpenPBR material.+ * @returns The ambient occlusion texture or null+ */+ get ambientOcclusionTexture() {+ return this._material.ambientOcclusionTexture;+ }+ /**+ * Sets the ambient occlusion texture strength by modifying the texture's level.+ * @param value The strength value (typically 0-1)+ */+ set ambientOcclusionTextureStrength(e) {+ const s = this._material.ambientOcclusionTexture;+ s && (s.level = e);+ }+ /**+ * Gets the ambient occlusion texture strength from the texture's level property.+ * @returns The strength value, defaults to 1.0 if no texture or level is set+ */+ get ambientOcclusionTextureStrength() {+ return this._material.ambientOcclusionTexture?.level ?? 1;+ }+ // ========================================+ // COAT PARAMETERS+ // ========================================+ /**+ * Configures coat parameters for OpenPBR material.+ * OpenPBR coat is already built-in, so no configuration is needed.+ */+ configureCoat() {+ }+ /**+ * Sets the coat weight of the OpenPBR material.+ * @param value The coat weight value (0-1)+ */+ set coatWeight(e) {+ this._material.coatWeight = e;+ }+ /**+ * Gets the coat weight of the OpenPBR material.+ * @returns The coat weight value (0-1)+ */+ get coatWeight() {+ return this._material.coatWeight;+ }+ /**+ * Sets the coat weight texture of the OpenPBR material.+ * @param value The coat weight texture or null+ */+ set coatWeightTexture(e) {+ this._material.coatWeightTexture = e;+ }+ /**+ * Gets the coat weight texture of the OpenPBR material.+ * @returns The coat weight texture or null+ */+ get coatWeightTexture() {+ return this._material.coatWeightTexture;+ }+ /**+ * Sets the coat color of the OpenPBR material.+ * @param value The coat color as a Color3+ */+ set coatColor(e) {+ this._material.coatColor = e;+ }+ /**+ * Sets the coat color texture of the OpenPBR material.+ * @param value The coat color texture or null+ */+ set coatColorTexture(e) {+ this._material.coatColorTexture = e;+ }+ /**+ * Sets the coat roughness of the OpenPBR material.+ * @param value The coat roughness value (0-1)+ */+ set coatRoughness(e) {+ this._material.coatRoughness = e;+ }+ /**+ * Gets the coat roughness of the OpenPBR material.+ * @returns The coat roughness value (0-1)+ */+ get coatRoughness() {+ return this._material.coatRoughness;+ }+ /**+ * Sets the coat roughness texture of the OpenPBR material.+ * @param value The coat roughness texture or null+ */+ set coatRoughnessTexture(e) {+ this._material.coatRoughnessTexture = e, e && (this._material._useCoatRoughnessFromGreenChannel = !0);+ }+ /**+ * Gets the coat roughness texture of the OpenPBR material.+ * @returns The coat roughness texture or null+ */+ get coatRoughnessTexture() {+ return this._material.coatRoughnessTexture;+ }+ /**+ * Sets the coat index of refraction (IOR) of the OpenPBR material.+ */+ set coatIor(e) {+ this._material.coatIor = e;+ }+ /**+ * Sets the coat darkening value of the OpenPBR material.+ * @param value The coat darkening value+ */+ set coatDarkening(e) {+ this._material.coatDarkening = e;+ }+ /**+ * Sets the coat darkening texture (OpenPBR: coatDarkeningTexture, no PBR equivalent)+ */+ set coatDarkeningTexture(e) {+ this._material.coatDarkeningTexture = e;+ }+ /**+ * Sets the coat roughness anisotropy.+ * TODO: Implementation pending OpenPBR coat anisotropy feature availability.+ * @param value The coat anisotropy intensity value+ */+ set coatRoughnessAnisotropy(e) {+ this._material.coatRoughnessAnisotropy = e;+ }+ /**+ * Gets the coat roughness anisotropy.+ * TODO: Implementation pending OpenPBR coat anisotropy feature availability.+ * @returns Currently returns 0 as coat anisotropy is not yet available+ */+ get coatRoughnessAnisotropy() {+ return this._material.coatRoughnessAnisotropy;+ }+ /**+ * Sets the coat tangent angle for anisotropy.+ * TODO: Implementation pending OpenPBR coat anisotropy feature availability.+ * @param value The coat anisotropy rotation angle in radians+ */+ set geometryCoatTangentAngle(e) {+ this._material.geometryCoatTangentAngle = e;+ }+ /**+ * Sets the coat tangent texture for anisotropy.+ * TODO: Implementation pending OpenPBR coat anisotropy feature availability.+ * @param value The coat anisotropy texture or null+ */+ set geometryCoatTangentTexture(e) {+ this._material.geometryCoatTangentTexture = e, e && (this._material._useCoatRoughnessAnisotropyFromTangentTexture = !0);+ }+ /**+ * Gets the coat tangent texture for anisotropy.+ * TODO: Implementation pending OpenPBR coat anisotropy feature availability.+ * @returns Currently returns null as coat anisotropy is not yet available+ */+ get geometryCoatTangentTexture() {+ return this._material.geometryCoatTangentTexture;+ }+ // ========================================+ // TRANSMISSION LAYER+ // ========================================+ /**+ * Configures transmission for OpenPBR material.+ */+ configureTransmission() {+ this._material.geometryThinWalled = 1, this._material.transmissionDepth = 0;+ }+ /**+ * Sets the transmission weight.+ * @param value The transmission weight value (0-1)+ */+ set transmissionWeight(e) {+ this._material.transmissionWeight = e;+ }+ /**+ * Sets the transmission weight texture.+ * @param value The transmission weight texture or null+ */+ set transmissionWeightTexture(e) {+ this._material.transmissionWeightTexture = e;+ }+ /**+ * Gets the transmission weight.+ * @returns Currently returns 0 as transmission is not yet available+ */+ get transmissionWeight() {+ return this._material.transmissionWeight;+ }+ /**+ * Sets the transmission scatter coefficient.+ * @param value The scatter coefficient as a Vector3+ */+ set transmissionScatter(e) {+ this._material.transmissionScatter = e;+ }+ /**+ * Gets the transmission scatter coefficient.+ * @returns The scatter coefficient as a Vector3+ */+ get transmissionScatter() {+ return this._material.transmissionScatter;+ }+ /**+ * Sets the transmission scatter texture.+ * @param value The transmission scatter texture or null+ */+ set transmissionScatterTexture(e) {+ this._material.transmissionScatterTexture = e;+ }+ /**+ * Gets the transmission scatter texture.+ * @returns The transmission scatter texture or null+ */+ get transmissionScatterTexture() {+ return this._material.transmissionScatterTexture;+ }+ /**+ * Sets the transmission scattering anisotropy.+ * @param value The anisotropy intensity value (-1 to 1)+ */+ set transmissionScatterAnisotropy(e) {+ this._material.transmissionScatterAnisotropy = e;+ }+ /**+ * Sets the transmission dispersion Abbe number.+ * @param value The Abbe number value+ */+ set transmissionDispersionAbbeNumber(e) {+ this._material.transmissionDispersionAbbeNumber = e;+ }+ /**+ * Sets the transmission dispersion scale.+ * @param value The dispersion scale value+ */+ set transmissionDispersionScale(e) {+ this._material.transmissionDispersionScale = e;+ }+ /**+ * Sets the attenuation distance.+ * @param value The attenuation distance value+ */+ set transmissionDepth(e) {+ e !== Number.MAX_VALUE || this._material.transmissionDepth !== 0 ? this._material.transmissionDepth = e : this._material.transmissionDepth = 0;+ }+ /**+ * Gets the attenuation distance.+ */+ get transmissionDepth() {+ return this._material.transmissionDepth;+ }+ /**+ * Sets the attenuation color.+ * @param value The attenuation color as a Color3+ */+ set transmissionColor(e) {+ e.equals(t.White()) || (this._material.transmissionColor = e);+ }+ /**+ * Gets the attenuation color.+ */+ get transmissionColor() {+ return this._material.transmissionColor;+ }+ /**+ * Gets the refraction background texture+ * @returns The refraction background texture or null+ */+ get refractionBackgroundTexture() {+ return this._material.backgroundRefractionTexture;+ }+ /**+ * Sets the refraction background texture+ * @param value The refraction background texture or null+ */+ set refractionBackgroundTexture(e) {+ this._material.backgroundRefractionTexture = e;+ }+ // ========================================+ // VOLUME PROPERTIES+ // ========================================+ configureVolume() {+ this._material.geometryThinWalled = 0;+ }+ /**+ * Sets whether the material is thin-walled (i.e. non-volumetric) or not.+ */+ set geometryThinWalled(e) {+ this._material.geometryThinWalled = e ? 1 : 0;+ }+ /**+ * Gets whether the material is thin-walled (i.e. non-volumetric) or not.+ */+ get geometryThinWalled() {+ return !!this._material.geometryThinWalled;+ }+ /**+ * Sets the thickness texture.+ * @param value The thickness texture or null+ */+ set volumeThicknessTexture(e) {+ this._material.geometryThicknessTexture = e, this._material._useGeometryThicknessFromGreenChannel = !0;+ }+ /**+ * Sets the thickness factor.+ * @param value The thickness value+ */+ set volumeThickness(e) {+ this._material.geometryThickness = e;+ }+ // ========================================+ // SUBSURFACE PROPERTIES (Subsurface Scattering)+ // ========================================+ /**+ * Configures subsurface properties for PBR material+ */+ configureSubsurface() {+ this._material.geometryThinWalled = 1, this._material.subsurfaceScatterAnisotropy = 1;+ }+ /**+ * Sets the subsurface weight+ */+ set subsurfaceWeight(e) {+ this._material.subsurfaceWeight = e;+ }+ get subsurfaceWeight() {+ return this._material.subsurfaceWeight;+ }+ /**+ * Sets the subsurface weight texture+ */+ set subsurfaceWeightTexture(e) {+ this._material.subsurfaceWeightTexture = e;+ }+ /**+ * Sets the subsurface color.+ * @param value The subsurface tint color as a Color3+ */+ set subsurfaceColor(e) {+ this._material.subsurfaceColor = e;+ }+ /**+ * Sets the subsurface color texture.+ * @param value The subsurface tint texture or null+ */+ set subsurfaceColorTexture(e) {+ this._material.subsurfaceColorTexture = e;+ }+ /**+ * Sets the diffuse transmission tint of the material+ */+ set diffuseTransmissionTint(e) {+ this._diffuseTransmissionTint = e;+ }+ /**+ * Gets the diffuse transmission tint of the material+ */+ get diffuseTransmissionTint() {+ return this._diffuseTransmissionTint;+ }+ /**+ * Sets the diffuse transmission tint texture of the material+ */+ set diffuseTransmissionTintTexture(e) {+ this._diffuseTransmissionTintTexture = e;+ }+ /**+ * Gets the subsurface radius for subsurface scattering.+ * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.+ */+ get subsurfaceRadius() {+ return this._material.subsurfaceRadius;+ }+ /**+ * Sets the subsurface radius for subsurface scattering.+ * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.+ * @param value The subsurface radius value+ */+ set subsurfaceRadius(e) {+ this._material.subsurfaceRadius = e;+ }+ /**+ * Gets the subsurface radius scale for subsurface scattering.+ * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.+ */+ get subsurfaceRadiusScale() {+ return this._material.subsurfaceRadiusScale;+ }+ /**+ * Sets the subsurface radius scale for subsurface scattering.+ * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.+ * @param value The subsurface radius scale as a Color3+ */+ set subsurfaceRadiusScale(e) {+ this._material.subsurfaceRadiusScale = e;+ }+ /**+ * Sets the subsurface scattering anisotropy.+ * @param value The anisotropy intensity value+ */+ set subsurfaceScatterAnisotropy(e) {+ this._material.subsurfaceScatterAnisotropy = e;+ }+ /**+ * Does this material have a translucent surface (i.e. either transmission or subsurface)?+ * @returns True if the material is translucent, false otherwise+ */+ isTranslucent() {+ return this.transmissionWeight > 0 || this.subsurfaceWeight > 0;+ }+ // ========================================+ // FUZZ LAYER (Sheen)+ // ========================================+ /**+ * Configures fuzz for OpenPBR.+ * Enables fuzz and sets up proper configuration.+ */+ configureFuzz() {+ }+ /**+ * Sets the fuzz weight.+ * @param value The fuzz weight value+ */+ set fuzzWeight(e) {+ this._material.fuzzWeight = e;+ }+ /**+ * Sets the fuzz weight texture.+ * @param value The fuzz weight texture or null+ */+ set fuzzWeightTexture(e) {+ this._material.fuzzWeightTexture = e;+ }+ /**+ * Sets the fuzz color.+ * @param value The fuzz color as a Color3+ */+ set fuzzColor(e) {+ this._material.fuzzColor = e;+ }+ /**+ * Sets the fuzz color texture.+ * @param value The fuzz color texture or null+ */+ set fuzzColorTexture(e) {+ this._material.fuzzColorTexture = e;+ }+ /**+ * Sets the fuzz roughness.+ * @param value The fuzz roughness value (0-1)+ */+ set fuzzRoughness(e) {+ this._material.fuzzRoughness = e;+ }+ /**+ * Sets the fuzz roughness texture.+ * @param value The fuzz roughness texture or null+ */+ set fuzzRoughnessTexture(e) {+ this._material.fuzzRoughnessTexture = e, this._material._useFuzzRoughnessFromTextureAlpha = !0;+ }+ // ========================================+ // ANISOTROPY+ // ========================================+ /**+ * Sets the specular roughness anisotropy of the OpenPBR material.+ * @param value The anisotropy intensity value+ */+ set specularRoughnessAnisotropy(e) {+ this._material.specularRoughnessAnisotropy = e;+ }+ /**+ * Gets the specular roughness anisotropy of the OpenPBR material.+ * @returns The anisotropy intensity value+ */+ get specularRoughnessAnisotropy() {+ return this._material.specularRoughnessAnisotropy;+ }+ /**+ * Sets the anisotropy rotation angle.+ * @param value The anisotropy rotation angle in radians+ */+ set geometryTangentAngle(e) {+ this._material.geometryTangentAngle = e;+ }+ /**+ * Sets the geometry tangent texture for anisotropy.+ * Automatically enables using anisotropy from the tangent texture.+ * @param value The anisotropy texture or null+ */+ set geometryTangentTexture(e) {+ this._material.geometryTangentTexture = e, this._material._useSpecularRoughnessAnisotropyFromTangentTexture = !0;+ }+ /**+ * Gets the geometry tangent texture for anisotropy.+ * @returns The anisotropy texture or null+ */+ get geometryTangentTexture() {+ return this._material.geometryTangentTexture;+ }+ /**+ * Configures glTF-style anisotropy for the OpenPBR material.+ * @param useGltfStyle Whether to use glTF-style anisotropy+ */+ configureGltfStyleAnisotropy(e = !0) {+ this._material._useGltfStyleAnisotropy = e;+ }+ // ========================================+ // THIN FILM IRIDESCENCE+ // ========================================+ /**+ * Sets the thin film weight.+ * @param value The thin film weight value+ */+ set thinFilmWeight(e) {+ this._material.thinFilmWeight = e;+ }+ /**+ * Sets the thin film IOR.+ * @param value The thin film IOR value+ */+ set thinFilmIor(e) {+ this._material.thinFilmIor = e;+ }+ /**+ * Sets the thin film thickness minimum.+ * @param value The minimum thickness value in nanometers+ */+ set thinFilmThicknessMinimum(e) {+ this._material.thinFilmThicknessMin = e / 1e3;+ }+ /**+ * Sets the thin film thickness maximum.+ * @param value The maximum thickness value in nanometers+ */+ set thinFilmThicknessMaximum(e) {+ this._material.thinFilmThickness = e / 1e3;+ }+ /**+ * Sets the thin film weight texture.+ * @param value The thin film weight texture or null+ */+ set thinFilmWeightTexture(e) {+ this._material.thinFilmWeightTexture = e;+ }+ /**+ * Sets the thin film thickness texture.+ * @param value The thin film thickness texture or null+ */+ set thinFilmThicknessTexture(e) {+ this._material.thinFilmThicknessTexture = e, this._material._useThinFilmThicknessFromTextureGreen = !0;+ }+ // ========================================+ // UNLIT MATERIALS+ // ========================================+ /**+ * Sets whether the OpenPBR material is unlit.+ * @param value True to make the material unlit+ */+ set unlit(e) {+ this._material.unlit = e;+ }+ // ========================================+ // GEOMETRY PARAMETERS+ // ========================================+ /**+ * Sets the geometry opacity of the OpenPBR material.+ * @param value The opacity value (0-1)+ */+ set geometryOpacity(e) {+ this._material.geometryOpacity = e;+ }+ /**+ * Gets the geometry opacity of the OpenPBR material.+ * @returns The opacity value (0-1)+ */+ get geometryOpacity() {+ return this._material.geometryOpacity;+ }+ /**+ * Sets the geometry normal texture of the OpenPBR material.+ * @param value The normal texture or null+ */+ set geometryNormalTexture(e) {+ this._material.geometryNormalTexture = e;+ }+ /**+ * Gets the geometry normal texture of the OpenPBR material.+ * @returns The normal texture or null+ */+ get geometryNormalTexture() {+ return this._material.geometryNormalTexture;+ }+ /**+ * Sets the normal map inversions for the OpenPBR material.+ * Note: OpenPBR may handle normal map inversions differently or may not need them.+ * @param invertX Whether to invert the normal map on the X axis (may be ignored)+ * @param invertY Whether to invert the normal map on the Y axis (may be ignored)+ */+ setNormalMapInversions(e, s) {+ }+ /**+ * Sets the geometry coat normal texture of the OpenPBR material.+ * @param value The coat normal texture or null+ */+ set geometryCoatNormalTexture(e) {+ this._material.geometryCoatNormalTexture = e;+ }+ /**+ * Gets the geometry coat normal texture of the OpenPBR material.+ * @returns The coat normal texture or null+ */+ get geometryCoatNormalTexture() {+ return this._material.geometryCoatNormalTexture;+ }+ /**+ * Sets the geometry coat normal texture scale.+ * @param value The scale value for the coat normal texture+ */+ set geometryCoatNormalTextureScale(e) {+ this._material.geometryCoatNormalTexture && (this._material.geometryCoatNormalTexture.level = e);+ }+ finalize() {+ (this._diffuseTransmissionTint && !this._diffuseTransmissionTint.equals(t.White()) || this._diffuseTransmissionTintTexture) && (this._material.geometryThinWalled ? (this.subsurfaceColor = this._diffuseTransmissionTint, this.subsurfaceColorTexture = this._diffuseTransmissionTintTexture) : this._material.coatWeight == 0 && (!this.baseColor.equals(t.White()) || this.baseColorTexture) && (this._material.coatWeight = this.subsurfaceWeight, this._material.coatWeightTexture = this.subsurfaceWeightTexture, this._material.coatColor = this._diffuseTransmissionTint, this._material.coatColorTexture = this._diffuseTransmissionTintTexture, this._material.coatIor = this._material.specularIor, this._material.coatDarkening = 0, this._material.coatRoughness = this._material.specularRoughness, this._material.coatRoughnessTexture = this._material.specularRoughnessTexture, this._material.specularRoughness = 1, this._material.specularRoughnessTexture = null)), this.transmissionWeight > 0 && (this._material.geometryThinWalled || this._material.transmissionDepth === 0 ? (this._material.transmissionColor = this._material.baseColor, this._material.transmissionColorTexture = this._material.baseColorTexture) : this._material.coatWeight == 0 && (!this.baseColor.equals(t.White()) || this.baseColorTexture !== null) && (this._material.coatWeight = this.transmissionWeight, this._material.coatWeightTexture = this.transmissionWeightTexture, this._material.coatColor = this.baseColor, this._material.coatColorTexture = this.baseColorTexture, this._material.coatIor = this._material.specularIor, this._material.coatDarkening = 0, this._material.coatRoughness = this._material.specularRoughness, this._material.coatRoughnessTexture = this._material.specularRoughnessTexture));+ }+}+export {+ a as OpenPBRMaterialLoadingAdapter+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-CbPvriUc.jsadded+74@@ -0,0 +1,74 @@+import { bW as i } from "./chunk-IERganv1.js";+const e = "normalVertexShader", f = `attribute position: vec3f;+#ifdef NORMAL+attribute normal: vec3f;+#endif+#ifdef UV1+attribute uv: vec2f;+#endif+#ifdef UV2+attribute uv2: vec2f;+#endif+#ifdef VERTEXCOLOR+attribute color: vec4f;+#endif+#include<bonesDeclaration>+#include<bakedVertexAnimationDeclaration>+#include<instancesDeclaration>+uniform view: mat4x4f;uniform viewProjection: mat4x4f;+#ifdef DIFFUSE+varying vDiffuseUV: vec2f;uniform diffuseMatrix: mat4x4f;uniform vDiffuseInfos: vec2f;+#endif+#ifdef POINTSIZE+uniform pointSize: f32;+#endif+varying vPositionW: vec3f;+#ifdef NORMAL+varying vNormalW: vec3f;+#endif+#include<clipPlaneVertexDeclaration>+#include<logDepthDeclaration>+#include<fogVertexDeclaration>+#include<__decl__lightVxFragment>[0..maxSimultaneousLights]+#if defined(CLUSTLIGHT_BATCH) && CLUSTLIGHT_BATCH>0+varying vViewDepth: f32;+#endif+#define CUSTOM_VERTEX_DEFINITIONS+@vertex+fn main(input : VertexInputs)->FragmentInputs {+#define CUSTOM_VERTEX_MAIN_BEGIN+#include<instancesVertex>+#include<bonesVertex>+#include<bakedVertexAnimation>+var worldPos: vec4f=finalWorld* vec4f(vertexInputs.position,1.0);vertexOutputs.position=uniforms.viewProjection*worldPos;vertexOutputs.vPositionW= worldPos.xyz;+#ifdef NORMAL+vertexOutputs.vNormalW=normalize(( finalWorld* vec4f(vertexInputs.normal,0.0)).xyz);+#endif+#ifndef UV1+var uv: vec2f= vec2f(0.,0.);+#else+var uv: vec2f=vertexInputs.uv;+#endif+#ifndef UV2+var uv2: vec2f= vec2f(0.,0.);+#else+var uv2: vec2f=vertexInputs.uv2;+#endif+#ifdef DIFFUSE+if (uniforms.vDiffuseInfos.x==0.)+{vertexOutputs.vDiffuseUV=(uniforms.diffuseMatrix* vec4f(uv,1.0,0.0)).xy;}+else+{vertexOutputs.vDiffuseUV=(uniforms.diffuseMatrix* vec4f(uv2,1.0,0.0)).xy;}+#endif+#include<clipPlaneVertex>+#include<logDepthVertex>+#include<fogVertex>+#include<shadowsVertex>[0..maxSimultaneousLights]+#define CUSTOM_VERTEX_MAIN_END+}+`;+i.ShadersStoreWGSL[e] || (i.ShadersStoreWGSL[e] = f);+const t = { name: e, shader: f };+export {+ t as normalVertexShaderWGSL+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-CeVapcuS.jsadded+31@@ -0,0 +1,31 @@+import { bX as n, bV as r, bY as a, bZ as h, R as p } from "./chunk-IERganv1.js";+class o extends n {+ /**+ * Creates a new FlowGraphPointerDownEventBlock.+ * @param config optional configuration+ */+ constructor(e) {+ super(e), this.type = "PointerDown", this.targetMesh = this.registerDataInput("targetMesh", r, e?.targetMesh), this.pointerId = this.registerDataOutput("pointerId", a), this.pickedMesh = this.registerDataOutput("pickedMesh", r), this.pickedPoint = this.registerDataOutput("pickedPoint", r);+ }+ /** @internal */+ _executeEvent(e, s) {+ const i = this.targetMesh.getValue(e), t = s.pickInfo?.pickedMesh;+ return i && !(t === i || t && h(t, i)) ? !0 : (this.pointerId.setValue(s.event.pointerId, e), this.pickedMesh.setValue(t ?? null, e), this.pickedPoint.setValue(s.pickInfo?.pickedPoint ?? null, e), this._execute(e), !this.config?.stopPropagation);+ }+ /** @internal */+ _preparePendingTasks(e) {+ }+ /** @internal */+ _cancelPendingTasks(e) {+ }+ /**+ * @returns the class name of the block.+ */+ getClassName() {+ return "FlowGraphPointerDownEventBlock";+ }+}+p("FlowGraphPointerDownEventBlock", o);+export {+ o as FlowGraphPointerDownEventBlock+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-CesoqJPD.jsadded+30@@ -0,0 +1,30 @@+import { ar as u, A as t, r, af as f, as as p, at as m, au as R } from "./chunk-CODtpsMq.js";+import { c8 as x } from "./chunk-IERganv1.js";+const d = ({ scene: n }) => {+ const [e, o] = r.useState("localhost"), [s, l] = r.useState(1234), c = r.useRef(null), i = r.useCallback(() => {+ c.current && c.current.close(), c.current = new x(n, e, s);+ }, [n, e, s]);+ return t.jsxs(t.Fragment, { children: [t.jsx(f, { label: "Hostname", value: e, onChange: (a) => o(a) }), t.jsx(p, { label: "Port", value: s, onChange: (a) => l(a), forceInt: !0 }), t.jsx(m, { label: "Connect", icon: R, onClick: i })] });+}, h = {+ friendlyName: "Reflector Tools",+ consumes: [u],+ factory: (n) => {+ const e = [];+ return e.push(n.addSectionContent({+ key: "Reflector",+ section: "Reflector",+ component: ({ context: o }) => t.jsx(d, { scene: o })+ })), {+ dispose: () => {+ e.forEach((o) => o.dispose());+ }+ };+ }+};+var g = {+ serviceDefinitions: [h]+};+export {+ h as ReflectorServiceDefinition,+ g as default+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-CktpeoLr.jsadded+2114@@ -0,0 +1,2114 @@+import { H as N, d as ke, i as z, T as v, cI as xe, cJ as re, aB as le, cK as Ae, cL as we, cM as $, cN as Q, bQ as _e, U as Y, bM as Ue, cO as Be, cP as De, cQ as ee, ai as Z, bH as b, ch as K, x as P, ak as ue, V as O, Q as W, o as A, aK as Ne, a3 as J, N as k, cR as te, J as ne, ah as We, ag as Le, bR as H, cS as oe, j as ae, a8 as Ke, O as Pe, aA as ye, F as ze, b5 as qe, aC as Ge, cT as $e, cU as He, cV as je } from "./chunk-IERganv1.js";+const L = 1e-6, j = new z(0.04, 0.04, 0.04), Qe = 1024, ce = z.White(), Te = z.BlackReadOnly;+function Ye(a) {+ switch (a) {+ case "image/jpeg":+ return ".jpg";+ case "image/png":+ return ".png";+ case "image/webp":+ return ".webp";+ case "image/avif":+ return ".avif";+ case "image/ktx2":+ return ".ktx2";+ }+}+function Oe(a) {+ switch (a) {+ case "image/jpeg":+ case "image/png":+ case "image/webp":+ case "image/avif":+ case "image/ktx2":+ return !0;+ default:+ return !1;+ }+}+async function Je(a) {+ const e = a.getInternalTexture();+ if (!e || e.source !== 1 || e.invertY)+ return null;+ const t = e._buffer;+ let s, n = a.mimeType;+ try {+ t ? ArrayBuffer.isView(t) ? s = t.buffer.slice(t.byteOffset, t.byteOffset + t.byteLength) : t instanceof ArrayBuffer ? s = t : t instanceof Blob ? (s = await t.arrayBuffer(), n = t.type || n) : typeof t == "string" ? (s = await N.LoadFileAsync(t), n = ee(t) || n) : typeof HTMLImageElement < "u" && t instanceof HTMLImageElement && (s = await N.LoadFileAsync(t.src), n = ee(t.src) || n) : (s = await N.LoadFileAsync(e.url), n = ee(e.url) || n);+ } catch {+ return null;+ }+ return s && Oe(n) ? new Blob([s], { type: n }) : null;+}+function Xe(a, e, t) {+ if (e < j.r)+ return 0;+ const s = j.r, n = a * t / (1 - j.r) + e - 2 * j.r, i = j.r - e, r = n * n - 4 * s * i;+ return _e.Clamp((-n + Math.sqrt(r)) / (2 * s), 0, 1);+}+function Ze(a) {+ const e = a.diffuseColor.toLinearSpace(a.getScene().getEngine().useExactSrgbConversions).scale(0.5), t = a.alpha, s = _e.Clamp(a.specularPower, 0, Qe), n = Be(s);+ return {+ baseColorFactor: [e.r, e.g, e.b, t],+ metallicFactor: 0,+ roughnessFactor: n+ };+}+function Ee(a, e) {+ e.needAlphaBlending() ? a.alphaMode = "BLEND" : e.needAlphaTesting() && (a.alphaMode = "MASK", a.alphaCutoff = e.alphaCutOff);+}+function Me(a, e, t) {+ const s = new Uint8Array(a * e * 4);+ for (let i = 0; i < s.length; i = i + 4)+ s[i] = s[i + 1] = s[i + 2] = s[i + 3] = 255;+ return De.CreateRGBATexture(s, a, e, t);+}+function Ce(a) {+ if (a instanceof Uint8Array) {+ const e = a.length, t = new Float32Array(a.length);+ for (let s = 0; s < e; ++s)+ t[s] = a[s] / 255;+ return t;+ } else {+ if (a instanceof Float32Array)+ return a;+ throw new Error("Unsupported pixel format!");+ }+}+class be {+ constructor(e) {+ this._exporter = e, this._textureMap = /* @__PURE__ */ new Map(), this._internalTextureToImage = {};+ }+ getTextureInfo(e) {+ return e ? this._textureMap.get(e.uniqueId) ?? null : null;+ }+ async exportStandardMaterialAsync(e, t) {+ const s = Ze(e), n = { name: e.name };+ if (e.backFaceCulling != null && !e.backFaceCulling && (e.twoSidedLighting || N.Warn(e.name + ": Back-face culling disabled and two-sided lighting disabled is not supported in glTF."), n.doubleSided = !0), t) {+ const r = [], o = e.diffuseTexture;+ o && r.push(this.exportTextureAsync(o).then((u) => {+ u && (s.baseColorTexture = u);+ }));+ const c = e.bumpTexture;+ c && r.push(this.exportTextureAsync(c).then((u) => {+ u && (n.normalTexture = u, c.level !== 1 && (n.normalTexture.scale = c.level));+ }));+ const h = e.emissiveTexture;+ h && (n.emissiveFactor = [1, 1, 1], r.push(this.exportTextureAsync(h).then((u) => {+ u && (n.emissiveTexture = u);+ })));+ const f = e.ambientTexture;+ f && r.push(this.exportTextureAsync(f).then((u) => {+ if (u) {+ const l = {+ index: u.index+ };+ n.occlusionTexture = l;+ }+ })), r.length > 0 && (this._exporter._materialNeedsUVsSet.add(e), await Promise.all(r));+ }+ (e.alpha < 1 || e.opacityTexture) && (e.alphaMode === ke.ALPHA_COMBINE ? n.alphaMode = "BLEND" : N.Warn(e.name + ": glTF 2.0 does not support alpha mode: " + e.alphaMode.toString())), e.emissiveColor && !e.emissiveColor.equalsWithEpsilon(Te, L) && (n.emissiveFactor = e.emissiveColor.asArray()), n.pbrMetallicRoughness = s, Ee(n, e), await this._finishMaterialAsync(n, e);+ const i = this._exporter._materials;+ return i.push(n), i.length - 1;+ }+ async _finishMaterialAsync(e, t) {+ const s = await this._exporter._extensionsPostExportMaterialAdditionalTexturesAsync("exportMaterial", e, t), n = [];+ for (const i of s)+ n.push(this.exportTextureAsync(i));+ await Promise.all(n), await this._exporter._extensionsPostExportMaterialAsync("exportMaterial", e, t);+ }+ /**+ * Resizes the two source textures to the same dimensions. If a texture is null, a default white texture is generated. If both textures are null, returns null+ * @param texture1 first texture to resize+ * @param texture2 second texture to resize+ * @param scene babylonjs scene+ * @returns resized textures or null+ */+ _resizeTexturesToSameDimensions(e, t, s) {+ const n = e ? e.getSize() : { width: 0, height: 0 }, i = t ? t.getSize() : { width: 0, height: 0 };+ let r, o;+ return n.width < i.width ? (e && e instanceof v ? r = xe.CreateResizedCopy(e, i.width, i.height, !0) : r = Me(i.width, i.height, s), o = t) : n.width > i.width ? (t && t instanceof v ? o = xe.CreateResizedCopy(t, n.width, n.height, !0) : o = Me(n.width, n.height, s), r = e) : (r = e, o = t), {+ texture1: r,+ texture2: o+ };+ }+ /**+ * Convert Specular Glossiness Textures to Metallic Roughness+ * See link below for info on the material conversions from PBR Metallic/Roughness and Specular/Glossiness+ * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/examples/convert-between-workflows-.js/babylon.pbrUtilities.js+ * @param diffuseTexture texture used to store diffuse information+ * @param specularGlossinessTexture texture used to store specular and glossiness information+ * @param factors specular glossiness material factors+ * @returns pbr metallic roughness interface or null+ */+ async _convertSpecularGlossinessTexturesToMetallicRoughnessAsync(e, t, s) {+ const n = new Array();+ if (!(e || t))+ return await Promise.reject("diffuse and specular glossiness textures are not defined!");+ const i = e ? e.getScene() : t ? t.getScene() : null;+ if (i) {+ const r = this._resizeTexturesToSameDimensions(e, t, i), o = r.texture1?.getSize();+ let c, h;+ const f = o.width, u = o.height, l = await r.texture1.readPixels(), m = await r.texture2.readPixels();+ if (l)+ c = Ce(l);+ else+ return await Promise.reject("Failed to retrieve pixels from diffuse texture!");+ if (m)+ h = Ce(m);+ else+ return await Promise.reject("Failed to retrieve pixels from specular glossiness texture!");+ const _ = h.byteLength, g = new Uint8Array(_), p = new Uint8Array(_), d = 4, w = new z(0, 0, 0);+ let y = 0, x = 0;+ for (let I = 0; I < u; ++I)+ for (let M = 0; M < f; ++M) {+ const T = (f * I + M) * d, U = new z(c[T], c[T + 1], c[T + 2]).toLinearSpace(i.getEngine().useExactSrgbConversions).multiply(s.diffuseColor), B = new z(h[T], h[T + 1], h[T + 2]).toLinearSpace(i.getEngine().useExactSrgbConversions).multiply(s.specularColor), F = h[T + 3] * s.glossiness, q = {+ diffuseColor: U,+ specularColor: B,+ glossiness: F+ }, D = this._convertSpecularGlossinessToMetallicRoughness(q);+ w.r = Math.max(w.r, D.baseColor.r), w.g = Math.max(w.g, D.baseColor.g), w.b = Math.max(w.b, D.baseColor.b), y = Math.max(y, D.metallic), x = Math.max(x, D.roughness), p[T] = D.baseColor.r * 255, p[T + 1] = D.baseColor.g * 255, p[T + 2] = D.baseColor.b * 255, p[T + 3] = r.texture1.hasAlpha ? c[T + 3] * 255 : 255, g[T] = 0, g[T + 1] = D.roughness * 255, g[T + 2] = D.metallic * 255, g[T + 3] = 255;+ }+ const E = {+ baseColor: w,+ metallic: y,+ roughness: x+ };+ let C = !1, S = !1;+ for (let I = 0; I < u; ++I)+ for (let M = 0; M < f; ++M) {+ const T = (f * I + M) * d;+ p[T] /= E.baseColor.r > L ? E.baseColor.r : 1, p[T + 1] /= E.baseColor.g > L ? E.baseColor.g : 1, p[T + 2] /= E.baseColor.b > L ? E.baseColor.b : 1;+ const B = z.FromInts(p[T], p[T + 1], p[T + 2]).toGammaSpace(i.getEngine().useExactSrgbConversions);+ p[T] = B.r * 255, p[T + 1] = B.g * 255, p[T + 2] = B.b * 255, B.equalsWithEpsilon(ce, L) || (S = !0), g[T + 1] /= E.roughness > L ? E.roughness : 1, g[T + 2] /= E.metallic > L ? E.metallic : 1, z.FromInts(255, g[T + 1], g[T + 2]).equalsWithEpsilon(ce, L) || (C = !0);+ }+ return C && n.push(re(g, f, u).then((I) => {+ E.metallicRoughnessTextureData = I;+ })), S && n.push(re(p, f, u).then((I) => {+ E.baseColorTextureData = I;+ })), await Promise.all(n).then(() => E);+ } else+ return await Promise.reject("_ConvertSpecularGlossinessTexturesToMetallicRoughness: Scene from textures is missing!");+ }+ /**+ * Converts specular glossiness material properties to metallic roughness+ * @param specularGlossiness interface with specular glossiness material properties+ * @returns interface with metallic roughness material properties+ */+ _convertSpecularGlossinessToMetallicRoughness(e) {+ const t = this._getPerceivedBrightness(e.diffuseColor), s = this._getPerceivedBrightness(e.specularColor), n = 1 - this._getMaxComponent(e.specularColor), i = Xe(t, s, n), r = e.diffuseColor.scale(n / (1 - j.r) / Math.max(1 - i, L)), o = e.specularColor.subtract(j.scale(1 - i)).scale(1 / Math.max(i, L));+ let c = z.Lerp(r, o, i * i);+ return c = c.clampToRef(0, 1, c), {+ baseColor: c,+ metallic: i,+ roughness: 1 - e.glossiness+ };+ }+ /**+ * Calculates the surface reflectance, independent of lighting conditions+ * @param color Color source to calculate brightness from+ * @returns number representing the perceived brightness, or zero if color is undefined+ */+ _getPerceivedBrightness(e) {+ return Math.sqrt(0.299 * e.r * e.r + 0.587 * e.g * e.g + 0.114 * e.b * e.b);+ }+ /**+ * Returns the maximum color component value+ * @param color+ * @returns maximum color component value, or zero if color is null or undefined+ */+ _getMaxComponent(e) {+ return Math.max(e.r, Math.max(e.g, e.b));+ }+ /**+ * Convert a PBRMaterial (Metallic/Roughness) to Metallic Roughness factors+ * @param baseColor Base color of the material+ * @param metallic Metallic factor of the material+ * @param roughness Roughness factor of the material+ * @param albedoTexture Albedo texture of the material+ * @param metallicTexture Metallic texture of the material+ * @param roughnessTexture Roughness texture of the material+ * @param babylonPBRMaterial BJS PBR Metallic Roughness Material+ * @param glTFPbrMetallicRoughness glTF PBR Metallic Roughness interface+ * @param hasUVs specifies if texture coordinates are present on the submesh to determine if textures should be applied+ * @returns glTF PBR Metallic Roughness factors+ */+ async _convertMetalRoughFactorsToMetallicRoughnessAsync(e, t, s, n, i, r, o, c, h) {+ const f = [], u = {+ baseColor: e,+ metallic: t,+ roughness: s+ };+ if (h)+ if (o instanceof le) {+ if (o.geometryOpacityTexture) {+ const l = n && n.getInternalTexture() ? n.getInternalTexture().uniqueId : 0, m = o.geometryOpacityTexture && o.geometryOpacityTexture.getInternalTexture() ? o.geometryOpacityTexture.getInternalTexture().uniqueId : 0, _ = +`${l}${m}`, g = this._textureMap.get(_);+ g ? c.baseColorTexture = g : f.push(Ae("baseColorOpacityTexture", we(n ? $(n, 0) : Q(1), n ? $(n, 1) : Q(1), n ? $(n, 2) : Q(1), $(o.geometryOpacityTexture, 0)), o.getScene()).then(async (p) => {+ const d = await this.exportTextureAsync(p, _);+ d && (c.baseColorTexture = d);+ }));+ } else+ n && f.push(this.exportTextureAsync(n).then((l) => {+ l && (c.baseColorTexture = l);+ }));+ if (o._useMetallicFromMetallicTextureBlue && i)+ f.push(this.exportTextureAsync(i).then((l) => {+ l && (c.metallicRoughnessTexture = l);+ }));+ else if (r || i) {+ const l = i && i.getInternalTexture() ? i.getInternalTexture().uniqueId : 0, m = r && r.getInternalTexture() ? r.getInternalTexture().uniqueId : 0, _ = +`${l}${m}`, g = this._textureMap.get(_);+ g ? c.metallicRoughnessTexture = g : f.push(Ae("MetalRoughTexture", we(o.ambientOcclusionTexture ? $(o.ambientOcclusionTexture, 0) : Q(1), r ? $(r, 0) : Q(1), i ? $(i, 0) : Q(1)), o.getScene()).then(async (p) => {+ const d = await this.exportTextureAsync(p, _);+ d && (c.metallicRoughnessTexture = d);+ }));+ }+ } else+ n && f.push(this.exportTextureAsync(n).then((l) => {+ l && (c.baseColorTexture = l);+ })), i && f.push(this.exportTextureAsync(i).then((l) => {+ l && (c.metallicRoughnessTexture = l);+ }));+ return f.length > 0 && (this._exporter._materialNeedsUVsSet.add(o), await Promise.all(f)), u;+ }+ _getTextureSampler(e) {+ const t = {};+ if (!e || !(e instanceof v))+ return t;+ const s = this._getGLTFTextureWrapMode(e.wrapU);+ s !== 10497 && (t.wrapS = s);+ const n = this._getGLTFTextureWrapMode(e.wrapV);+ switch (n !== 10497 && (t.wrapT = n), e.samplingMode) {+ case v.LINEAR_LINEAR: {+ t.magFilter = 9729, t.minFilter = 9729;+ break;+ }+ case v.LINEAR_NEAREST: {+ t.magFilter = 9729, t.minFilter = 9728;+ break;+ }+ case v.NEAREST_LINEAR: {+ t.magFilter = 9728, t.minFilter = 9729;+ break;+ }+ case v.NEAREST_LINEAR_MIPLINEAR: {+ t.magFilter = 9728, t.minFilter = 9987;+ break;+ }+ case v.NEAREST_NEAREST: {+ t.magFilter = 9728, t.minFilter = 9728;+ break;+ }+ case v.NEAREST_LINEAR_MIPNEAREST: {+ t.magFilter = 9728, t.minFilter = 9985;+ break;+ }+ case v.LINEAR_NEAREST_MIPNEAREST: {+ t.magFilter = 9729, t.minFilter = 9984;+ break;+ }+ case v.LINEAR_NEAREST_MIPLINEAR: {+ t.magFilter = 9729, t.minFilter = 9986;+ break;+ }+ case v.NEAREST_NEAREST_MIPLINEAR: {+ t.magFilter = 9728, t.minFilter = 9986;+ break;+ }+ case v.LINEAR_LINEAR_MIPLINEAR: {+ t.magFilter = 9729, t.minFilter = 9987;+ break;+ }+ case v.LINEAR_LINEAR_MIPNEAREST: {+ t.magFilter = 9729, t.minFilter = 9985;+ break;+ }+ case v.NEAREST_NEAREST_MIPNEAREST: {+ t.magFilter = 9728, t.minFilter = 9984;+ break;+ }+ }+ return t;+ }+ _getGLTFTextureWrapMode(e) {+ switch (e) {+ case v.WRAP_ADDRESSMODE:+ return 10497;+ case v.CLAMP_ADDRESSMODE:+ return 33071;+ case v.MIRROR_ADDRESSMODE:+ return 33648;+ default:+ return N.Error(`Unsupported Texture Wrap Mode ${e}!`), 10497;+ }+ }+ /**+ * Convert a PBRMaterial (Specular/Glossiness) to Metallic Roughness factors+ * @param babylonPBRMaterial BJS PBR Metallic Roughness Material+ * @param pbrMetallicRoughness glTF PBR Metallic Roughness interface+ * @param hasUVs specifies if texture coordinates are present on the submesh to determine if textures should be applied+ * @returns glTF PBR Metallic Roughness factors+ */+ async _convertSpecGlossFactorsToMetallicRoughnessAsync(e, t, s) {+ const n = {+ diffuseColor: e._albedoColor,+ specularColor: e._reflectivityColor,+ glossiness: e._microSurface+ }, i = e._albedoTexture, r = e._reflectivityTexture, o = e._useMicroSurfaceFromReflectivityMapAlpha;+ if (r && !o)+ return await Promise.reject("_ConvertPBRMaterial: Glossiness values not included in the reflectivity texture are currently not supported");+ if ((i || r) && s) {+ this._exporter._materialNeedsUVsSet.add(e);+ const c = this._exportTextureSampler(i || r), h = await this._convertSpecularGlossinessTexturesToMetallicRoughnessAsync(i, r, n), f = this._exporter._textures;+ if (h.baseColorTextureData) {+ const u = await this._exportImageAsync(`baseColor${f.length}`, h.baseColorTextureData);+ t.baseColorTexture = this._exportTextureInfo(u, c, i?.coordinatesIndex);+ }+ if (h.metallicRoughnessTextureData) {+ const u = await this._exportImageAsync(`metallicRoughness${f.length}`, h.metallicRoughnessTextureData);+ t.metallicRoughnessTexture = this._exportTextureInfo(u, c, r?.coordinatesIndex);+ }+ return h;+ } else+ return this._convertSpecularGlossinessToMetallicRoughness(n);+ }+ async exportPBRMaterialAsync(e, t) {+ const s = {}, n = {+ name: e.name+ }, i = e.isMetallicWorkflow();+ if (i) {+ const c = e._albedoColor, h = e.alpha;+ c && (s.baseColorFactor = [c.r, c.g, c.b, h]);+ }+ const r = i ? await this._convertMetalRoughFactorsToMetallicRoughnessAsync(e._albedoColor, e._metallic, e._roughness, e._albedoTexture, e._metallicTexture, e._metallicTexture, e, s, t) : await this._convertSpecGlossFactorsToMetallicRoughnessAsync(e, s, t);+ await this._setMetallicRoughnessPbrMaterialAsync(r, e, n, s, t), await this._finishMaterialAsync(n, e);+ const o = this._exporter._materials;+ return o.push(n), o.length - 1;+ }+ async _setMetallicRoughnessPbrMaterialAsync(e, t, s, n, i) {+ if (Ee(s, t), (!e.baseColor.equalsWithEpsilon(ce, L) || !_e.WithinEpsilon(t.alpha, 1, L)) && (n.baseColorFactor = [e.baseColor.r, e.baseColor.g, e.baseColor.b, t.alpha]), e.metallic != null && e.metallic !== 1 && (n.metallicFactor = e.metallic), e.roughness != null && e.roughness !== 1 && (n.roughnessFactor = e.roughness), t.backFaceCulling != null && !t.backFaceCulling && (t._twoSidedLighting || N.Warn(t.name + ": Back-face culling disabled and two-sided lighting disabled is not supported in glTF."), s.doubleSided = !0), i) {+ const o = [], c = t instanceof Y ? t._bumpTexture : t.geometryNormalTexture;+ c && o.push(this.exportTextureAsync(c).then((u) => {+ u && (s.normalTexture = u, c.level !== 1 && (s.normalTexture.scale = c.level));+ }));+ const h = t instanceof Y ? t._ambientTexture : t.ambientOcclusionTexture;+ h && o.push(new Promise(async (u) => {+ if (t instanceof le && n.metallicRoughnessTexture) {+ const l = this._exportTextureSampler(h), m = this._exporter._textures[n.metallicRoughnessTexture.index].source, _ = this._exportTextureInfo(m, l, h.coordinatesIndex);+ return this._textureMap.set(h.uniqueId, _), this._exporter._extensionsPostExportTextures("exporter", _, h), u(_);+ } else+ return u(await this.exportTextureAsync(h));+ }).then(async (u) => {+ if (u) {+ const l = {+ index: u.index,+ texCoord: u.texCoord,+ extensions: u.extensions+ };+ s.occlusionTexture = l, t instanceof Y ? l.strength = t._ambientTextureStrength : l.strength = t.ambientOcclusionTexture.level;+ }+ }));+ const f = t instanceof Y ? t._emissiveTexture : t.emissionColorTexture;+ f && o.push(this.exportTextureAsync(f).then((u) => {+ u && (s.emissiveTexture = u);+ })), o.length > 0 && (this._exporter._materialNeedsUVsSet.add(t), await Promise.all(o));+ }+ const r = t instanceof Y ? t._emissiveColor : t.emissionColor;+ r.equalsWithEpsilon(Te, L) || (s.emissiveFactor = r.asArray()), s.pbrMetallicRoughness = n;+ }+ async exportOpenPBRMaterialAsync(e, t) {+ const s = {}, n = {+ name: e.name+ }, i = e.baseColor, r = e.geometryOpacity;+ i && (s.baseColorFactor = [i.r, i.g, i.b, r]);+ const o = await this._convertMetalRoughFactorsToMetallicRoughnessAsync(e.baseColor, e.baseMetalness, e.specularRoughness, e.baseColorTexture, e.baseMetalnessTexture, e.specularRoughnessTexture, e, s, t);+ await this._setMetallicRoughnessPbrMaterialAsync(o, e, n, s, t), await this._finishMaterialAsync(n, e);+ const c = this._exporter._materials;+ return c.push(n), c.length - 1;+ }+ async exportTextureAsync(e, t = null) {+ let s = this._textureMap.get(t ?? e.uniqueId);+ if (s)+ return s;+ const n = this._exportTextureSampler(e), i = await this._exportTextureImageAsync(e);+ return s = this._exportTextureInfo(i, n, e.coordinatesIndex), this._textureMap.set(t ?? e.uniqueId, s), this._exporter._extensionsPostExportTextures("exporter", s, e), s;+ }+ async _exportTextureImageAsync(e) {+ const t = e.mimeType ?? "none", s = this._internalTextureToImage, n = e.getInternalTexture().uniqueId;+ s[n] = s[n] || {};+ let i = s[n][t];+ return i === void 0 && (i = (async () => {+ const r = await Je(e);+ if (r && (t === "none" || r.type === t))+ return await this._exportImageAsync(e.name, r);+ let o = "image/png";+ t !== "none" && (Oe(t) ? o = t : (o = "image/png", N.Warn(`Unsupported media type: ${t}. Exporting texture as PNG.`)));+ const c = e.getSize(), h = await Ue(e), f = await re(h, c.width, c.height, o);+ return await this._exportImageAsync(e.name, f);+ })(), s[n][t] = i), await i;+ }+ async _exportImageAsync(e, t) {+ const s = this._exporter._images;+ let n;+ if (this._exporter._shouldUseGlb) {+ n = {+ name: e,+ mimeType: t.type,+ bufferView: void 0+ // Will be updated later by BufferManager+ };+ const i = await t.arrayBuffer(), r = this._exporter._bufferManager.createBufferView(new Uint8Array(i));+ this._exporter._bufferManager.setBufferView(n, r);+ } else {+ const i = e.replace(/\.\/|\/|\.\\|\\/g, "_"), r = Ye(t.type);+ let o = i + r;+ s.some((c) => c.uri === o) && (o = `${i}_${N.RandomId()}${r}`), n = {+ name: e,+ uri: o+ }, this._exporter._imageData[o] = t;+ }+ return s.push(n), s.length - 1;+ }+ _exportTextureInfo(e, t, s) {+ const n = this._exporter._textures;+ let i = n.findIndex((o) => o.sampler == t && o.source === e);+ i === -1 && (i = n.length, n.push({+ source: e,+ sampler: t+ }));+ const r = { index: i };+ return s && (r.texCoord = s), r;+ }+ _exportTextureSampler(e) {+ const t = this._getTextureSampler(e), s = this._exporter._samplers, n = s.findIndex((i) => i.minFilter === t.minFilter && i.magFilter === t.magFilter && i.wrapS === t.wrapS && i.wrapT === t.wrapT);+ return n !== -1 ? n : (s.push(t), s.length - 1);+ }+}+class Ie {+ constructor() {+ this.files = {};+ }+ /**+ * @deprecated Use files instead+ */+ get glTFFiles() {+ return this.files;+ }+ /**+ * Downloads the glTF data as files based on their names and data+ */+ downloadFiles() {+ for (const e in this.files) {+ const t = this.files[e], s = new Blob([t], { type: ee(e) });+ N.Download(s, e);+ }+ }+}+const pe = b.Compose(new O(-1, 1, 1), W.Identity(), O.Zero());+function et(a, e) {+ if (!(a instanceof Z))+ return !1;+ if (e) {+ if (!a.getWorldMatrix().equalsWithEpsilon(b.IdentityReadOnly, K))+ return !1;+ } else if (!a.getWorldMatrix().multiplyToRef(pe, P.Matrix[0]).equalsWithEpsilon(b.IdentityReadOnly, K))+ return !1;+ return !(a instanceof ue && a.geometry);+}+const se = O.ZeroReadOnly, me = W.Identity(), ie = O.OneReadOnly, tt = new O(-1, 1, 1);+function fe(a, e) {+ const { byteOffset: t, byteStride: s, type: n, normalized: i } = a, r = a.getSize(), o = e.reduce((f, u) => u.getTotalVertices() > f ? u.getTotalVertices() : f, -Number.MAX_VALUE), c = o * r, h = a.getKind();+ return { byteOffset: t, byteStride: s, componentCount: r, type: n, count: c, normalized: i, totalVertices: o, kind: h };+}+function st(a) {+ switch (a) {+ case "MAT2":+ return 4;+ case "MAT3":+ return 9;+ case "MAT4":+ return 16;+ case "SCALAR":+ return 1;+ case "VEC2":+ return 2;+ case "VEC3":+ return 3;+ case "VEC4":+ return 4;+ }+}+function nt(a) {+ return a.some((e) => e >= 256);+}+function Se(a) {+ switch (a) {+ case A.PositionKind:+ case A.NormalKind:+ case A.TangentKind:+ case A.ColorKind:+ case A.MatricesIndicesKind:+ case A.MatricesIndicesExtraKind:+ case A.MatricesWeightsKind:+ case A.MatricesWeightsExtraKind:+ case A.UVKind:+ case A.UV2Kind:+ case A.UV3Kind:+ case A.UV4Kind:+ case A.UV5Kind:+ case A.UV6Kind:+ return !0;+ }+ return !1;+}+function it(a, e) {+ if (a == A.ColorKind)+ return e ? "VEC4" : "VEC3";+ switch (a) {+ case A.PositionKind:+ case A.NormalKind:+ return "VEC3";+ case A.TangentKind:+ case A.MatricesIndicesKind:+ case A.MatricesIndicesExtraKind:+ case A.MatricesWeightsKind:+ case A.MatricesWeightsExtraKind:+ return "VEC4";+ case A.UVKind:+ case A.UV2Kind:+ case A.UV3Kind:+ case A.UV4Kind:+ case A.UV5Kind:+ case A.UV6Kind:+ return "VEC2";+ }+ throw new Error(`Unknown kind ${a}`);+}+function rt(a) {+ switch (a) {+ case A.PositionKind:+ return "POSITION";+ case A.NormalKind:+ return "NORMAL";+ case A.TangentKind:+ return "TANGENT";+ case A.ColorKind:+ return "COLOR_0";+ case A.UVKind:+ return "TEXCOORD_0";+ case A.UV2Kind:+ return "TEXCOORD_1";+ case A.UV3Kind:+ return "TEXCOORD_2";+ case A.UV4Kind:+ return "TEXCOORD_3";+ case A.UV5Kind:+ return "TEXCOORD_4";+ case A.UV6Kind:+ return "TEXCOORD_5";+ case A.MatricesIndicesKind:+ return "JOINTS_0";+ case A.MatricesIndicesExtraKind:+ return "JOINTS_1";+ case A.MatricesWeightsKind:+ return "WEIGHTS_0";+ case A.MatricesWeightsExtraKind:+ return "WEIGHTS_1";+ }+ throw new Error(`Unknown kind: ${a}`);+}+function ot(a) {+ switch (a) {+ case k.TriangleFillMode:+ return 4;+ case k.TriangleStripDrawMode:+ return 5;+ case k.TriangleFanDrawMode:+ return 6;+ case k.PointListDrawMode:+ case k.PointFillMode:+ return 0;+ case k.LineLoopDrawMode:+ return 2;+ case k.LineListDrawMode:+ return 1;+ case k.LineStripDrawMode:+ return 3;+ }+ throw new Error(`Unknown fill mode: ${a}`);+}+function at(a) {+ switch (a) {+ case k.TriangleFillMode:+ case k.TriangleStripDrawMode:+ case k.TriangleFanDrawMode:+ return !0;+ }+ return !1;+}+function Ve(a) {+ const e = Math.sqrt(a.x * a.x + a.y * a.y + a.z * a.z);+ e > 0 && (a.x /= e, a.y /= e, a.z /= e);+}+function de(a) {+ return a.x *= -1, a;+}+function ct(a) {+ return pe.invertToRef(P.Matrix[0]).multiplyToRef(a, a).multiplyToRef(pe, a), a;+}+function ge(a) {+ if (a.x * a.x + a.y * a.y > 0.5) {+ const e = Math.abs(a.x), t = Math.abs(a.y);+ if (e > t) {+ const s = Math.sign(a.x);+ a.x = e, a.y *= -s, a.z *= -s, a.w *= s;+ } else {+ const s = Math.sign(a.y);+ a.x *= -s, a.y = t, a.z *= s, a.w *= -s;+ }+ } else {+ const e = Math.abs(a.z), t = Math.abs(a.w);+ if (e > t) {+ const s = Math.sign(a.z);+ a.x *= -s, a.y *= s, a.z = e, a.w *= -s;+ } else {+ const s = Math.sign(a.w);+ a.x *= s, a.y *= -s, a.z *= -s, a.w = t;+ }+ }+ return a;+}+function Fe(a) {+ a.copyFromFloats(-a.z, a.w, a.x, -a.y);+}+function ft(a, e) {+ const t = O.FromArrayToRef(e.translation || [0, 0, 0], 0, P.Vector3[0]), s = W.FromArrayToRef(e.rotation || [0, 0, 0, 1], 0, P.Quaternion[0]), n = b.ComposeToRef(ie, s, t, P.Matrix[0]), i = O.FromArrayToRef(a.translation || [0, 0, 0], 0, P.Vector3[2]), r = W.FromArrayToRef(a.rotation || [0, 0, 0, 1], 0, P.Quaternion[1]), o = b.ComposeToRef(ie, r, i, P.Matrix[1]);+ n.multiplyToRef(o, o), o.decompose(void 0, s, t), t.equalsWithEpsilon(se, K) ? delete e.translation : e.translation = t.asArray(), s.equalsWithEpsilon(me, K) ? delete e.rotation : e.rotation = s.asArray(), e.scale && delete e.scale;+}+function ht(a, e) {+ if (!(e instanceof Z) || !(e.getChildren().length === 1 && a.getChildren().length === 0 && a.parent === e))+ return !1;+ const s = a.getScene(), n = a instanceof Ne && !s.useRightHandedSystem ? tt : ie;+ return e.scaling.equalsWithEpsilon(n, K) ? !0 : (J.Warn(`Cannot collapse node ${a.name} into parent node ${e.name} with modified scaling.`), !1);+}+function lt(a, e, t, s) {+ let n = a;+ return (e !== 0 || t !== a.length) && (n = Array.isArray(a) ? a.slice(e, e + t) : a.subarray(e, e + t)), n instanceof Int32Array ? new Uint32Array(n.buffer, n.byteOffset, n.length) : Array.isArray(n) ? s ? new Uint32Array(n) : new Uint16Array(n) : n;+}+function ut(a) {+ if (a instanceof Array) {+ const e = new Float32Array(a);+ return new Uint8Array(e.buffer, e.byteOffset, e.byteLength);+ }+ return ArrayBuffer.isView(a) ? new Uint8Array(a.buffer, a.byteOffset, a.byteLength) : new Uint8Array(a);+}+function pt(a, e, t, s) {+ const { byteOffset: n, byteStride: i, type: r, normalized: o } = e, c = e.getSize(), h = new Array(c).fill(1 / 0), f = new Array(c).fill(-1 / 0);+ return te(a, n + t * i, i, c, r, s * c, o, (u) => {+ for (let l = 0; l < c; l++)+ h[l] = Math.min(h[l], u[l]), f[l] = Math.max(f[l], u[l]);+ }), { min: h, max: f };+}+const mt = /* @__PURE__ */ new Map([+ [Int8Array, (a, e, t) => a.setInt8(e, t)],+ [Uint8Array, (a, e, t) => a.setUint8(e, t)],+ [Uint8ClampedArray, (a, e, t) => a.setUint8(e, t)],+ [Int16Array, (a, e, t) => a.setInt16(e, t, !0)],+ [Uint16Array, (a, e, t) => a.setUint16(e, t, !0)],+ [Int32Array, (a, e, t) => a.setInt32(e, t, !0)],+ [Uint32Array, (a, e, t) => a.setUint32(e, t, !0)],+ [Float32Array, (a, e, t) => a.setFloat32(e, t, !0)],+ [Float64Array, (a, e, t) => a.setFloat64(e, t, !0)]+]);+class ve {+ writeTypedArray(e) {+ this._checkGrowBuffer(e.byteLength);+ const t = mt.get(e.constructor);+ for (let s = 0; s < e.length; s++)+ t(this._dataView, this._byteOffset, e[s]), this._byteOffset += e.BYTES_PER_ELEMENT;+ }+ constructor(e) {+ this._data = new Uint8Array(e), this._dataView = new DataView(this._data.buffer), this._byteOffset = 0;+ }+ get byteOffset() {+ return this._byteOffset;+ }+ getOutputData() {+ return new Uint8Array(this._data.buffer, 0, this._byteOffset);+ }+ writeUInt8(e) {+ this._checkGrowBuffer(1), this._dataView.setUint8(this._byteOffset, e), this._byteOffset++;+ }+ writeInt8(e) {+ this._checkGrowBuffer(1), this._dataView.setInt8(this._byteOffset, e), this._byteOffset++;+ }+ writeInt16(e) {+ this._checkGrowBuffer(2), this._dataView.setInt16(this._byteOffset, e, !0), this._byteOffset += 2;+ }+ writeUInt16(e) {+ this._checkGrowBuffer(2), this._dataView.setUint16(this._byteOffset, e, !0), this._byteOffset += 2;+ }+ writeInt32(e) {+ this._checkGrowBuffer(4), this._dataView.setInt32(this._byteOffset, e, !0), this._byteOffset += 4;+ }+ writeUInt32(e) {+ this._checkGrowBuffer(4), this._dataView.setUint32(this._byteOffset, e, !0), this._byteOffset += 4;+ }+ writeFloat32(e) {+ this._checkGrowBuffer(4), this._dataView.setFloat32(this._byteOffset, e, !0), this._byteOffset += 4;+ }+ writeFloat64(e) {+ this._checkGrowBuffer(8), this._dataView.setFloat64(this._byteOffset, e, !0), this._byteOffset += 8;+ }+ _checkGrowBuffer(e) {+ const t = this.byteOffset + e;+ if (t > this._data.byteLength) {+ const s = new Uint8Array(t * 2);+ s.set(this._data), this._data = s, this._dataView = new DataView(this._data.buffer);+ }+ }+}+function Re(a) {+ return a % 4 === 0 ? 4 : a % 2 === 0 ? 2 : 1;+}+class dt {+ constructor() {+ this._bufferViewToData = /* @__PURE__ */ new Map(), this._bufferViewToProperties = /* @__PURE__ */ new Map(), this._accessorToBufferView = /* @__PURE__ */ new Map();+ }+ /**+ * Generates a binary buffer from the stored bufferViews. Also populates the bufferViews list.+ * @param bufferViews The list of bufferViews to be populated while writing the binary+ * @returns The binary buffer+ */+ generateBinary(e) {+ let t = 0;+ this._bufferViewToData.forEach((i) => {+ t += i.byteLength;+ });+ const s = new ve(t), n = Array.from(this._bufferViewToData.keys()).sort((i, r) => Re(r.byteLength) - Re(i.byteLength));+ for (const i of n) {+ i.byteOffset = s.byteOffset, e.push(i);+ const r = e.length - 1, o = this.getPropertiesWithBufferView(i);+ for (const c of o)+ c.bufferView = r;+ s.writeTypedArray(this._bufferViewToData.get(i)), this._bufferViewToData.delete(i);+ }+ return s.getOutputData();+ }+ /**+ * Creates a buffer view based on the supplied arguments+ * @param data a TypedArray to create the bufferView for+ * @param byteStride byte distance between consecutive elements+ * @returns bufferView for glTF+ */+ createBufferView(e, t) {+ const s = {+ buffer: 0,+ byteOffset: void 0,+ // byteOffset will be set later, when we write the binary and decide bufferView ordering+ byteLength: e.byteLength,+ byteStride: t+ };+ return this._bufferViewToData.set(s, e), s;+ }+ /**+ * Creates an accessor based on the supplied arguments and assigns it to the bufferView+ * @param bufferView The glTF bufferView referenced by this accessor+ * @param type The type of the accessor+ * @param componentType The datatype of components in the attribute+ * @param count The number of attributes referenced by this accessor+ * @param byteOffset The offset relative to the start of the bufferView in bytes+ * @param minMax Minimum and maximum value of each component in this attribute+ * @param normalized Specifies whether integer data values are normalized before usage+ * @returns accessor for glTF+ */+ createAccessor(e, t, s, n, i, r, o) {+ this._verifyBufferView(e);+ const c = {+ bufferView: void 0,+ // bufferView will be set to a real index later, once we write the binary and decide bufferView ordering+ componentType: s,+ count: n,+ type: t,+ min: r?.min,+ max: r?.max,+ normalized: o,+ byteOffset: i+ };+ return this.setBufferView(c, e), this._accessorToBufferView.set(c, e), c;+ }+ /**+ * Assigns a bufferView to a glTF object that references it+ * @param object The glTF object+ * @param bufferView The bufferView to assign+ */+ setBufferView(e, t) {+ this._verifyBufferView(t), this.getPropertiesWithBufferView(t).push(e);+ }+ /**+ * Removes buffer view from the binary data, as well as from all its known references+ * @param bufferView the bufferView to remove+ */+ removeBufferView(e) {+ const t = this.getPropertiesWithBufferView(e);+ for (const s of t)+ s.bufferView !== void 0 && delete s.bufferView;+ this._bufferViewToData.delete(e), this._bufferViewToProperties.delete(e), this._accessorToBufferView.forEach((s, n) => {+ s === e && (n.byteOffset !== void 0 && delete n.byteOffset, this._accessorToBufferView.delete(n));+ });+ }+ getBufferView(e) {+ const t = this._accessorToBufferView.get(e);+ return this._verifyBufferView(t), t;+ }+ getPropertiesWithBufferView(e) {+ return this._verifyBufferView(e), this._bufferViewToProperties.set(e, this._bufferViewToProperties.get(e) ?? []), this._bufferViewToProperties.get(e);+ }+ getData(e) {+ return this._verifyBufferView(e), this._bufferViewToData.get(e);+ }+ _verifyBufferView(e) {+ if (e === void 0 || !this._bufferViewToData.has(e))+ throw new Error(`BufferView ${e} not found in BufferManager.`);+ }+}+var X;+(function(a) {+ a[a.INTANGENT = 0] = "INTANGENT", a[a.OUTTANGENT = 1] = "OUTTANGENT";+})(X || (X = {}));+class V {+ /**+ * Determine if a node is transformable - ie has properties it should be part of animation of transformation.+ * @param babylonNode the node to test+ * @returns true if can be animated, false otherwise. False if the parameter is null or undefined.+ */+ static _IsTransformable(e) {+ return e && (e instanceof Z || e instanceof ne || e instanceof We);+ }+ /**+ * @ignore+ *+ * Creates glTF channel animation from BabylonJS animation.+ * @param babylonTransformNode - BabylonJS mesh.+ * @param animation - animation.+ * @param animationChannelTargetPath - The target animation channel.+ * @param useQuaternion - Specifies if quaternions are used.+ * @returns nullable IAnimationData+ */+ static _CreateNodeAnimation(e, t, s, n, i) {+ if (this._IsTransformable(e)) {+ const r = [], o = [], c = t.getKeys(), h = V._CalculateMinMaxKeyFrames(c), f = V._DeduceInterpolation(c, s, n), u = f.interpolationType, l = f.shouldBakeAnimation;+ if (l ? V._CreateBakedAnimation(e, t, s, h.min, h.max, t.framePerSecond, i, r, o, h, n) : u === "LINEAR" || u === "STEP" ? V._CreateLinearOrStepAnimation(e, t, s, r, o, n) : u === "CUBICSPLINE" ? V._CreateCubicSplineAnimation(e, t, s, r, o, n) : V._CreateBakedAnimation(e, t, s, h.min, h.max, t.framePerSecond, i, r, o, h, n), r.length && o.length)+ return {+ inputs: r,+ outputs: o,+ samplerInterpolation: u,+ inputsMin: l ? h.min : N.FloatRound(h.min / t.framePerSecond),+ inputsMax: l ? h.max : N.FloatRound(h.max / t.framePerSecond)+ };+ }+ return null;+ }+ static _DeduceAnimationInfo(e) {+ let t = null, s = "VEC3", n = !1;+ const i = e.targetProperty.split(".");+ switch (i[0]) {+ case "scaling": {+ t = "scale";+ break;+ }+ case "position": {+ t = "translation";+ break;+ }+ case "rotation": {+ s = "VEC4", t = "rotation";+ break;+ }+ case "rotationQuaternion": {+ s = "VEC4", n = !0, t = "rotation";+ break;+ }+ case "influence": {+ s = "SCALAR", t = "weights";+ break;+ }+ default:+ N.Error(`Unsupported animatable property ${i[0]}`);+ }+ return t ? { animationChannelTargetPath: t, dataAccessorType: s, useQuaternion: n } : (N.Error("animation channel target path and data accessor type could be deduced"), null);+ }+ /**+ * @ignore+ * Create node animations from the transform node animations+ * @param babylonNode+ * @param runtimeGLTFAnimation+ * @param idleGLTFAnimations+ * @param nodeMap+ * @param nodes+ * @param bufferManager+ * @param bufferViews+ * @param accessors+ * @param animationSampleRate+ */+ static _CreateNodeAnimationFromNodeAnimations(e, t, s, n, i, r, o, c, h, f, u) {+ let l;+ if (V._IsTransformable(e) && e.animations)+ for (const m of e.animations) {+ if (u && !u(m))+ continue;+ const _ = V._DeduceAnimationInfo(m);+ _ && (l = {+ name: m.name,+ samplers: [],+ channels: []+ }, V._AddAnimation(`${m.name}`, m.hasRunningRuntimeAnimations ? t : l, e, m, _.dataAccessorType, _.animationChannelTargetPath, n, r, o, c, _.useQuaternion, h, f), l.samplers.length && l.channels.length && s.push(l));+ }+ }+ /**+ * @ignore+ * Create individual morph animations from the mesh's morph target animation tracks+ * @param babylonNode+ * @param runtimeGLTFAnimation+ * @param idleGLTFAnimations+ * @param nodeMap+ * @param nodes+ * @param bufferManager+ * @param bufferViews+ * @param accessors+ * @param animationSampleRate+ */+ static _CreateMorphTargetAnimationFromMorphTargetAnimations(e, t, s, n, i, r, o, c, h, f, u) {+ let l;+ if (e instanceof Le) {+ const m = e.morphTargetManager;+ if (m)+ for (let _ = 0; _ < m.numTargets; ++_) {+ const g = m.getTarget(_);+ for (const p of g.animations) {+ if (u && !u(p))+ continue;+ const d = new H(`${p.name}`, "influence", p.framePerSecond, p.dataType, p.loopMode, p.enableBlending), w = [], y = p.getKeys();+ for (let E = 0; E < y.length; ++E) {+ const C = y[E];+ for (let S = 0; S < m.numTargets; ++S)+ S == _ ? w.push(C) : w.push({ frame: C.frame, value: 0 });+ }+ d.setKeys(w, !0);+ const x = V._DeduceAnimationInfo(d);+ x && (l = {+ name: d.name,+ samplers: [],+ channels: []+ }, V._AddAnimation(p.name, p.hasRunningRuntimeAnimations ? t : l, e, d, x.dataAccessorType, x.animationChannelTargetPath, n, r, o, c, x.useQuaternion, h, f, m.numTargets), l.samplers.length && l.channels.length && s.push(l));+ }+ }+ }+ }+ /**+ * @internal+ * Create node and morph animations from the animation groups+ * @param babylonScene+ * @param glTFAnimations+ * @param nodeMap+ * @param nodes+ * @param bufferManager+ * @param bufferViews+ * @param accessors+ * @param animationSampleRate+ */+ static _CreateNodeAndMorphAnimationFromAnimationGroups(e, t, s, n, i, r, o, c, h) {+ let f;+ if (e.animationGroups) {+ const u = e.animationGroups;+ for (const l of u) {+ const m = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Map(), g = /* @__PURE__ */ new Set(), p = l.to - l.from;+ f = {+ name: l.name,+ channels: [],+ samplers: []+ };+ for (let d = 0; d < l.targetedAnimations.length; ++d) {+ const w = l.targetedAnimations[d], y = w.target, x = w.animation;+ if (h && !h(x))+ continue;+ const E = c.has(y);+ if (this._IsTransformable(y) || y.length === 1 && this._IsTransformable(y[0])) {+ const C = V._DeduceAnimationInfo(w.animation);+ if (C) {+ const S = this._IsTransformable(y) ? y : this._IsTransformable(y[0]) ? y[0] : null;+ S && V._AddAnimation(`${x.name}`, f, S, x, C.dataAccessorType, C.animationChannelTargetPath, s, n, i, r, C.useQuaternion, o, E);+ }+ } else if ((y instanceof oe || y.length === 1 && y[0] instanceof oe) && V._DeduceAnimationInfo(w.animation)) {+ const S = y instanceof oe ? y : y[0];+ if (S) {+ const I = e.morphTargetManagers.find((M) => {+ for (let T = 0; T < M.numTargets; ++T)+ if (M.getTarget(T) === S)+ return !0;+ return !1;+ });+ if (I) {+ const M = e.meshes.find((T) => T.morphTargetManager === I);+ M && (m.has(M) || m.set(M, /* @__PURE__ */ new Map()), m.get(M)?.set(S, x), g.add(M), _.set(M, x));+ }+ }+ }+ }+ g.forEach((d) => {+ const w = d.morphTargetManager;+ let y = null;+ const x = [], C = _.get(d).getKeys(), S = C.length;+ for (let M = 0; M < S; ++M)+ for (let T = 0; T < w.numTargets; ++T) {+ const U = w.getTarget(T), B = m.get(d);+ if (B) {+ const F = B.get(U);+ F ? (y || (y = new H(`${l.name}_${d.name}_MorphWeightAnimation`, "influence", F.framePerSecond, H.ANIMATIONTYPE_FLOAT, F.loopMode, F.enableBlending)), x.push(F.getKeys()[M])) : x.push({+ frame: l.from + p / S * M,+ value: U.influence,+ inTangent: C[0].inTangent ? 0 : void 0,+ outTangent: C[0].outTangent ? 0 : void 0+ });+ }+ }+ y.setKeys(x, !0);+ const I = V._DeduceAnimationInfo(y);+ I && V._AddAnimation(`${l.name}_${d.name}_MorphWeightAnimation`, f, d, y, I.dataAccessorType, I.animationChannelTargetPath, s, n, i, r, I.useQuaternion, o, !1, w?.numTargets);+ }), f.channels.length && f.samplers.length && t.push(f);+ }+ }+ }+ static _AddAnimation(e, t, s, n, i, r, o, c, h, f, u, l, m, _) {+ const g = V._CreateNodeAnimation(s, n, r, u, l);+ let p, d, w, y, x, E;+ if (g) {+ if (_) {+ let q = 0, D;+ const G = [];+ for (; g.inputs.length > 0; )+ D = g.inputs.shift(), q % _ == 0 && G.push(D), q++;+ g.inputs = G;+ }+ const C = o.get(s), S = new Float32Array(g.inputs);+ p = c.createBufferView(S), d = c.createAccessor(p, "SCALAR", 5126, g.inputs.length, void 0, {+ min: [g.inputsMin],+ max: [g.inputsMax]+ }), f.push(d), w = f.length - 1;+ const I = new W(), M = new O(), T = new O(), U = s instanceof ne, B = st(i), F = new Float32Array(g.outputs.length * B);+ g.outputs.forEach(function(q, D) {+ let G = q;+ switch (r) {+ case "translation":+ m && (O.FromArrayToRef(q, 0, T), de(T), T.toArray(G));+ break;+ case "rotation":+ q.length === 4 ? W.FromArrayToRef(q, 0, I) : (G = new Array(4), O.FromArrayToRef(q, 0, M), W.FromEulerVectorToRef(M, I)), m && (ge(I), U && Fe(I)), I.toArray(G);+ break;+ }+ F.set(G, D * B);+ }), p = c.createBufferView(F), d = c.createAccessor(p, i, 5126, g.outputs.length), f.push(d), y = f.length - 1, x = {+ interpolation: g.samplerInterpolation,+ input: w,+ output: y+ }, t.samplers.push(x), E = {+ sampler: t.samplers.length - 1,+ target: {+ node: C,+ path: r+ }+ }, t.channels.push(E);+ }+ }+ /**+ * Create a baked animation+ * @param babylonTransformNode BabylonJS mesh+ * @param animation BabylonJS animation corresponding to the BabylonJS mesh+ * @param animationChannelTargetPath animation target channel+ * @param minFrame minimum animation frame+ * @param maxFrame maximum animation frame+ * @param fps frames per second of the animation+ * @param sampleRate+ * @param inputs input key frames of the animation+ * @param outputs output key frame data of the animation+ * @param minMaxFrames+ * @param minMaxFrames.min+ * @param minMaxFrames.max+ * @param useQuaternion specifies if quaternions should be used+ */+ static _CreateBakedAnimation(e, t, s, n, i, r, o, c, h, f, u) {+ let l;+ const m = W.Identity();+ let _ = null, g, p = null, d, w, y, x;+ f.min = N.FloatRound(n / r);+ const E = t.getKeys();+ for (let C = 0, S = E.length; C < S; ++C) {+ if (d = E[C], C + 1 < S)+ if (w = E[C + 1], d.value.equals && d.value.equals(w.value) || d.value === w.value)+ if (C === 0)+ x = d.frame;+ else+ continue;+ else+ x = w.frame;+ else {+ if (y = E[C - 1], d.value.equals && d.value.equals(y.value) || d.value === y.value)+ continue;+ x = i;+ }+ if (x)+ for (let I = d.frame; I <= x; I += o) {+ if (g = N.FloatRound(I / r), g === _)+ continue;+ _ = g, p = g;+ const M = {+ key: 0,+ repeatCount: 0,+ loopMode: t.loopMode+ };+ l = t._interpolate(I, M), V._SetInterpolatedValue(e, l, g, t, s, m, c, h, u);+ }+ }+ p && (f.max = p);+ }+ static _ConvertFactorToVector3OrQuaternion(e, t, s, n, i) {+ const r = V._GetBasePositionRotationOrScale(t, n, i), o = s.targetProperty.split("."), c = o ? o[1] : "", h = i ? W.FromArray(r).normalize() : O.FromArray(r);+ switch (c) {+ case "x":+ case "y":+ case "z": {+ h[c] = e;+ break;+ }+ case "w": {+ h.w = e;+ break;+ }+ default:+ N.Error(`glTFAnimation: Unsupported component name "${c}"!`);+ }+ return h;+ }+ static _SetInterpolatedValue(e, t, s, n, i, r, o, c, h) {+ let f;+ if (o.push(s), i === "weights") {+ c.push([t]);+ return;+ }+ n.dataType === H.ANIMATIONTYPE_FLOAT && (t = this._ConvertFactorToVector3OrQuaternion(t, e, n, i, h)), i === "rotation" ? (h ? r = t : (f = t, W.RotationYawPitchRollToRef(f.y, f.x, f.z, r)), c.push(r.asArray())) : (f = t, c.push(f.asArray()));+ }+ /**+ * Creates linear animation from the animation key frames+ * @param babylonTransformNode BabylonJS mesh+ * @param animation BabylonJS animation+ * @param animationChannelTargetPath The target animation channel+ * @param inputs Array to store the key frame times+ * @param outputs Array to store the key frame data+ * @param useQuaternion Specifies if quaternions are used in the animation+ */+ static _CreateLinearOrStepAnimation(e, t, s, n, i, r) {+ for (const o of t.getKeys())+ n.push(o.frame / t.framePerSecond), V._AddKeyframeValue(o, t, i, s, e, r);+ }+ /**+ * Creates cubic spline animation from the animation key frames+ * @param babylonTransformNode BabylonJS mesh+ * @param animation BabylonJS animation+ * @param animationChannelTargetPath The target animation channel+ * @param inputs Array to store the key frame times+ * @param outputs Array to store the key frame data+ * @param useQuaternion Specifies if quaternions are used in the animation+ */+ static _CreateCubicSplineAnimation(e, t, s, n, i, r) {+ t.getKeys().forEach(function(o) {+ n.push(o.frame / t.framePerSecond), V._AddSplineTangent(X.INTANGENT, i, s, "CUBICSPLINE", o, r), V._AddKeyframeValue(o, t, i, s, e, r), V._AddSplineTangent(X.OUTTANGENT, i, s, "CUBICSPLINE", o, r);+ });+ }+ static _GetBasePositionRotationOrScale(e, t, s) {+ let n;+ return t === "rotation" ? s ? n = (e.rotationQuaternion ?? W.Identity()).asArray() : n = (e.rotation ?? O.Zero()).asArray() : t === "translation" ? n = (e.position ?? O.Zero()).asArray() : n = (e.scaling ?? O.One()).asArray(), n;+ }+ /**+ * Adds a key frame value+ * @param keyFrame+ * @param animation+ * @param outputs+ * @param animationChannelTargetPath+ * @param babylonTransformNode+ * @param useQuaternion+ */+ static _AddKeyframeValue(e, t, s, n, i, r) {+ let o;+ const c = t.dataType;+ if (c === H.ANIMATIONTYPE_VECTOR3) {+ let h = e.value.asArray();+ if (n === "rotation") {+ const f = O.FromArray(h);+ h = W.RotationYawPitchRoll(f.y, f.x, f.z).asArray();+ }+ s.push(h);+ } else if (c === H.ANIMATIONTYPE_FLOAT) {+ if (n === "weights")+ s.push([e.value]);+ else if (o = this._ConvertFactorToVector3OrQuaternion(e.value, i, t, n, r), o) {+ if (n === "rotation") {+ const h = r ? o : W.RotationYawPitchRoll(o.y, o.x, o.z).normalize();+ s.push(h.asArray());+ }+ s.push(o.asArray());+ }+ } else c === H.ANIMATIONTYPE_QUATERNION ? s.push(e.value.normalize().asArray()) : N.Error("glTFAnimation: Unsupported key frame values for animation!");+ }+ /**+ * @internal+ * Determine the interpolation based on the key frames+ * @param keyFrames+ * @param animationChannelTargetPath+ * @param useQuaternion+ */+ static _DeduceInterpolation(e, t, s) {+ let n, i = !1, r;+ if (t === "rotation" && !s)+ return { interpolationType: "LINEAR", shouldBakeAnimation: !0 };+ for (let o = 0, c = e.length; o < c; ++o)+ if (r = e[o], r.inTangent || r.outTangent)+ if (n) {+ if (n !== "CUBICSPLINE") {+ n = "LINEAR", i = !0;+ break;+ }+ } else+ n = "CUBICSPLINE";+ else if (n) {+ if (n === "CUBICSPLINE" || r.interpolation && r.interpolation === 1 && n !== "STEP") {+ n = "LINEAR", i = !0;+ break;+ }+ } else+ r.interpolation && r.interpolation === 1 ? n = "STEP" : n = "LINEAR";+ return n || (n = "LINEAR"), { interpolationType: n, shouldBakeAnimation: i };+ }+ /**+ * Adds an input tangent or output tangent to the output data+ * If an input tangent or output tangent is missing, it uses the zero vector or zero quaternion+ * @param tangentType Specifies which type of tangent to handle (inTangent or outTangent)+ * @param outputs The animation data by keyframe+ * @param animationChannelTargetPath The target animation channel+ * @param interpolation The interpolation type+ * @param keyFrame The key frame with the animation data+ * @param useQuaternion Specifies if quaternions are used+ */+ static _AddSplineTangent(e, t, s, n, i, r) {+ let o;+ const c = e === X.INTANGENT ? i.inTangent : i.outTangent;+ if (n === "CUBICSPLINE") {+ if (s === "rotation")+ if (c)+ if (r)+ o = c.asArray();+ else {+ const h = c;+ o = W.RotationYawPitchRoll(h.y, h.x, h.z).asArray();+ }+ else+ o = [0, 0, 0, 0];+ else s === "weights" ? c ? o = [c] : o = [0] : c ? o = c.asArray() : o = [0, 0, 0];+ t.push(o);+ }+ }+ /**+ * Get the minimum and maximum key frames' frame values+ * @param keyFrames animation key frames+ * @returns the minimum and maximum key frame value+ */+ static _CalculateMinMaxKeyFrames(e) {+ let t = 1 / 0, s = -1 / 0;+ return e.forEach(function(n) {+ t = Math.min(t, n.frame), s = Math.max(s, n.frame);+ }), { min: t, max: s };+ }+}+function gt(a, e, t, s, n, i) {+ const r = {+ attributes: {},+ influence: a.influence,+ name: a.name+ }, o = e.geometry;+ if (!o)+ return N.Warn("Attempted to export morph target data from a mesh without geometry. This should not happen."), r;+ const c = i ? -1 : 1, h = 4, f = O.Zero();+ let u, l;+ if (a.hasPositions) {+ const m = a.getPositions(), _ = o.getVerticesData(A.PositionKind);+ if (_) {+ const g = new Float32Array(_.length), p = [1 / 0, 1 / 0, 1 / 0], d = [-1 / 0, -1 / 0, -1 / 0];+ l = _.length / 3, u = 0;+ for (let x = u; x < l; ++x) {+ const E = O.FromArray(_, x * 3);+ O.FromArray(m, x * 3).subtractToRef(E, f), f.x *= c, p[0] = Math.min(p[0], f.x), d[0] = Math.max(d[0], f.x), p[1] = Math.min(p[1], f.y), d[1] = Math.max(d[1], f.y), p[2] = Math.min(p[2], f.z), d[2] = Math.max(d[2], f.z), g[x * 3] = f.x, g[x * 3 + 1] = f.y, g[x * 3 + 2] = f.z;+ }+ const w = t.createBufferView(g, h * 3), y = t.createAccessor(w, "VEC3", 5126, m.length / 3, 0, { min: p, max: d });+ n.push(y), r.attributes.POSITION = n.length - 1;+ } else+ N.Warn(`Morph target positions for mesh ${e.name} were not exported. Mesh does not have position vertex data`);+ }+ if (a.hasNormals) {+ const m = a.getNormals(), _ = o.getVerticesData(A.NormalKind);+ if (_) {+ const g = new Float32Array(_.length);+ l = _.length / 3, u = 0;+ for (let w = u; w < l; ++w) {+ const y = O.FromArray(_, w * 3).normalize();+ O.FromArray(m, w * 3).normalize().subtractToRef(y, f), g[w * 3] = f.x * c, g[w * 3 + 1] = f.y, g[w * 3 + 2] = f.z;+ }+ const p = t.createBufferView(g, h * 3), d = t.createAccessor(p, "VEC3", 5126, m.length / 3, 0);+ n.push(d), r.attributes.NORMAL = n.length - 1;+ } else+ N.Warn(`Morph target normals for mesh ${e.name} were not exported. Mesh does not have normals vertex data`);+ }+ if (a.hasTangents) {+ const m = a.getTangents(), _ = o.getVerticesData(A.TangentKind);+ if (_) {+ l = _.length / 4;+ const g = new Float32Array(l * 3);+ u = 0;+ for (let w = u; w < l; ++w) {+ const y = O.FromArray(_, w * 4);+ Ve(y);+ const x = O.FromArray(m, w * 3);+ Ve(x), x.subtractToRef(y, f), g[w * 3] = f.x * c, g[w * 3 + 1] = f.y, g[w * 3 + 2] = f.z;+ }+ const p = t.createBufferView(g, h * 3), d = t.createAccessor(p, "VEC3", 5126, l, 0);+ n.push(d), r.attributes.TANGENT = n.length - 1;+ } else+ N.Warn(`Morph target tangents for mesh ${e.name} were not exported. Mesh does not have tangents vertex data`);+ }+ if (a.hasColors) {+ const m = a.getColors(), _ = o.getVerticesData(A.ColorKind), g = o.getVertexBuffer(A.ColorKind);+ if (_ && g) {+ const p = g.getSize();+ l = _.length / p;+ const d = new Float32Array(l * p);+ u = 0;+ for (let x = u; x < l; ++x)+ if (p === 3) {+ const E = O.FromArray(_, x * p);+ O.FromArray(m, x * p).subtractToRef(E, f), d[x * 3] = f.x, d[x * 3 + 1] = f.y, d[x * 3 + 2] = f.z;+ } else if (p === 4) {+ const E = new ae(), C = ae.FromArray(_, x * p);+ ae.FromArray(m, x * p).subtractToRef(C, E), d[x * 4] = E.x, d[x * 4 + 1] = E.y, d[x * 4 + 2] = E.z, d[x * 4 + 3] = E.w;+ } else+ N.Warn(`Unsupported number of components for color attribute: ${p}`);+ const w = t.createBufferView(d, h * p), y = t.createAccessor(w, p === 3 ? "VEC3" : "VEC4", 5126, l, 0);+ n.push(y), r.attributes.COLOR_0 = n.length - 1;+ } else+ N.Warn(`Morph target colors for mesh ${e.name} were not exported. Mesh does not have colors vertex data`);+ }+ return r;+}+class he {+ constructor(e, t) {+ this._indicesAccessorMap = /* @__PURE__ */ new Map(), this._vertexBufferViewMap = /* @__PURE__ */ new Map(), this._vertexAccessorMap = /* @__PURE__ */ new Map(), this._remappedBufferView = /* @__PURE__ */ new Map(), this._meshMorphTargetMap = /* @__PURE__ */ new Map(), this._vertexMapColorAlpha = /* @__PURE__ */ new Map(), this._exportedNodes = /* @__PURE__ */ new Set(), this._meshMap = /* @__PURE__ */ new Map(), this.convertedToRightHandedBuffers = /* @__PURE__ */ new Map(), this.convertToRightHanded = e, this.wasAddedByNoopNode = t;+ }+ getIndicesAccessor(e, t, s, n, i) {+ return this._indicesAccessorMap.get(e)?.get(t)?.get(s)?.get(n)?.get(i);+ }+ setIndicesAccessor(e, t, s, n, i, r) {+ let o = this._indicesAccessorMap.get(e);+ o || (o = /* @__PURE__ */ new Map(), this._indicesAccessorMap.set(e, o));+ let c = o.get(t);+ c || (c = /* @__PURE__ */ new Map(), o.set(t, c));+ let h = c.get(s);+ h || (h = /* @__PURE__ */ new Map(), c.set(s, h));+ let f = h.get(n);+ f || (f = /* @__PURE__ */ new Map(), h.set(n, f)), f.set(i, r);+ }+ pushExportedNode(e) {+ this._exportedNodes.has(e) || this._exportedNodes.add(e);+ }+ getNodesSet() {+ return this._exportedNodes;+ }+ getVertexBufferView(e) {+ return this._vertexBufferViewMap.get(e);+ }+ setVertexBufferView(e, t) {+ this._vertexBufferViewMap.set(e, t);+ }+ setRemappedBufferView(e, t, s) {+ this._remappedBufferView.set(e, /* @__PURE__ */ new Map()), this._remappedBufferView.get(e).set(t, s);+ }+ getRemappedBufferView(e, t) {+ return this._remappedBufferView.get(e)?.get(t);+ }+ getVertexAccessor(e, t, s) {+ return this._vertexAccessorMap.get(e)?.get(t)?.get(s);+ }+ setVertexAccessor(e, t, s, n) {+ let i = this._vertexAccessorMap.get(e);+ i || (i = /* @__PURE__ */ new Map(), this._vertexAccessorMap.set(e, i));+ let r = i.get(t);+ r || (r = /* @__PURE__ */ new Map(), i.set(t, r)), r.set(s, n);+ }+ hasVertexColorAlpha(e) {+ return this._vertexMapColorAlpha.get(e) || !1;+ }+ setHasVertexColorAlpha(e, t) {+ return this._vertexMapColorAlpha.set(e, t);+ }+ getMesh(e) {+ return this._meshMap.get(e);+ }+ setMesh(e, t) {+ this._meshMap.set(e, t);+ }+ bindMorphDataToMesh(e, t) {+ const s = this._meshMorphTargetMap.get(e) || [];+ this._meshMorphTargetMap.set(e, s), s.indexOf(t) === -1 && s.push(t);+ }+ getMorphTargetsFromMesh(e) {+ return this._meshMorphTargetMap.get(e);+ }+}+class R {+ // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async+ _ApplyExtension(e, t, s, n) {+ if (s >= t.length)+ return Promise.resolve(e);+ const i = n(t[s], e);+ return i ? i.then(async (r) => r ? await this._ApplyExtension(r, t, s + 1, n) : null) : this._ApplyExtension(e, t, s + 1, n);+ }+ // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async+ _ApplyExtensions(e, t) {+ const s = [];+ for (const n of R._ExtensionNames)+ s.push(this._extensions[n]);+ return this._ApplyExtension(e, s, 0, t);+ }+ // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async+ _extensionsPostExportNodeAsync(e, t, s, n, i) {+ return this._ApplyExtensions(+ t,+ // eslint-disable-next-line @typescript-eslint/promise-function-async+ (r, o) => r.postExportNodeAsync && r.postExportNodeAsync(e, o, s, n, i, this._bufferManager)+ );+ }+ // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async+ _extensionsPostExportMaterialAsync(e, t, s) {+ return this._ApplyExtensions(t, (n, i) => n.postExportMaterialAsync && n.postExportMaterialAsync(e, i, s));+ }+ /**+ * Get additional textures for a material+ * @param context The context when loading the asset+ * @param material The glTF material+ * @param babylonMaterial The Babylon.js material+ * @returns List of additional textures+ */+ async _extensionsPostExportMaterialAdditionalTexturesAsync(e, t, s) {+ const n = [];+ return await Promise.all(R._ExtensionNames.map(async (i) => {+ const r = this._extensions[i];+ if (r.postExportMaterialAdditionalTexturesAsync) {+ const o = await r.postExportMaterialAdditionalTexturesAsync(e, t, s);+ n.push(...o);+ }+ })), n;+ }+ _extensionsPostExportTextures(e, t, s) {+ for (const n of R._ExtensionNames) {+ const i = this._extensions[n];+ i.postExportTexture && i.postExportTexture(e, t, s);+ }+ }+ _extensionsPostExportMeshPrimitive(e) {+ for (const t of R._ExtensionNames) {+ const s = this._extensions[t];+ s.postExportMeshPrimitive && s.postExportMeshPrimitive(e, this._bufferManager, this._accessors);+ }+ }+ async _extensionsPreGenerateBinaryAsync() {+ for (const e of R._ExtensionNames) {+ const t = this._extensions[e];+ t.preGenerateBinaryAsync && await t.preGenerateBinaryAsync(this._bufferManager);+ }+ }+ _forEachExtensions(e) {+ for (const t of R._ExtensionNames) {+ const s = this._extensions[t];+ s.enabled && e(s);+ }+ }+ _extensionsOnExporting() {+ this._forEachExtensions((e) => {+ var t, s, n;+ e.wasUsed && ((t = this._glTF).extensionsUsed || (t.extensionsUsed = []), this._glTF.extensionsUsed.indexOf(e.name) === -1 && this._glTF.extensionsUsed.push(e.name), e.required && ((s = this._glTF).extensionsRequired || (s.extensionsRequired = []), this._glTF.extensionsRequired.indexOf(e.name) === -1 && this._glTF.extensionsRequired.push(e.name)), (n = this._glTF).extensions || (n.extensions = {}), e.onExporting && e.onExporting());+ });+ }+ _loadExtensions() {+ for (const e of R._ExtensionNames) {+ const t = R._ExtensionFactories[e](this);+ this._extensions[e] = t;+ }+ }+ constructor(e = Ke.LastCreatedScene, t) {+ if (this._glTF = {+ asset: { generator: `Babylon.js v${Pe.Version}`, version: "2.0" }+ }, this._animations = [], this._accessors = [], this._bufferViews = [], this._cameras = [], this._images = [], this._materials = [], this._meshes = [], this._nodes = [], this._samplers = [], this._scenes = [], this._skins = [], this._textures = [], this._imageData = {}, this._shouldUseGlb = !1, this._materialExporter = new be(this), this._extensions = {}, this._bufferManager = new dt(), this._shouldExportNodeMap = /* @__PURE__ */ new Map(), this._nodeMap = /* @__PURE__ */ new Map(), this._materialMap = /* @__PURE__ */ new Map(), this._camerasMap = /* @__PURE__ */ new Map(), this._nodesCameraMap = /* @__PURE__ */ new Map(), this._skinMap = /* @__PURE__ */ new Map(), this._nodesSkinMap = /* @__PURE__ */ new Map(), this._materialNeedsUVsSet = /* @__PURE__ */ new Set(), !e)+ throw new Error("No scene available to export");+ this._babylonScene = e, this._options = {+ shouldExportNode: () => !0,+ shouldExportAnimation: () => !0,+ metadataSelector: (s) => s?.gltf?.extras,+ animationSampleRate: 1 / 60,+ exportWithoutWaitingForScene: !1,+ exportUnusedUVs: !1,+ removeNoopRootNodes: !0,+ includeCoordinateSystemConversionNodes: !1,+ meshCompressionMethod: "None",+ ...t+ }, this._loadExtensions();+ }+ dispose() {+ for (const e in this._extensions)+ this._extensions[e].dispose();+ }+ get options() {+ return this._options;+ }+ static RegisterExtension(e, t, s = 100) {+ R.UnregisterExtension(e) && N.Warn(`Extension with the name ${e} already exists`), R._ExtensionFactories[e] = t;+ const n = s ?? 0;+ R._ExtensionOrders[e] = n;+ let i = R._ExtensionNames.length;+ for (let r = 0; r < R._ExtensionNames.length; r++) {+ const o = R._ExtensionNames[r], c = R._ExtensionOrders[o];+ if (n < c) {+ i = r;+ break;+ }+ }+ R._ExtensionNames.splice(i, 0, e);+ }+ static UnregisterExtension(e) {+ if (!R._ExtensionFactories[e])+ return !1;+ delete R._ExtensionFactories[e], delete R._ExtensionOrders[e];+ const t = R._ExtensionNames.indexOf(e);+ return t !== -1 && R._ExtensionNames.splice(t, 1), !0;+ }+ _generateJSON(e, t, s) {+ const n = { byteLength: e };+ return n.byteLength && (this._glTF.buffers = [n]), this._nodes && this._nodes.length && (this._glTF.nodes = this._nodes), this._meshes && this._meshes.length && (this._glTF.meshes = this._meshes), this._scenes && this._scenes.length && (this._glTF.scenes = this._scenes, this._glTF.scene = 0), this._cameras && this._cameras.length && (this._glTF.cameras = this._cameras), this._bufferViews && this._bufferViews.length && (this._glTF.bufferViews = this._bufferViews), this._accessors && this._accessors.length && (this._glTF.accessors = this._accessors), this._animations && this._animations.length && (this._glTF.animations = this._animations), this._materials && this._materials.length && (this._glTF.materials = this._materials), this._textures && this._textures.length && (this._glTF.textures = this._textures), this._samplers && this._samplers.length && (this._glTF.samplers = this._samplers), this._skins && this._skins.length && (this._glTF.skins = this._skins), this._images && this._images.length && (this._glTF.images = this._images), this._shouldUseGlb || (n.uri = t + ".bin"), s ? JSON.stringify(this._glTF, null, 2) : JSON.stringify(this._glTF);+ }+ async generateGLTFAsync(e) {+ const t = await this._generateBinaryAsync();+ this._extensionsOnExporting();+ const s = this._generateJSON(t.byteLength, e, !0), n = new Blob([t], { type: "application/octet-stream" }), i = e + ".gltf", r = e + ".bin", o = new Ie();+ if (o.files[i] = s, o.files[r] = n, this._imageData)+ for (const c in this._imageData)+ o.files[c] = this._imageData[c];+ return o;+ }+ async _generateBinaryAsync() {+ return await this._exportSceneAsync(), await this._extensionsPreGenerateBinaryAsync(), this._bufferManager.generateBinary(this._bufferViews);+ }+ /**+ * Pads the number to a multiple of 4+ * @param num number to pad+ * @returns padded number+ */+ _getPadding(e) {+ const t = e % 4;+ return t === 0 ? t : 4 - t;+ }+ async generateGLBAsync(e) {+ this._shouldUseGlb = !0;+ const t = await this._generateBinaryAsync();+ this._extensionsOnExporting();+ const s = this._generateJSON(t.byteLength), n = e + ".glb", i = 12, r = 8;+ let o = s.length, c;+ typeof TextEncoder < "u" && (c = new TextEncoder().encode(s), o = c.length);+ const h = this._getPadding(o), f = this._getPadding(t.byteLength), u = i + 2 * r + o + h + t.byteLength + f, l = new ve(u);+ if (l.writeUInt32(1179937895), l.writeUInt32(2), l.writeUInt32(u), l.writeUInt32(o + h), l.writeUInt32(1313821514), c)+ l.writeTypedArray(c);+ else+ for (let g = 0; g < o; ++g) {+ const p = s.charCodeAt(g);+ p != s.codePointAt(g) ? l.writeUInt8(95) : l.writeUInt8(p);+ }+ for (let _ = 0; _ < h; ++_)+ l.writeUInt8(32);+ l.writeUInt32(t.byteLength + f), l.writeUInt32(5130562), l.writeTypedArray(t);+ for (let _ = 0; _ < f; ++_)+ l.writeUInt8(0);+ const m = new Ie();+ return m.files[n] = new Blob([l.getOutputData()], { type: "application/octet-stream" }), m;+ }+ _setNodeTransformation(e, t, s) {+ if (t.getPivotPoint().equalsWithEpsilon(se, K) || N.Warn("Pivot points are not supported in the glTF serializer"), !t.position.equalsWithEpsilon(se, K)) {+ const i = P.Vector3[0].copyFrom(t.position);+ s && de(i), e.translation = i.asArray();+ }+ t.scaling.equalsWithEpsilon(ie, K) || (e.scale = t.scaling.asArray());+ const n = t.rotationQuaternion?.clone() || W.FromEulerAngles(t.rotation.x, t.rotation.y, t.rotation.z);+ n.equalsWithEpsilon(me, K) || (s && ge(n), e.rotation = n.normalize().asArray());+ }+ _setCameraTransformation(e, t, s) {+ const n = P.Vector3[0], i = P.Quaternion[0], r = t.getWorldMatrix();+ if (t.parent) {+ const o = t.parent.getWorldMatrix().invertToRef(P.Matrix[0]);+ r.multiplyToRef(o, P.Matrix[1]).decompose(void 0, i, n);+ } else+ r.decompose(void 0, i, n);+ n.equalsWithEpsilon(se, K) || (s && de(n), e.translation = n.asArray()), s && ge(i), this._babylonScene.useRightHandedSystem || Fe(i), i.equalsWithEpsilon(me, K) || (e.rotation = i.asArray());+ }+ // Export babylon cameras to glTF cameras+ _listAvailableCameras() {+ for (const e of this._babylonScene.cameras) {+ const t = {+ type: e.mode === ne.PERSPECTIVE_CAMERA ? "perspective" : "orthographic"+ };+ if (e.name && (t.name = e.name), t.type === "perspective")+ t.perspective = {+ aspectRatio: e.getEngine().getAspectRatio(e),+ yfov: e.fovMode === ne.FOVMODE_VERTICAL_FIXED ? e.fov : e.fov * e.getEngine().getAspectRatio(e),+ znear: e.minZ,+ zfar: e.maxZ+ };+ else if (t.type === "orthographic") {+ const s = e.orthoLeft && e.orthoRight ? 0.5 * (e.orthoRight - e.orthoLeft) : e.getEngine().getRenderWidth() * 0.5, n = e.orthoBottom && e.orthoTop ? 0.5 * (e.orthoTop - e.orthoBottom) : e.getEngine().getRenderHeight() * 0.5;+ t.orthographic = {+ xmag: s,+ ymag: n,+ znear: e.minZ,+ zfar: e.maxZ+ };+ }+ this._camerasMap.set(e, t);+ }+ }+ // Cleanup unused cameras and assign index to nodes.+ _exportAndAssignCameras() {+ const e = Array.from(this._camerasMap.values());+ for (const t of e) {+ const s = this._nodesCameraMap.get(t);+ if (s !== void 0) {+ this._cameras.push(t);+ for (const n of s)+ n.camera = this._cameras.length - 1;+ }+ }+ }+ // Collects all skins in a skins map so nodes can reference it during node parsing.+ _listAvailableSkeletons() {+ for (const e of this._babylonScene.skeletons) {+ if (e.bones.length <= 0)+ continue;+ const t = { joints: [] };+ this._skinMap.set(e, t);+ }+ }+ _exportAndAssignSkeletons(e) {+ for (const t of this._babylonScene.skeletons) {+ if (t.bones.length <= 0)+ continue;+ const s = this._skinMap.get(t);+ if (s == null)+ continue;+ const n = {};+ let i = -1;+ for (let c = 0; c < t.bones.length; ++c) {+ const h = t.bones[c], f = h.getIndex() ?? c;+ f !== -1 && (n[f] = h, f > i && (i = f));+ }+ const r = [];+ for (let c = 0; c <= i; ++c) {+ const h = n[c], f = h.getTransformNode(), u = f ? this._nodeMap.get(f) : void 0;+ if (u === void 0) {+ N.Warn("Exporting a bone without a linked transform node is currently unsupported.");+ continue;+ }+ s.joints.push(u);+ const l = h.getAbsoluteInverseBindMatrix().clone();+ e.has(f) && ct(l), r.push(l);+ }+ const o = this._nodesSkinMap.get(s);+ if (s.joints.length > 0 && o !== void 0) {+ const c = new Float32Array(r.length * 16);+ r.forEach((u, l) => {+ c.set(u.m, l * 16);+ });+ const h = this._bufferManager.createBufferView(c);+ this._accessors.push(this._bufferManager.createAccessor(h, "MAT4", 5126, r.length)), s.inverseBindMatrices = this._accessors.length - 1, this._skins.push(s);+ const f = this._skins.length - 1;+ for (const u of o)+ u.skin = f;+ }+ }+ }+ async _exportSceneAsync() {+ const e = { nodes: [] };+ if (this._babylonScene.metadata) {+ const h = this._options.metadataSelector(this._babylonScene.metadata);+ h && (e.extras = h);+ }+ const t = new Array(), s = new Array(), n = new Array();+ let i;+ if (this._options.removeNoopRootNodes && !this._options.includeCoordinateSystemConversionNodes)+ for (const h of this._babylonScene.animationGroups)+ for (const f of h.targetedAnimations) {+ const u = f.target;+ u instanceof Z && !u.parent && (i ?? (i = /* @__PURE__ */ new Set())).add(u);+ }+ for (const h of this._babylonScene.rootNodes) {+ const f = h.animations, u = !!f && f.length > 0 || i?.has(h);+ this._options.removeNoopRootNodes && !this._options.includeCoordinateSystemConversionNodes && et(h, this._babylonScene.useRightHandedSystem) && !u ? n.push(...h.getChildren()) : this._babylonScene.useRightHandedSystem ? t.push(h) : s.push(h);+ }+ this._listAvailableCameras(), this._listAvailableSkeletons();+ const r = new he(!0, !1);+ e.nodes.push(...await this._exportNodesAsync(s, r));+ const o = new he(!1, !1);+ e.nodes.push(...await this._exportNodesAsync(t, o));+ const c = new he(!1, !0);+ e.nodes.push(...await this._exportNodesAsync(n, c)), e.nodes.length && this._scenes.push(e), this._exportAndAssignCameras(), this._exportAndAssignSkeletons(r.getNodesSet()), this._babylonScene.animationGroups.length && V._CreateNodeAndMorphAnimationFromAnimationGroups(this._babylonScene, this._animations, this._nodeMap, this._bufferManager, this._bufferViews, this._accessors, this._animationSampleRate, r.getNodesSet(), this._options.shouldExportAnimation);+ }+ _shouldExportNode(e) {+ let t = this._shouldExportNodeMap.get(e);+ return t === void 0 && (t = this._options.shouldExportNode(e), this._shouldExportNodeMap.set(e, t)), t;+ }+ async _exportNodesAsync(e, t) {+ const s = new Array();+ this._exportBuffers(e, t);+ for (const n of e)+ await this._exportNodeAsync(n, s, t);+ return s;+ }+ _collectBuffers(e, t, s, n, i) {+ if (this._shouldExportNode(e) && e instanceof ue && e.geometry) {+ const r = e.geometry.getVertexBuffers();+ if (r)+ for (const c in r) {+ if (!Se(c))+ continue;+ const h = r[c];+ i.setHasVertexColorAlpha(h, e.hasVertexAlpha);+ const f = h._buffer, u = t.get(f) || [];+ t.set(f, u), u.indexOf(h) === -1 && u.push(h);+ const l = s.get(h) || [];+ s.set(h, l), l.indexOf(e) === -1 && l.push(e);+ }+ const o = e.morphTargetManager;+ if (o)+ for (let c = 0; c < o.numTargets; c++) {+ const h = o.getTarget(c), f = n.get(h) || [];+ n.set(h, f), f.indexOf(e) === -1 && f.push(e);+ }+ }+ for (const r of e.getChildren())+ this._collectBuffers(r, t, s, n, i);+ }+ _exportBuffers(e, t) {+ const s = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map();+ for (const c of e)+ this._collectBuffers(c, s, n, i, t);+ const r = Array.from(s.keys());+ for (const c of r) {+ const h = c.getData();+ if (!h)+ throw new Error("Buffer data is not available");+ const f = s.get(c);+ if (!f)+ continue;+ const u = f[0].byteStride;+ if (f.some((p) => p.byteStride !== u))+ throw new Error("Vertex buffers pointing to the same buffer must have the same byte stride");+ const l = ut(h).slice();+ for (const p of f) {+ const d = n.get(p), { byteOffset: w, byteStride: y, componentCount: x, type: E, count: C, normalized: S, kind: I } = fe(p, d);+ switch (I) {+ case A.NormalKind:+ case A.TangentKind: {+ te(l, w, y, x, E, C, S, (M) => {+ const T = Math.sqrt(M[0] * M[0] + M[1] * M[1] + M[2] * M[2]);+ if (T > 0) {+ const U = 1 / T;+ M[0] *= U, M[1] *= U, M[2] *= U;+ }+ });+ break;+ }+ case A.ColorKind: {+ const M = d.filter((F) => F.material instanceof ye || F.material == null).length;+ if (M == 0)+ break;+ if (M != d.length) {+ J.Warn("Not converting vertex color space, as buffer is shared by StandardMaterials and other material types. Results may look incorrect.");+ break;+ }+ E == A.UNSIGNED_BYTE && J.Warn("Converting uint8 vertex colors to linear space. Results may look incorrect.");+ const T = new z(), U = new ze(), B = this._babylonScene.getEngine().useExactSrgbConversions;+ te(l, w, y, x, E, C, S, (F) => {+ F.length === 3 ? (T.fromArray(F, 0), T.toLinearSpaceToRef(T, B), T.toArray(F, 0)) : (U.fromArray(F, 0), U.toLinearSpaceToRef(U, B), U.toArray(F, 0));+ });+ }+ }+ }+ if (t.convertToRightHanded) {+ for (const p of f) {+ const d = n.get(p), { byteOffset: w, byteStride: y, componentCount: x, type: E, count: C, normalized: S, kind: I } = fe(p, d);+ switch (I) {+ case A.PositionKind:+ case A.NormalKind:+ case A.TangentKind:+ te(l, w, y, x, E, C, S, (M) => {+ M[0] = -M[0];+ });+ }+ }+ t.convertedToRightHandedBuffers.set(c, l);+ }+ const m = this._bufferManager.createBufferView(l, u);+ t.setVertexBufferView(c, m);+ const _ = /* @__PURE__ */ new Map();+ for (const p of f) {+ const d = n.get(p), { kind: w, totalVertices: y } = fe(p, d);+ switch (w) {+ case A.MatricesIndicesKind:+ case A.MatricesIndicesExtraKind:+ if (p.type == A.FLOAT) {+ const x = p.getFloatData(y);+ x !== null && _.set(p, x);+ }+ }+ }+ _.size !== 0 && J.Warn("Joint indices conversion needed: some joint indices are stored as floats in Babylon but GLTF requires UNSIGNED BYTES. We will perform the conversion but this might lead to unused data in the buffer.");+ const g = Array.from(_.keys());+ for (const p of g) {+ const d = _.get(p);+ if (!d)+ continue;+ const w = nt(d), y = new (w ? Uint16Array : Uint8Array)(d.length);+ for (let E = 0; E < d.length; E++)+ y[E] = d[E];+ const x = this._bufferManager.createBufferView(y, 4 * (w ? 2 : 1));+ t.setRemappedBufferView(c, p, x);+ }+ }+ const o = Array.from(i.keys());+ for (const c of o) {+ const h = i.get(c);+ if (!h)+ continue;+ const f = gt(c, h[0], this._bufferManager, this._bufferViews, this._accessors, t.convertToRightHanded);+ for (const u of h)+ t.bindMorphDataToMesh(u, f);+ }+ }+ /**+ * Processes a node to be exported to the glTF file+ * @returns A promise that resolves once the node has been exported+ * @internal+ */+ async _exportNodeAsync(e, t, s) {+ let n = this._nodeMap.get(e);+ if (n !== void 0) {+ t.includes(n) || t.push(n);+ return;+ }+ const i = await this._createNodeAsync(e, s);+ if (i) {+ n = this._nodes.length, this._nodes.push(i), this._nodeMap.set(e, n), s.pushExportedNode(e), t.push(n);+ const o = {+ name: "runtime animations",+ channels: [],+ samplers: []+ }, c = [];+ this._babylonScene.animationGroups.length || (V._CreateMorphTargetAnimationFromMorphTargetAnimations(e, o, c, this._nodeMap, this._nodes, this._bufferManager, this._bufferViews, this._accessors, this._animationSampleRate, s.convertToRightHanded, this._options.shouldExportAnimation), e.animations.length && V._CreateNodeAnimationFromNodeAnimations(e, o, c, this._nodeMap, this._nodes, this._bufferManager, this._bufferViews, this._accessors, this._animationSampleRate, s.convertToRightHanded, this._options.shouldExportAnimation)), o.channels.length && o.samplers.length && this._animations.push(o), c.forEach((h) => {+ h.channels.length && h.samplers.length && this._animations.push(h);+ });+ }+ const r = i ? [] : t;+ for (const o of e.getChildren())+ await this._exportNodeAsync(o, r, s);+ i && r.length && (i.children = r);+ }+ /**+ * Creates a glTF node from a Babylon.js node. If skipped, returns null.+ * @internal+ */+ async _createNodeAsync(e, t) {+ if (!this._shouldExportNode(e))+ return null;+ const s = {};+ if (e.name && (s.name = e.name), e.metadata) {+ const i = this._options.metadataSelector(e.metadata);+ i && (s.extras = i);+ }+ if (e instanceof Z && (this._setNodeTransformation(s, e, t.convertToRightHanded), e instanceof ue)) {+ const i = e instanceof qe ? e.sourceMesh : e;+ if (i.subMeshes && i.subMeshes.length > 0 && (s.mesh = await this._exportMeshAsync(i, t)), e.skeleton) {+ const r = this._skinMap.get(e.skeleton);+ r !== void 0 && (this._nodesSkinMap.get(r) === void 0 && this._nodesSkinMap.set(r, []), this._nodesSkinMap.get(r)?.push(s));+ }+ }+ if (e instanceof Ne) {+ const i = this._camerasMap.get(e);+ if (i) {+ this._nodesCameraMap.get(i) === void 0 && this._nodesCameraMap.set(i, []), this._setCameraTransformation(s, e, t.convertToRightHanded);+ const r = e.parent;+ if (r !== null && ht(e, r)) {+ const o = this._nodeMap.get(r);+ if (o !== void 0) {+ const c = this._nodes[o];+ return ft(s, c), this._nodesCameraMap.get(i)?.push(c), null;+ }+ }+ this._nodesCameraMap.get(i)?.push(s);+ }+ }+ return await this._extensionsPostExportNodeAsync("exportNodeAsync", s, e, this._nodeMap, t.convertToRightHanded) ? s : (J.Warn(`Not exporting node ${e.name}`), null);+ }+ _exportIndices(e, t, s, n, i, r, o, c, h) {+ let f = null;+ h.mode = ot(r);+ const u = o !== k.CounterClockWiseSideOrientation && at(r);+ if (u) {+ if (r === k.TriangleStripDrawMode || r === k.TriangleFanDrawMode)+ throw new Error("Triangle strip/fan fill mode is not implemented");+ const l = t ? new Uint32Array(n) : new Uint16Array(n);+ if (e)+ for (let m = 0; m + 2 < n; m += 3)+ l[m] = e[s + m] + i, l[m + 1] = e[s + m + 2] + i, l[m + 2] = e[s + m + 1] + i;+ else+ for (let m = 0; m + 2 < n; m += 3)+ l[m] = m, l[m + 1] = m + 2, l[m + 2] = m + 1;+ f = l;+ } else if (e && i !== 0) {+ const l = t ? new Uint32Array(n) : new Uint16Array(n);+ for (let m = 0; m < n; m++)+ l[m] = e[s + m] + i;+ f = l;+ } else e && (f = lt(e, s, n, t));+ if (f) {+ let l = c.getIndicesAccessor(e, s, n, i, u);+ if (l === void 0) {+ const m = this._bufferManager.createBufferView(f), _ = t ? 5125 : 5123;+ this._accessors.push(this._bufferManager.createAccessor(m, "SCALAR", _, n, 0)), l = this._accessors.length - 1, c.setIndicesAccessor(e, s, n, i, u, l);+ }+ h.indices = l;+ }+ }+ _exportVertexBuffer(e, t, s, n, i, r) {+ const o = e.getKind();+ if (!Se(o) || o.startsWith("uv") && !this._options.exportUnusedUVs && (!t || !this._materialNeedsUVsSet.has(t)))+ return;+ let c = i.getVertexAccessor(e, s, n);+ if (c === void 0) {+ const h = i.convertedToRightHandedBuffers.get(e._buffer) || e._buffer.getData(), f = o === A.PositionKind ? pt(h, e, s, n) : void 0, u = (o === A.MatricesIndicesKind || o === A.MatricesIndicesExtraKind) && e.type === A.FLOAT, l = u ? A.UNSIGNED_BYTE : e.type, m = u ? void 0 : e.normalized, _ = u ? i.getRemappedBufferView(e._buffer, e) : i.getVertexBufferView(e._buffer), g = e.byteOffset + s * e.byteStride;+ this._accessors.push(this._bufferManager.createAccessor(+ _,+ it(o, i.hasVertexColorAlpha(e)),+ l,+ n,+ g,+ f,+ m+ // TODO: Find other places where this is needed.+ )), c = this._accessors.length - 1, i.setVertexAccessor(e, s, n, c);+ }+ r.attributes[rt(o)] = c;+ }+ async _exportMaterialAsync(e, t, s, n) {+ let i = this._materialMap.get(e);+ if (i === void 0) {+ const r = t && Object.keys(t).some((o) => o.startsWith("uv"));+ if (e = e instanceof Ge ? e.subMaterials[s.materialIndex] : e, e instanceof Y)+ i = await this._materialExporter.exportPBRMaterialAsync(e, r);+ else if (e instanceof ye)+ i = await this._materialExporter.exportStandardMaterialAsync(e, r);+ else if (e instanceof le)+ i = await this._materialExporter.exportOpenPBRMaterialAsync(e, r);+ else {+ J.Warn(`Unsupported material '${e.name}' with type ${e.getClassName()}`);+ return;+ }+ this._materialMap.set(e, i);+ }+ n.material = i;+ }+ async _exportMeshAsync(e, t) {+ let s = t.getMesh(e);+ if (s !== void 0)+ return s;+ const n = { primitives: [] };+ s = this._meshes.length, this._meshes.push(n), t.setMesh(e, s);+ const i = e.isUnIndexed ? null : e.getIndices(), r = e.geometry?.getVertexBuffers(), o = t.getMorphTargetsFromMesh(e), c = e instanceof He, h = e instanceof je, f = e.subMeshes;+ if (r && f && f.length > 0)+ for (const u of f) {+ const l = { attributes: {} }, m = u.getMaterial() || this._babylonScene.defaultMaterial;+ if (h) {+ const p = {+ name: m.name+ }, d = e, w = z.White(), y = d.material?.alpha ?? 1, x = d.greasedLineMaterial?.color ?? w;+ (!x.equalsWithEpsilon(w, K) || y < 1) && (p.pbrMetallicRoughness = {+ baseColorFactor: [...x.asArray(), y]+ }), this._materials.push(p), l.material = this._materials.length - 1;+ } else if (c) {+ const p = {+ name: m.name+ }, d = e;+ (!d.color.equalsWithEpsilon(z.White(), K) || d.alpha < 1) && (p.pbrMetallicRoughness = {+ baseColorFactor: [...d.color.asArray(), d.alpha]+ }), this._materials.push(p), l.material = this._materials.length - 1;+ } else+ await this._exportMaterialAsync(m, r, u, l);+ const _ = c || h ? k.LineListDrawMode : e.overrideRenderingFillMode ?? m.fillMode;+ let g = m._getEffectiveOrientation(e);+ t.wasAddedByNoopNode && !e.getScene().useRightHandedSystem && (g = g === k.ClockWiseSideOrientation ? k.CounterClockWiseSideOrientation : k.ClockWiseSideOrientation), this._exportIndices(i, i ? $e(i, u.indexCount, u.indexStart, u.verticesStart) : u.verticesCount > 65535, i ? u.indexStart : u.verticesStart, i ? u.indexCount : u.verticesCount, -u.verticesStart, _, g, t, l);+ for (const p of Object.values(r))+ this._exportVertexBuffer(p, m, u.verticesStart, u.verticesCount, t, l);+ if (o) {+ l.targets = [];+ for (const p of o)+ l.targets.push(p.attributes);+ }+ n.primitives.push(l), this._extensionsPostExportMeshPrimitive(l);+ }+ if (o) {+ n.weights = [], n.extras || (n.extras = {}), n.extras.targetNames = [];+ for (const u of o)+ n.weights.push(u.influence), n.extras.targetNames.push(u.name);+ }+ return s;+ }+}+R._ExtensionNames = new Array();+R._ExtensionFactories = {};+R._ExtensionOrders = {};+class xt {+ /**+ * Exports the scene to .gltf file format+ * @param scene Babylon scene+ * @param fileName Name to use for the .gltf file+ * @param options Exporter options+ * @returns Returns the exported data+ */+ static async GLTFAsync(e, t, s) {+ (!s || !s.exportWithoutWaitingForScene) && await e.whenReadyAsync();+ const n = new R(e, s), i = await n.generateGLTFAsync(t.replace(/\.[^/.]+$/, ""));+ return n.dispose(), i;+ }+ /**+ * Exports the scene to .glb file format+ * @param scene Babylon scene+ * @param fileName Name to use for the .glb file+ * @param options Exporter options+ * @returns Returns the exported data+ */+ static async GLBAsync(e, t, s) {+ (!s || !s.exportWithoutWaitingForScene) && await e.whenReadyAsync();+ const n = new R(e, s), i = await n.generateGLBAsync(t.replace(/\.[^/.]+$/, ""));+ return n.dispose(), i;+ }+}+export {+ xt as GLTF2Export+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-Cw8L9bT6.jsadded+21@@ -0,0 +1,21 @@+import { bW as t } from "./chunk-IERganv1.js";+const e = "volumetricLightingRenderVolumePixelShader", i = `#include<sceneUboDeclaration>+#include<meshUboDeclaration>+uniform invViewProjection: mat4x4<f32>;uniform lightDir: vec3f; +uniform outputTextureSize: vec2f;uniform extinctionPhaseG: vec4f;uniform lightPower: vec3f;uniform textureRatio: vec2f;var depthTexture: texture_2d<f32>;varying vWorldPos: vec4f;fn henyeyGreenstein(g: f32,cosTheta: f32)->f32 {let denom=1+g*g-2*g*cosTheta;return 1.0/(4.0*3.14159265)*(1.0-g*g)/(denom*sqrt(max(denom,0.0)));}+fn integrateDirectional(eyeDist: f32,viewDir: vec3f,lightDir: vec3f)->vec3f {let phaseG=uniforms.extinctionPhaseG.w;+#ifdef USE_EXTINCTION+let extinction=uniforms.extinctionPhaseG.xyz;return henyeyGreenstein(phaseG,dot(viewDir,lightDir))*(vec3f(1.0)-exp(-extinction*eyeDist))/extinction;+#else+return vec3f(henyeyGreenstein(phaseG,dot(viewDir,lightDir)))*vec3f(eyeDist);+#endif+}+@fragment+fn main(input: FragmentInputs)->FragmentOutputs {let depth=textureLoad(depthTexture,vec2u(fragmentInputs.position.xy*uniforms.textureRatio),0).r;var worldPos=fragmentInputs.vWorldPos;if (fragmentInputs.position.z>depth) {let ndc=vec4f((fragmentInputs.position.xy/uniforms.outputTextureSize)*2.-1.,depth,1.0);worldPos=uniforms.invViewProjection*ndc;worldPos=worldPos/worldPos.w;}+var viewDir=worldPos.xyz-scene.vEyePosition.xyz;let eyeDist=length(viewDir);viewDir=viewDir/eyeDist;let fSign=select(-1.0,1.0,fragmentInputs.frontFacing);let integral=integrateDirectional(eyeDist,-viewDir,uniforms.lightDir);fragmentOutputs.color=vec4f(uniforms.lightPower*integral*fSign,1.0);}+`;+t.ShadersStoreWGSL[e] || (t.ShadersStoreWGSL[e] = i);+const r = { name: e, shader: i };+export {+ r as volumetricLightingRenderVolumePixelShaderWGSL+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-Cx4kqim-.jsadded+712@@ -0,0 +1,712 @@+import { aA as T, i as b, T as j, F as M, o as B, V as w, a6 as V, a3 as L, cX as P, ag as v, cH as E, H as C, cW as D, c0 as A } from "./chunk-IERganv1.js";+import { O as x } from "./chunk-DsOYaBFP.js";+class f {+ constructor() {+ this.materials = [];+ }+ /**+ * This function will read the mtl file and create each material described inside+ * This function could be improve by adding :+ * -some component missing (Ni, Tf...)+ * -including the specific options available+ *+ * @param scene defines the scene the material will be created in+ * @param data defines the mtl data to parse+ * @param rootUrl defines the rooturl to use in order to load relative dependencies+ * @param assetContainer defines the asset container to store the material in (can be null)+ */+ parseMTL(t, n, i, o) {+ if (n instanceof ArrayBuffer)+ return;+ const l = n.split(`+`), h = /\s+/;+ let _, a = null;+ for (let u = 0; u < l.length; u++) {+ const r = l[u].trim();+ if (r.length === 0 || r.charAt(0) === "#")+ continue;+ const s = r.indexOf(" ");+ let e = s >= 0 ? r.substring(0, s) : r;+ e = e.toLowerCase();+ const p = s >= 0 ? r.substring(s + 1).trim() : "";+ if (e === "newmtl")+ a && this.materials.push(a), t._blockEntityCollection = !!o, a = new T(p, t), a._parentContainer = o, t._blockEntityCollection = !1;+ else if (e === "kd" && a)+ _ = p.split(h, 3).map(parseFloat), a.diffuseColor = b.FromArray(_);+ else if (e === "ka" && a)+ _ = p.split(h, 3).map(parseFloat), a.ambientColor = b.FromArray(_);+ else if (e === "ks" && a)+ _ = p.split(h, 3).map(parseFloat), a.specularColor = b.FromArray(_);+ else if (e === "ke" && a)+ _ = p.split(h, 3).map(parseFloat), a.emissiveColor = b.FromArray(_);+ else if (e === "ns" && a)+ a.specularPower = parseFloat(p);+ else if (e === "d" && a)+ a.alpha = parseFloat(p);+ else if (e === "map_ka" && a)+ a.ambientTexture = f._GetTexture(i, p, t);+ else if (e === "map_kd" && a)+ a.diffuseTexture = f._GetTexture(i, p, t);+ else if (e === "map_ks" && a)+ a.specularTexture = f._GetTexture(i, p, t);+ else if (e !== "map_ns") if (e === "map_bump" && a) {+ const d = p.split(h), F = d.indexOf("-bm");+ let g = null;+ F >= 0 && (g = d[F + 1], d.splice(F, 2)), a.bumpTexture = f._GetTexture(i, d.join(" "), t), a.bumpTexture && g !== null && (a.bumpTexture.level = parseFloat(g));+ } else e === "map_d" && a && (a.opacityTexture = f._GetTexture(i, p, t));+ }+ a && this.materials.push(a);+ }+ /**+ * Gets the texture for the material.+ *+ * If the material is imported from input file,+ * We sanitize the url to ensure it takes the texture from aside the material.+ *+ * @param rootUrl The root url to load from+ * @param value The value stored in the mtl+ * @param scene+ * @returns The Texture+ */+ static _GetTexture(t, n, i) {+ if (!n)+ return null;+ let o = t;+ if (t === "file:") {+ let l = n.lastIndexOf("\\");+ l === -1 && (l = n.lastIndexOf("/")), l > -1 ? o += n.substring(l + 1) : o += n;+ } else+ o += n;+ return new j(o, i, !1, f.INVERT_TEXTURE_Y);+ }+}+f.INVERT_TEXTURE_Y = !0;+class m {+ /**+ * Creates a new SolidParser+ * @param materialToUse defines the array to fill with the list of materials to use (it will be filled by the parse function)+ * @param babylonMeshesArray defines the array to fill with the list of loaded meshes (it will be filled by the parse function)+ * @param loadingOptions defines the loading options to use+ */+ constructor(t, n, i) {+ this._positions = [], this._normals = [], this._uvs = [], this._colors = [], this._extColors = [], this._meshesFromObj = [], this._indicesForBabylon = [], this._wrappedPositionForBabylon = [], this._wrappedUvsForBabylon = [], this._wrappedColorsForBabylon = [], this._wrappedNormalsForBabylon = [], this._tuplePosNorm = [], this._curPositionInIndices = 0, this._hasMeshes = !1, this._unwrappedPositionsForBabylon = [], this._unwrappedColorsForBabylon = [], this._unwrappedNormalsForBabylon = [], this._unwrappedUVForBabylon = [], this._triangles = [], this._materialNameFromObj = "", this._objMeshName = "", this._increment = 1, this._isFirstMaterial = !0, this._grayColor = new M(0.5, 0.5, 0.5, 1), this._hasLineData = !1, this._materialToUse = t, this._babylonMeshesArray = n, this._loadingOptions = i;+ }+ /**+ * Search for obj in the given array.+ * This function is called to check if a couple of data already exists in an array.+ *+ * If found, returns the index of the founded tuple index. Returns -1 if not found+ * @param arr Array<{ normals: Array<number>, idx: Array<number> }>+ * @param obj Array<number>+ * @returns {boolean}+ */+ _isInArray(t, n) {+ t[n[0]] || (t[n[0]] = { normals: [], idx: [] });+ const i = t[n[0]].normals.indexOf(n[1]);+ return i === -1 ? -1 : t[n[0]].idx[i];+ }+ _isInArrayUV(t, n) {+ t[n[0]] || (t[n[0]] = { normals: [], idx: [], uv: [] });+ const i = t[n[0]].normals.indexOf(n[1]);+ return i != 1 && n[2] === t[n[0]].uv[i] ? t[n[0]].idx[i] : -1;+ }+ /**+ * This function set the data for each triangle.+ * Data are position, normals and uvs+ * If a tuple of (position, normal) is not set, add the data into the corresponding array+ * If the tuple already exist, add only their indice+ *+ * @param data The vertex's data+ * * indicesPositionFromObj: The index in positions array+ * * indicesUvsFromObj: The index in uvs array+ * * indicesNormalFromObj: The index in normals array+ * * positionVectorFromOBJ: The value of position at index objIndice+ * * textureVectorFromOBJ: The value of uvs+ * * normalsVectorFromOBJ: The value of normals at index objNormale+ * * positionColorsFromOBJ: The value of color at index objIndice+ */+ _setData(t) {+ t.indiceUvsFromObj ?? (t.indiceUvsFromObj = -1), t.indiceNormalFromObj ?? (t.indiceNormalFromObj = -1);+ let n;+ this._loadingOptions.optimizeWithUV ? n = this._isInArrayUV(this._tuplePosNorm, [t.indicePositionFromObj, t.indiceNormalFromObj, t.indiceUvsFromObj]) : n = this._isInArray(this._tuplePosNorm, [t.indicePositionFromObj, t.indiceNormalFromObj]), n === -1 ? (this._indicesForBabylon.push(this._wrappedPositionForBabylon.length), this._wrappedPositionForBabylon.push(t.positionVectorFromOBJ), t.textureVectorFromOBJ !== void 0 && this._wrappedUvsForBabylon.push(t.textureVectorFromOBJ), t.normalsVectorFromOBJ !== void 0 && this._wrappedNormalsForBabylon.push(t.normalsVectorFromOBJ), t.positionColorsFromOBJ !== void 0 && this._wrappedColorsForBabylon.push(t.positionColorsFromOBJ), this._tuplePosNorm[t.indicePositionFromObj].normals.push(t.indiceNormalFromObj), this._tuplePosNorm[t.indicePositionFromObj].idx.push(this._curPositionInIndices++), this._loadingOptions.optimizeWithUV && this._tuplePosNorm[t.indicePositionFromObj].uv.push(t.indiceUvsFromObj)) : this._indicesForBabylon.push(n);+ }+ /**+ * Transform Vector() and BABYLON.Color() objects into numbers in an array+ */+ _unwrapData() {+ try {+ for (let t = 0; t < this._wrappedPositionForBabylon.length; t++)+ this._unwrappedPositionsForBabylon.push(this._wrappedPositionForBabylon[t].x * this._handednessSign, this._wrappedPositionForBabylon[t].y, this._wrappedPositionForBabylon[t].z), this._wrappedNormalsForBabylon.length && this._unwrappedNormalsForBabylon.push(this._wrappedNormalsForBabylon[t].x * this._handednessSign, this._wrappedNormalsForBabylon[t].y, this._wrappedNormalsForBabylon[t].z), this._wrappedUvsForBabylon.length && this._unwrappedUVForBabylon.push(this._wrappedUvsForBabylon[t].x, this._wrappedUvsForBabylon[t].y), this._wrappedColorsForBabylon.length && this._unwrappedColorsForBabylon.push(this._wrappedColorsForBabylon[t].r, this._wrappedColorsForBabylon[t].g, this._wrappedColorsForBabylon[t].b, this._wrappedColorsForBabylon[t].a);+ this._wrappedPositionForBabylon.length = 0, this._wrappedNormalsForBabylon.length = 0, this._wrappedUvsForBabylon.length = 0, this._wrappedColorsForBabylon.length = 0, this._tuplePosNorm.length = 0, this._curPositionInIndices = 0;+ } catch (t) {+ throw new Error("Unable to unwrap data while parsing OBJ data.", { cause: t });+ }+ }+ /**+ * Create triangles from polygons+ * It is important to notice that a triangle is a polygon+ * We get 5 patterns of face defined in OBJ File :+ * facePattern1 = ["1","2","3","4","5","6"]+ * facePattern2 = ["1/1","2/2","3/3","4/4","5/5","6/6"]+ * facePattern3 = ["1/1/1","2/2/2","3/3/3","4/4/4","5/5/5","6/6/6"]+ * facePattern4 = ["1//1","2//2","3//3","4//4","5//5","6//6"]+ * facePattern5 = ["-1/-1/-1","-2/-2/-2","-3/-3/-3","-4/-4/-4","-5/-5/-5","-6/-6/-6"]+ * Each pattern is divided by the same method+ * @param faces Array[String] The indices of elements+ * @param v Integer The variable to increment+ */+ _getTriangles(t, n) {+ for (let i = n; i < t.length - 1; i++)+ this._pushTriangle(t, i);+ }+ /**+ * To get color between color and extension color+ * @param index Integer The index of the element in the array+ * @returns value of target color+ */+ _getColor(t) {+ if (this._loadingOptions.importVertexColors)+ return this._extColors[t] ?? this._colors[t];+ }+ /**+ * Create triangles and push the data for each polygon for the pattern 1+ * In this pattern we get vertice positions+ * @param face+ * @param v+ */+ _setDataForCurrentFaceWithPattern1(t, n) {+ this._getTriangles(t, n);+ for (let i = 0; i < this._triangles.length; i++) {+ const o = parseInt(this._triangles[i]) - 1;+ this._setData({+ indicePositionFromObj: o,+ positionVectorFromOBJ: this._positions[o],+ positionColorsFromOBJ: this._getColor(o)+ });+ }+ this._triangles.length = 0;+ }+ /**+ * Create triangles and push the data for each polygon for the pattern 2+ * In this pattern we get vertice positions and uvs+ * @param face+ * @param v+ */+ _setDataForCurrentFaceWithPattern2(t, n) {+ this._getTriangles(t, n);+ for (let i = 0; i < this._triangles.length; i++) {+ const o = this._triangles[i].split("/"), l = parseInt(o[0]) - 1, h = parseInt(o[1]) - 1;+ this._setData({+ indicePositionFromObj: l,+ indiceUvsFromObj: h,+ positionVectorFromOBJ: this._positions[l],+ textureVectorFromOBJ: this._uvs[h],+ positionColorsFromOBJ: this._getColor(l)+ });+ }+ this._triangles.length = 0;+ }+ /**+ * Create triangles and push the data for each polygon for the pattern 3+ * In this pattern we get vertice positions, uvs and normals+ * @param face+ * @param v+ */+ _setDataForCurrentFaceWithPattern3(t, n) {+ this._getTriangles(t, n);+ for (let i = 0; i < this._triangles.length; i++) {+ const o = this._triangles[i].split("/"), l = parseInt(o[0]) - 1, h = parseInt(o[1]) - 1, _ = parseInt(o[2]) - 1;+ this._setData({+ indicePositionFromObj: l,+ indiceUvsFromObj: h,+ indiceNormalFromObj: _,+ positionVectorFromOBJ: this._positions[l],+ textureVectorFromOBJ: this._uvs[h],+ normalsVectorFromOBJ: this._normals[_]+ });+ }+ this._triangles.length = 0;+ }+ /**+ * Create triangles and push the data for each polygon for the pattern 4+ * In this pattern we get vertice positions and normals+ * @param face+ * @param v+ */+ _setDataForCurrentFaceWithPattern4(t, n) {+ this._getTriangles(t, n);+ for (let i = 0; i < this._triangles.length; i++) {+ const o = this._triangles[i].split("//"), l = parseInt(o[0]) - 1, h = parseInt(o[1]) - 1;+ this._setData({+ indicePositionFromObj: l,+ indiceNormalFromObj: h,+ positionVectorFromOBJ: this._positions[l],+ normalsVectorFromOBJ: this._normals[h],+ positionColorsFromOBJ: this._getColor(l)+ });+ }+ this._triangles.length = 0;+ }+ /*+ * Create triangles and push the data for each polygon for the pattern 3+ * In this pattern we get vertice positions, uvs and normals+ * @param face+ * @param v+ */+ _setDataForCurrentFaceWithPattern5(t, n) {+ this._getTriangles(t, n);+ for (let i = 0; i < this._triangles.length; i++) {+ const o = this._triangles[i].split("/"), l = this._positions.length + parseInt(o[0]), h = this._uvs.length + parseInt(o[1]), _ = this._normals.length + parseInt(o[2]);+ this._setData({+ indicePositionFromObj: l,+ indiceUvsFromObj: h,+ indiceNormalFromObj: _,+ positionVectorFromOBJ: this._positions[l],+ textureVectorFromOBJ: this._uvs[h],+ normalsVectorFromOBJ: this._normals[_],+ positionColorsFromOBJ: this._getColor(l)+ });+ }+ this._triangles.length = 0;+ }+ _addPreviousObjMesh() {+ this._meshesFromObj.length > 0 && (this._handledMesh = this._meshesFromObj[this._meshesFromObj.length - 1], this._unwrapData(), this._loadingOptions.useLegacyBehavior && this._indicesForBabylon.reverse(), this._handledMesh.indices = this._indicesForBabylon.slice(), this._handledMesh.positions = this._unwrappedPositionsForBabylon.slice(), this._unwrappedNormalsForBabylon.length && (this._handledMesh.normals = this._unwrappedNormalsForBabylon.slice()), this._unwrappedUVForBabylon.length && (this._handledMesh.uvs = this._unwrappedUVForBabylon.slice()), this._unwrappedColorsForBabylon.length && (this._handledMesh.colors = this._unwrappedColorsForBabylon.slice()), this._handledMesh.hasLines = this._hasLineData, this._indicesForBabylon.length = 0, this._unwrappedPositionsForBabylon.length = 0, this._unwrappedColorsForBabylon.length = 0, this._unwrappedNormalsForBabylon.length = 0, this._unwrappedUVForBabylon.length = 0, this._hasLineData = !1);+ }+ _optimizeNormals(t) {+ const n = t.getVerticesData(B.PositionKind), i = t.getVerticesData(B.NormalKind), o = {};+ if (!n || !i)+ return;+ for (let h = 0; h < n.length / 3; h++) {+ const _ = n[h * 3 + 0], a = n[h * 3 + 1], u = n[h * 3 + 2], r = _ + "_" + a + "_" + u;+ let s = o[r];+ s || (s = [], o[r] = s), s.push(h);+ }+ const l = new w();+ for (const h in o) {+ const _ = o[h];+ if (_.length < 2)+ continue;+ const a = _[0];+ for (let u = 1; u < _.length; ++u) {+ const r = _[u];+ i[a * 3 + 0] += i[r * 3 + 0], i[a * 3 + 1] += i[r * 3 + 1], i[a * 3 + 2] += i[r * 3 + 2];+ }+ l.copyFromFloats(i[a * 3 + 0], i[a * 3 + 1], i[a * 3 + 2]), l.normalize();+ for (let u = 0; u < _.length; ++u) {+ const r = _[u];+ i[r * 3 + 0] = l.x, i[r * 3 + 1] = l.y, i[r * 3 + 2] = l.z;+ }+ }+ t.setVerticesData(B.NormalKind, i);+ }+ static _IsLineElement(t) {+ return t.startsWith("l");+ }+ static _IsObjectElement(t) {+ return t.startsWith("o");+ }+ static _IsGroupElement(t) {+ return t.startsWith("g");+ }+ static _GetZbrushMRGB(t, n) {+ if (!t.startsWith("mrgb"))+ return null;+ if (t = t.replace("mrgb", "").trim(), n)+ return [];+ const i = /[a-z0-9]/g, o = t.match(i);+ if (!o || o.length % 8 !== 0)+ return [];+ const l = [];+ for (let h = 0; h < o.length / 8; h++) {+ const _ = o[h * 8 + 2] + o[h * 8 + 3], a = o[h * 8 + 4] + o[h * 8 + 5], u = o[h * 8 + 6] + o[h * 8 + 7];+ l.push(new M(parseInt(_, 16) / 255, parseInt(a, 16) / 255, parseInt(u, 16) / 255, 1));+ }+ return l;+ }+ /**+ * Function used to parse an OBJ string+ * @param meshesNames defines the list of meshes to load (all if not defined)+ * @param data defines the OBJ string+ * @param scene defines the hosting scene+ * @param assetContainer defines the asset container to load data in+ * @param onFileToLoadFound defines a callback that will be called if a MTL file is found+ */+ parse(t, n, i, o, l) {+ n = n.replace(/#MRGB/g, "mrgb"), n = n.replace(/#.*$/gm, "").trim(), this._loadingOptions.useLegacyBehavior ? (this._pushTriangle = (r, s) => this._triangles.push(r[0], r[s], r[s + 1]), this._handednessSign = 1) : i.useRightHandedSystem ? (this._pushTriangle = (r, s) => this._triangles.push(r[0], r[s + 1], r[s]), this._handednessSign = 1) : (this._pushTriangle = (r, s) => this._triangles.push(r[0], r[s], r[s + 1]), this._handednessSign = -1);+ const h = n.split(`+`), _ = [];+ let a = [];+ _.push(a);+ for (let r = 0; r < h.length; r++) {+ const s = h[r].trim().replace(/\s\s/g, " ");+ if (!(s.length === 0 || s.charAt(0) === "#"))+ if ((m._IsGroupElement(s) || m._IsObjectElement(s)) && (a = [], _.push(a)), m._IsLineElement(s)) {+ const e = s.split(" ");+ for (let p = 1; p < e.length - 1; p++)+ a.push(`l ${e[p]} ${e[p + 1]}`);+ } else+ a.push(s);+ }+ const u = _.flat();+ for (let r = 0; r < u.length; r++) {+ const s = u[r].trim().replace(/\s\s/g, " ");+ let e;+ if (!(s.length === 0 || s.charAt(0) === "#"))+ if (m.VertexPattern.test(s)) {+ if (e = s.match(/[^ ]+/g), this._positions.push(new w(parseFloat(e[1]), parseFloat(e[2]), parseFloat(e[3]))), this._loadingOptions.importVertexColors)+ if (e.length >= 7) {+ const p = parseFloat(e[4]), d = parseFloat(e[5]), F = parseFloat(e[6]);+ this._colors.push(new M(p > 1 ? p / 255 : p, d > 1 ? d / 255 : d, F > 1 ? F / 255 : F, e.length === 7 || e[7] === void 0 ? 1 : parseFloat(e[7])));+ } else+ this._colors.push(this._grayColor);+ } else if ((e = m.NormalPattern.exec(s)) !== null)+ this._normals.push(new w(parseFloat(e[1]), parseFloat(e[2]), parseFloat(e[3])));+ else if ((e = m.UVPattern.exec(s)) !== null)+ this._uvs.push(new V(parseFloat(e[1]) * this._loadingOptions.UVScaling.x, parseFloat(e[2]) * this._loadingOptions.UVScaling.y));+ else if ((e = m.FacePattern3.exec(s)) !== null)+ this._setDataForCurrentFaceWithPattern3(+ e[1].trim().split(" "),+ // ["1/1/1", "2/2/2", "3/3/3"]+ 1+ );+ else if ((e = m.FacePattern4.exec(s)) !== null)+ this._setDataForCurrentFaceWithPattern4(+ e[1].trim().split(" "),+ // ["1//1", "2//2", "3//3"]+ 1+ );+ else if ((e = m.FacePattern5.exec(s)) !== null)+ this._setDataForCurrentFaceWithPattern5(+ e[1].trim().split(" "),+ // ["-1/-1/-1", "-2/-2/-2", "-3/-3/-3"]+ 1+ );+ else if ((e = m.FacePattern2.exec(s)) !== null)+ this._setDataForCurrentFaceWithPattern2(+ e[1].trim().split(" "),+ // ["1/1", "2/2", "3/3"]+ 1+ );+ else if ((e = m.FacePattern1.exec(s)) !== null)+ this._setDataForCurrentFaceWithPattern1(+ e[1].trim().split(" "),+ // ["1", "2", "3"]+ 1+ );+ else if ((e = m.LinePattern1.exec(s)) !== null)+ this._setDataForCurrentFaceWithPattern1(+ e[1].trim().split(" "),+ // ["1", "2"]+ 0+ ), this._hasLineData = !0;+ else if ((e = m.LinePattern2.exec(s)) !== null)+ this._setDataForCurrentFaceWithPattern2(+ e[1].trim().split(" "),+ // ["1/1", "2/2"]+ 0+ ), this._hasLineData = !0;+ else if (e = m._GetZbrushMRGB(s, !this._loadingOptions.importVertexColors))+ for (const p of e)+ this._extColors.push(p);+ else if ((e = m.LinePattern3.exec(s)) !== null)+ this._setDataForCurrentFaceWithPattern3(+ e[1].trim().split(" "),+ // ["1/1/1", "2/2/2"]+ 0+ ), this._hasLineData = !0;+ else if (m.GroupDescriptor.test(s) || m.ObjectDescriptor.test(s)) {+ const p = {+ name: s.substring(2).trim(),+ //Set the name of the current obj mesh+ indices: null,+ positions: null,+ normals: null,+ uvs: null,+ colors: null,+ materialName: this._materialNameFromObj,+ isObject: m.ObjectDescriptor.test(s)+ };+ this._addPreviousObjMesh(), this._meshesFromObj.push(p), this._hasMeshes = !0, this._isFirstMaterial = !0, this._increment = 1;+ } else if (m.UseMtlDescriptor.test(s)) {+ if (this._materialNameFromObj = s.substring(7).trim(), !this._isFirstMaterial || !this._hasMeshes) {+ this._addPreviousObjMesh();+ const p = (+ //Set the name of the current obj mesh+ {+ name: (this._objMeshName || "mesh") + "_mm" + this._increment.toString(),+ //Set the name of the current obj mesh+ indices: null,+ positions: null,+ normals: null,+ uvs: null,+ colors: null,+ materialName: this._materialNameFromObj,+ isObject: !1+ }+ );+ this._increment++, this._meshesFromObj.push(p), this._hasMeshes = !0;+ }+ this._hasMeshes && this._isFirstMaterial && (this._meshesFromObj[this._meshesFromObj.length - 1].materialName = this._materialNameFromObj, this._isFirstMaterial = !1);+ } else m.MtlLibGroupDescriptor.test(s) ? l(s.substring(7).trim()) : m.SmoothDescriptor.test(s) || L.Log("Unhandled expression at line : " + s);+ }+ if (this._hasMeshes && (this._handledMesh = this._meshesFromObj[this._meshesFromObj.length - 1], this._loadingOptions.useLegacyBehavior && this._indicesForBabylon.reverse(), this._unwrapData(), this._handledMesh.indices = this._indicesForBabylon, this._handledMesh.positions = this._unwrappedPositionsForBabylon, this._unwrappedNormalsForBabylon.length && (this._handledMesh.normals = this._unwrappedNormalsForBabylon), this._unwrappedUVForBabylon.length && (this._handledMesh.uvs = this._unwrappedUVForBabylon), this._unwrappedColorsForBabylon.length && (this._handledMesh.colors = this._unwrappedColorsForBabylon), this._handledMesh.hasLines = this._hasLineData), !this._hasMeshes) {+ let r = null;+ if (this._indicesForBabylon.length)+ this._loadingOptions.useLegacyBehavior && this._indicesForBabylon.reverse(), this._unwrapData();+ else {+ for (const s of this._positions)+ this._unwrappedPositionsForBabylon.push(s.x, s.y, s.z);+ if (this._normals.length)+ for (const s of this._normals)+ this._unwrappedNormalsForBabylon.push(s.x, s.y, s.z);+ if (this._uvs.length)+ for (const s of this._uvs)+ this._unwrappedUVForBabylon.push(s.x, s.y);+ if (this._extColors.length)+ for (const s of this._extColors)+ this._unwrappedColorsForBabylon.push(s.r, s.g, s.b, s.a);+ else if (this._colors.length)+ for (const s of this._colors)+ this._unwrappedColorsForBabylon.push(s.r, s.g, s.b, s.a);+ this._materialNameFromObj || (r = new T(P.RandomId(), i), r.pointsCloud = !0, this._materialNameFromObj = r.name, this._normals.length || (r.disableLighting = !0, r.emissiveColor = b.White()));+ }+ this._meshesFromObj.push({+ name: P.RandomId(),+ indices: this._indicesForBabylon,+ positions: this._unwrappedPositionsForBabylon,+ colors: this._unwrappedColorsForBabylon,+ normals: this._unwrappedNormalsForBabylon,+ uvs: this._unwrappedUVForBabylon,+ materialName: this._materialNameFromObj,+ directMaterial: r,+ isObject: !0,+ hasLines: this._hasLineData+ });+ }+ for (let r = 0; r < this._meshesFromObj.length; r++) {+ if (t && this._meshesFromObj[r].name) {+ if (t instanceof Array) {+ if (t.indexOf(this._meshesFromObj[r].name) === -1)+ continue;+ } else if (this._meshesFromObj[r].name !== t)+ continue;+ }+ this._handledMesh = this._meshesFromObj[r], i._blockEntityCollection = !!o;+ const s = new v(this._meshesFromObj[r].name, i);+ if (s._parentContainer = o, i._blockEntityCollection = !1, this._handledMesh._babylonMesh = s, !this._handledMesh.isObject) {+ for (let p = r - 1; p >= 0; --p)+ if (this._meshesFromObj[p].isObject && this._meshesFromObj[p]._babylonMesh) {+ s.parent = this._meshesFromObj[p]._babylonMesh;+ break;+ }+ }+ if (this._materialToUse.push(this._meshesFromObj[r].materialName), this._handledMesh.hasLines && (s._internalMetadata ?? (s._internalMetadata = {}), s._internalMetadata._isLine = !0), this._handledMesh.positions?.length === 0) {+ this._babylonMeshesArray.push(s);+ continue;+ }+ const e = new E();+ if (e.indices = this._handledMesh.indices, e.positions = this._handledMesh.positions, this._loadingOptions.computeNormals || !this._handledMesh.normals) {+ const p = new Array();+ E.ComputeNormals(this._handledMesh.positions, this._handledMesh.indices, p), e.normals = p;+ } else+ e.normals = this._handledMesh.normals;+ this._handledMesh.uvs && (e.uvs = this._handledMesh.uvs), this._handledMesh.colors && (e.colors = this._handledMesh.colors), e.applyToMesh(s), this._loadingOptions.invertY && (s.scaling.y *= -1), this._loadingOptions.optimizeNormals && this._optimizeNormals(s), this._babylonMeshesArray.push(s), this._handledMesh.directMaterial && (s.material = this._handledMesh.directMaterial);+ }+ }+}+m.ObjectDescriptor = /^o/;+m.GroupDescriptor = /^g/;+m.MtlLibGroupDescriptor = /^mtllib /;+m.UseMtlDescriptor = /^usemtl /;+m.SmoothDescriptor = /^s /;+m.VertexPattern = /^v(\s+[\d|.|+|\-|e|E]+){3,7}/;+m.NormalPattern = /^vn(\s+[\d|.|+|\-|e|E]+)( +[\d|.|+|\-|e|E]+)( +[\d|.|+|\-|e|E]+)/;+m.UVPattern = /^vt(\s+[\d|.|+|\-|e|E]+)( +[\d|.|+|\-|e|E]+)/;+m.FacePattern1 = /^f\s+(([\d]{1,}[\s]?){3,})+/;+m.FacePattern2 = /^f\s+((([\d]{1,}\/[\d]{1,}[\s]?){3,})+)/;+m.FacePattern3 = /^f\s+((([\d]{1,}\/[\d]{1,}\/[\d]{1,}[\s]?){3,})+)/;+m.FacePattern4 = /^f\s+((([\d]{1,}\/\/[\d]{1,}[\s]?){3,})+)/;+m.FacePattern5 = /^f\s+(((-[\d]{1,}\/-[\d]{1,}\/-[\d]{1,}[\s]?){3,})+)/;+m.LinePattern1 = /^l\s+(([\d]{1,}[\s]?){2,})+/;+m.LinePattern2 = /^l\s+((([\d]{1,}\/[\d]{1,}[\s]?){2,})+)/;+m.LinePattern3 = /^l\s+((([\d]{1,}\/[\d]{1,}\/[\d]{1,}[\s]?){2,})+)/;+class c {+ /**+ * Invert Y-Axis of referenced textures on load+ */+ static get INVERT_TEXTURE_Y() {+ return f.INVERT_TEXTURE_Y;+ }+ static set INVERT_TEXTURE_Y(t) {+ f.INVERT_TEXTURE_Y = t;+ }+ /**+ * Creates loader for .OBJ files+ *+ * @param loadingOptions options for loading and parsing OBJ/MTL files.+ */+ constructor(t) {+ this.name = x.name, this.extensions = x.extensions, this._assetContainer = null, this._loadingOptions = { ...c._DefaultLoadingOptions, ...t ?? {} };+ }+ static get _DefaultLoadingOptions() {+ return {+ computeNormals: c.COMPUTE_NORMALS,+ optimizeNormals: c.OPTIMIZE_NORMALS,+ importVertexColors: c.IMPORT_VERTEX_COLORS,+ invertY: c.INVERT_Y,+ invertTextureY: c.INVERT_TEXTURE_Y,+ // eslint-disable-next-line @typescript-eslint/naming-convention+ UVScaling: c.UV_SCALING,+ materialLoadingFailsSilently: c.MATERIAL_LOADING_FAILS_SILENTLY,+ optimizeWithUV: c.OPTIMIZE_WITH_UV,+ skipMaterials: c.SKIP_MATERIALS,+ useLegacyBehavior: c.USE_LEGACY_BEHAVIOR+ };+ }+ /**+ * Calls synchronously the MTL file attached to this obj.+ * Load function or importMesh function don't enable to load 2 files in the same time asynchronously.+ * Without this function materials are not displayed in the first frame (but displayed after).+ * In consequence it is impossible to get material information in your HTML file+ *+ * @param url The URL of the MTL file+ * @param rootUrl defines where to load data from+ * @param onSuccess Callback function to be called when the MTL file is loaded+ * @param onFailure+ */+ _loadMTL(t, n, i, o) {+ const l = n + t;+ C.LoadFile(l, i, void 0, void 0, !1, (h, _) => {+ o(l, _);+ });+ }+ /** @internal */+ createPlugin(t) {+ return new c(t[x.name]);+ }+ /**+ * If the data string can be loaded directly.+ * @returns if the data can be loaded directly+ */+ canDirectLoad() {+ return !1;+ }+ /**+ * Imports one or more meshes from the loaded OBJ data and adds them to the scene+ * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file+ * @param scene the scene the meshes should be added to+ * @param data the OBJ data to load+ * @param rootUrl root url to load from+ * @returns a promise containing the loaded meshes, particles, skeletons and animations+ */+ // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax+ importMeshAsync(t, n, i, o) {+ return this._parseSolidAsync(t, n, i, o).then((l) => ({+ meshes: l,+ particleSystems: [],+ skeletons: [],+ animationGroups: [],+ transformNodes: [],+ geometries: [],+ lights: [],+ spriteManagers: []+ }));+ }+ /**+ * Imports all objects from the loaded OBJ data and adds them to the scene+ * @param scene the scene the objects should be added to+ * @param data the OBJ data to load+ * @param rootUrl root url to load from+ * @returns a promise which completes when objects have been loaded to the scene+ */+ // eslint-disable-next-line no-restricted-syntax+ loadAsync(t, n, i) {+ return this.importMeshAsync(null, t, n, i).then(() => {+ });+ }+ /**+ * Load into an asset container.+ * @param scene The scene to load into+ * @param data The data to import+ * @param rootUrl The root url for scene and resources+ * @returns The loaded asset container+ */+ // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax+ loadAssetContainerAsync(t, n, i) {+ const o = new D(t);+ return this._assetContainer = o, this.importMeshAsync(null, t, n, i).then((l) => (l.meshes.forEach((h) => o.meshes.push(h)), l.meshes.forEach((h) => {+ const _ = h.material;+ _ && o.materials.indexOf(_) == -1 && (o.materials.push(_), _.getActiveTextures().forEach((u) => {+ o.textures.indexOf(u) == -1 && o.textures.push(u);+ }));+ }), this._assetContainer = null, o)).catch((l) => {+ throw this._assetContainer = null, l;+ });+ }+ /**+ * Read the OBJ file and create an Array of meshes.+ * Each mesh contains all information given by the OBJ and the MTL file.+ * i.e. vertices positions and indices, optional normals values, optional UV values, optional material+ * @param meshesNames defines a string or array of strings of the mesh names that should be loaded from the file+ * @param scene defines the scene where are displayed the data+ * @param data defines the content of the obj file+ * @param rootUrl defines the path to the folder+ * @returns the list of loaded meshes+ */+ // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax+ _parseSolidAsync(t, n, i, o) {+ let l = "";+ const h = new f(), _ = [], a = [];+ i = i.replace(/#.*$/gm, "").trim(), new m(_, a, this._loadingOptions).parse(t, i, n, this._assetContainer, (s) => {+ l = s;+ });+ const r = [];+ return l !== "" && !this._loadingOptions.skipMaterials && r.push(new Promise((s, e) => {+ this._loadMTL(l, o, (p) => {+ try {+ h.parseMTL(n, p, o, this._assetContainer);+ for (let d = 0; d < h.materials.length; d++) {+ let F = 0;+ const g = [];+ let y;+ for (; (y = _.indexOf(h.materials[d].name, F)) > -1; )+ g.push(y), F = y + 1;+ if (y === -1 && g.length === 0)+ h.materials[d].dispose();+ else+ for (let O = 0; O < g.length; O++) {+ const I = a[g[O]], N = h.materials[d];+ I.material = N, I.getTotalIndices() || (N.pointsCloud = !0);+ }+ }+ s();+ } catch (d) {+ C.Warn(`Error processing MTL file: '${l}'`), this._loadingOptions.materialLoadingFailsSilently ? s() : e(d);+ }+ }, (p, d) => {+ C.Warn(`Error downloading MTL file: '${l}'`), this._loadingOptions.materialLoadingFailsSilently ? s() : e(d);+ });+ })), Promise.all(r).then(() => {+ const s = (e) => !!(e._internalMetadata?._isLine ?? !1);+ return a.forEach((e) => {+ if (s(e)) {+ let p = e.material ?? new T(e.name + "_line", n);+ p.getBindedMeshes().filter((F) => !s(F)).length > 0 && (p = p.clone(p.name + "_line") ?? p), p.wireframe = !0, e.material = p, e._internalMetadata && (e._internalMetadata._isLine = void 0);+ }+ }), a;+ });+ }+}+c.OPTIMIZE_WITH_UV = !0;+c.INVERT_Y = !1;+c.IMPORT_VERTEX_COLORS = !1;+c.COMPUTE_NORMALS = !1;+c.OPTIMIZE_NORMALS = !1;+c.UV_SCALING = new V(1, 1);+c.SKIP_MATERIALS = !1;+c.MATERIAL_LOADING_FAILS_SILENTLY = !0;+c.USE_LEGACY_BEHAVIOR = !1;+A(new c());+export {+ c as OBJFileLoader+};
vendor/adom-step/vendor/3d-viewer-dist/chunk-CxjklEwO.jsadded+5@@ -0,0 +1,5 @@+import { bW as e } from "./chunk-IERganv1.js";+const r = "lod3DPixelShader", o = `precision highp float;precision highp sampler3D;const float GammaEncodePowerApprox=1.0/2.2;varying vec2 vUV;uniform sampler3D textureSampler;uniform float lod;uniform float slice;uniform int gamma;void main(void)+{ivec3 textureCoordinates=ivec3(vUV*vec2(textureSize(textureSampler,0).xy),int(slice));gl_FragColor=texelFetch(textureSampler,textureCoordinates,int(lod));if (gamma==0) {gl_FragColor.rgb=pow(gl_FragColor.rgb,vec3(GammaEncodePowerApprox));}}+`;+e.ShadersStore[r] || (e.ShadersStore[r] = o);
vendor/adom-step/vendor/3d-viewer-dist/chunk-D41qXL6t.jsadded+13355@@ -0,0 +1,41022 @@+import { av as J4, aw as $1 } from "./chunk-CODtpsMq.js";+import { cg as x9, a1 as qt, a6 as mo, ch as hn, _ as q, e as H, R as kr, H as Lr, V as Se, bH as Oh, a3 as zh, bg as Ir, u as Eo, ci as yb, a8 as md, ao as K4, T as Wr, d as Is, cj as Ih, i as nr, ak as $4, ck as Kg, cl as ew, bF as C4, x as Jr, cm as A9, cn as C9, co as M9, cp as k9, cq as L9, cr as S9, cs as tw, ai as Mu, j as fi, ct as Wi, aA as xu, cu as eS, bW as br, h as Cb, s as tS, cv as rS, f as ku, g as j9, P as uc, F as Gr, o as Yt, cc as fc, v as hc, ag as Mb, cw as B9, n as vd, E as _d, ca as wd, p as yd, a_ as yu, bD as sl, cx as lw, cy as xb, bQ as ow, cz as N9, cA as I9, cB as z9, bE as D9, cC as M4, cD as T9, cE as E9, Q as wu, cF as k4, cG as oS, cH as _b, aq as L4, bR as jh, b1 as P9, aF as O9 } from "./chunk-IERganv1.js";+import { AdvancedDynamicTextureInstrumentation as R9 } from "./chunk-DbGn2Kk9.js";+function F9($e, i) {+ for (var d = 0; d < i.length; d++) {+ const g = i[d];+ if (typeof g != "string" && !Array.isArray(g)) {+ for (const y in g)+ if (y !== "default" && !(y in $e)) {+ const M = Object.getOwnPropertyDescriptor(g, y);+ M && Object.defineProperty($e, y, M.get ? M : {+ enumerable: !0,+ get: () => g[y]+ });+ }+ }+ }+ return Object.freeze(Object.defineProperty($e, Symbol.toStringTag, { value: "Module" }));+}+var iS = { exports: {} };+const q9 = /* @__PURE__ */ J4(x9);+class St {+ /**+ * Creates a new ValueAndUnit+ * @param value defines the value to store+ * @param unit defines the unit to store - defaults to ValueAndUnit.UNITMODE_PIXEL+ * @param negativeValueAllowed defines a boolean indicating if the value can be negative+ */+ constructor(i, d = St.UNITMODE_PIXEL, g = !0) {+ this.negativeValueAllowed = g, this._value = 1, this._unit = St.UNITMODE_PIXEL, this.ignoreAdaptiveScaling = !1, this.onChangedObservable = new qt(), this._value = i, this._unit = d, this._originalUnit = d;+ }+ /** Gets a boolean indicating if the value is a percentage */+ get isPercentage() {+ return this._unit === St.UNITMODE_PERCENTAGE;+ }+ /** Gets a boolean indicating if the value is store as pixel */+ get isPixel() {+ return this._unit === St.UNITMODE_PIXEL;+ }+ /**+ * Gets value (without units)+ * @deprecated use value property instead+ */+ get internalValue() {+ return this._value;+ }+ /** Gets value (without units) */+ get value() {+ return this._value;+ }+ /** Sets value (without units) */+ set value(i) {+ i !== this._value && (this._value = i, this.onChangedObservable.notifyObservers());+ }+ /** Gets units (without value) */+ get unit() {+ return this._unit;+ }+ /** Sets units (without value) */+ set unit(i) {+ i !== this._unit && (this._unit = i, this.onChangedObservable.notifyObservers());+ }+ /**+ * Gets value as pixel+ * @param host defines the root host+ * @param refValue defines the reference value for percentages+ * @returns the value as pixel+ */+ getValueInPixel(i, d) {+ return this.isPixel ? this.getValue(i) : this.getValue(i) * d;+ }+ /**+ * Update the current value and unit.+ * @param value defines the value to store+ * @param unit defines the unit to store+ * @returns the current ValueAndUnit+ */+ updateInPlace(i, d = St.UNITMODE_PIXEL) {+ return (this.value !== i || this.unit !== d) && (this._value = i, this._unit = d, this.onChangedObservable.notifyObservers()), this;+ }+ /**+ * Gets the value accordingly to its unit+ * @param host defines the root host+ * @returns the value+ */+ getValue(i) {+ if (i && !this.ignoreAdaptiveScaling && this.unit !== St.UNITMODE_PERCENTAGE) {+ let d = 0, g = 0;+ if (i.idealWidth && (d = Math.ceil(this._value * i.getSize().width / i.idealWidth)), i.idealHeight && (g = Math.ceil(this._value * i.getSize().height / i.idealHeight)), i.useSmallestIdeal && i.idealWidth && i.idealHeight)+ return window.innerWidth < window.innerHeight ? d : g;+ if (i.idealWidth)+ return d;+ if (i.idealHeight)+ return g;+ }+ return this._value;+ }+ /**+ * Gets a string representation of the value+ * @param host defines the root host+ * @param decimals defines an optional number of decimals to display+ * @returns a string+ */+ toString(i, d) {+ switch (this._unit) {+ case St.UNITMODE_PERCENTAGE: {+ const g = this.getValue(i) * 100;+ return (d ? g.toFixed(d) : g) + "%";+ }+ case St.UNITMODE_PIXEL: {+ const g = this.getValue(i);+ return (d ? g.toFixed(d) : g) + "px";+ }+ }+ return this._unit.toString();+ }+ /**+ * Store a value parsed from a string+ * @param source defines the source string+ * @returns true if the value was successfully parsed and updated+ */+ fromString(i) {+ const d = St._Regex.exec(i.toString());+ if (!d || d.length === 0)+ return !1;+ let g = parseFloat(d[1]), y = this._originalUnit;+ if (this.negativeValueAllowed || g < 0 && (g = 0), d.length === 4)+ switch (d[3]) {+ case "px":+ y = St.UNITMODE_PIXEL;+ break;+ case "%":+ y = St.UNITMODE_PERCENTAGE, g /= 100;+ break;+ }+ return g === this._value && y === this._unit ? !1 : (this._value = g, this._unit = y, this.onChangedObservable.notifyObservers(), !0);+ }+ /** UNITMODE_PERCENTAGE */+ static get UNITMODE_PERCENTAGE() {+ return St._UNITMODE_PERCENTAGE;+ }+ /** UNITMODE_PIXEL */+ static get UNITMODE_PIXEL() {+ return St._UNITMODE_PIXEL;+ }+}+St._Regex = /(^-?\d*(\.\d+)?)(%|px)?/;+St._UNITMODE_PERCENTAGE = 0;+St._UNITMODE_PIXEL = 1;+const Bh = [new mo(0, 0), new mo(0, 0), new mo(0, 0), new mo(0, 0)], Jg = [new mo(0, 0), new mo(0, 0), new mo(0, 0), new mo(0, 0)], dc = new mo(0, 0), _u = new mo(0, 0);+class Ko {+ /**+ * Creates a new measure+ * @param left defines left coordinate+ * @param top defines top coordinate+ * @param width defines width dimension+ * @param height defines height dimension+ */+ constructor(i, d, g, y) {+ this.left = i, this.top = d, this.width = g, this.height = y;+ }+ /**+ * Copy from another measure+ * @param other defines the other measure to copy from+ */+ copyFrom(i) {+ this.left = i.left, this.top = i.top, this.width = i.width, this.height = i.height;+ }+ /**+ * Copy from a group of 4 floats+ * @param left defines left coordinate+ * @param top defines top coordinate+ * @param width defines width dimension+ * @param height defines height dimension+ */+ copyFromFloats(i, d, g, y) {+ this.left = i, this.top = d, this.width = g, this.height = y;+ }+ /**+ * Computes the axis aligned bounding box measure for two given measures+ * @param a Input measure+ * @param b Input measure+ * @param result the resulting bounding measure+ */+ static CombineToRef(i, d, g) {+ const y = Math.min(i.left, d.left), M = Math.min(i.top, d.top), N = Math.max(i.left + i.width, d.left + d.width), O = Math.max(i.top + i.height, d.top + d.height);+ g.left = y, g.top = M, g.width = N - y, g.height = O - M;+ }+ /**+ * Computes the axis aligned bounding box of the measure after it is modified by a given transform+ * @param transform the matrix to transform the measure before computing the AABB+ * @param addX number to add to left+ * @param addY number to add to top+ * @param addWidth number to add to width+ * @param addHeight number to add to height+ * @param result the resulting AABB+ */+ addAndTransformToRef(i, d, g, y, M, N) {+ const O = this.left + d, F = this.top + g, ne = this.width + y, $ = this.height + M;+ Bh[0].copyFromFloats(O, F), Bh[1].copyFromFloats(O + ne, F), Bh[2].copyFromFloats(O + ne, F + $), Bh[3].copyFromFloats(O, F + $), dc.copyFromFloats(Number.MAX_VALUE, Number.MAX_VALUE), _u.copyFromFloats(0, 0);+ for (let Q = 0; Q < 4; Q++)+ i.transformCoordinates(Bh[Q].x, Bh[Q].y, Jg[Q]), dc.x = Math.floor(Math.min(dc.x, Jg[Q].x)), dc.y = Math.floor(Math.min(dc.y, Jg[Q].y)), _u.x = Math.ceil(Math.max(_u.x, Jg[Q].x)), _u.y = Math.ceil(Math.max(_u.y, Jg[Q].y));+ N.left = dc.x, N.top = dc.y, N.width = _u.x - dc.x, N.height = _u.y - dc.y;+ }+ /**+ * Computes the axis aligned bounding box of the measure after it is modified by a given transform+ * @param transform the matrix to transform the measure before computing the AABB+ * @param result the resulting AABB+ */+ transformToRef(i, d) {+ this.addAndTransformToRef(i, 0, 0, 0, 0, d);+ }+ /**+ * Check equality between this measure and another one+ * @param other defines the other measures+ * @returns true if both measures are equals+ */+ isEqualsTo(i) {+ return !(this.left !== i.left || this.top !== i.top || this.width !== i.width || this.height !== i.height);+ }+ /**+ * Creates an empty measure+ * @returns a new measure+ */+ static Empty() {+ return new Ko(0, 0, 0, 0);+ }+}+class Nh extends mo {+ /**+ * Creates a new Vector2WithInfo+ * @param source defines the vector2 data to transport+ * @param buttonIndex defines the current mouse button index+ */+ constructor(i, d = 0) {+ super(i.x, i.y), this.buttonIndex = d;+ }+}+class pr {+ /**+ * Creates a new matrix+ * @param m00 defines value for (0, 0)+ * @param m01 defines value for (0, 1)+ * @param m10 defines value for (1, 0)+ * @param m11 defines value for (1, 1)+ * @param m20 defines value for (2, 0)+ * @param m21 defines value for (2, 1)+ */+ constructor(i, d, g, y, M, N) {+ this.m = new Float32Array(6), this.fromValues(i, d, g, y, M, N);+ }+ /**+ * Fills the matrix from direct values+ * @param m00 defines value for (0, 0)+ * @param m01 defines value for (0, 1)+ * @param m10 defines value for (1, 0)+ * @param m11 defines value for (1, 1)+ * @param m20 defines value for (2, 0)+ * @param m21 defines value for (2, 1)+ * @returns the current modified matrix+ */+ fromValues(i, d, g, y, M, N) {+ return this.m[0] = i, this.m[1] = d, this.m[2] = g, this.m[3] = y, this.m[4] = M, this.m[5] = N, this;+ }+ /**+ * Gets matrix determinant+ * @returns the determinant+ */+ determinant() {+ return this.m[0] * this.m[3] - this.m[1] * this.m[2];+ }+ /**+ * Inverses the matrix and stores it in a target matrix+ * @param result defines the target matrix+ * @returns the current matrix+ */+ invertToRef(i) {+ const d = this.m[0], g = this.m[1], y = this.m[2], M = this.m[3], N = this.m[4], O = this.m[5], F = this.determinant();+ if (F < hn * hn)+ return i.m[0] = 0, i.m[1] = 0, i.m[2] = 0, i.m[3] = 0, i.m[4] = 0, i.m[5] = 0, this;+ const ne = 1 / F, $ = y * O - M * N, Q = g * N - d * O;+ return i.m[0] = M * ne, i.m[1] = -g * ne, i.m[2] = -y * ne, i.m[3] = d * ne, i.m[4] = $ * ne, i.m[5] = Q * ne, this;+ }+ /**+ * Multiplies the current matrix with another one+ * @param other defines the second operand+ * @param result defines the target matrix+ * @returns the current matrix+ */+ multiplyToRef(i, d) {+ const g = this.m[0], y = this.m[1], M = this.m[2], N = this.m[3], O = this.m[4], F = this.m[5], ne = i.m[0], $ = i.m[1], Q = i.m[2], X = i.m[3], he = i.m[4], Me = i.m[5];+ return d.m[0] = g * ne + y * Q, d.m[1] = g * $ + y * X, d.m[2] = M * ne + N * Q, d.m[3] = M * $ + N * X, d.m[4] = O * ne + F * Q + he, d.m[5] = O * $ + F * X + Me, this;+ }+ /**+ * Applies the current matrix to a set of 2 floats and stores the result in a vector2+ * @param x defines the x coordinate to transform+ * @param y defines the x coordinate to transform+ * @param result defines the target vector2+ * @returns the current matrix+ */+ transformCoordinates(i, d, g) {+ return g.x = i * this.m[0] + d * this.m[2] + this.m[4], g.y = i * this.m[1] + d * this.m[3] + this.m[5], this;+ }+ // Statics+ /**+ * Creates an identity matrix+ * @returns a new matrix+ */+ static Identity() {+ return new pr(1, 0, 0, 1, 0, 0);+ }+ /**+ * Creates an identity matrix and stores it in a target matrix+ * @param result defines the target matrix+ */+ static IdentityToRef(i) {+ i.m[0] = 1, i.m[1] = 0, i.m[2] = 0, i.m[3] = 1, i.m[4] = 0, i.m[5] = 0;+ }+ /**+ * Creates a translation matrix and stores it in a target matrix+ * @param x defines the x coordinate of the translation+ * @param y defines the y coordinate of the translation+ * @param result defines the target matrix+ */+ static TranslationToRef(i, d, g) {+ g.fromValues(1, 0, 0, 1, i, d);+ }+ /**+ * Creates a scaling matrix and stores it in a target matrix+ * @param x defines the x coordinate of the scaling+ * @param y defines the y coordinate of the scaling+ * @param result defines the target matrix+ */+ static ScalingToRef(i, d, g) {+ g.fromValues(i, 0, 0, d, 0, 0);+ }+ /**+ * Creates a rotation matrix and stores it in a target matrix+ * @param angle defines the rotation angle+ * @param result defines the target matrix+ */+ static RotationToRef(i, d) {+ const g = Math.sin(i), y = Math.cos(i);+ d.fromValues(y, g, -g, y, 0, 0);+ }+ /**+ * Composes a matrix from translation, rotation, scaling and parent matrix and stores it in a target matrix+ * @param tx defines the x coordinate of the translation+ * @param ty defines the y coordinate of the translation+ * @param angle defines the rotation angle+ * @param scaleX defines the x coordinate of the scaling+ * @param scaleY defines the y coordinate of the scaling+ * @param parentMatrix defines the parent matrix to multiply by (can be null)+ * @param result defines the target matrix+ */+ static ComposeToRef(i, d, g, y, M, N, O) {+ pr.TranslationToRef(i, d, pr._TempPreTranslationMatrix), pr.ScalingToRef(y, M, pr._TempScalingMatrix), pr.RotationToRef(g, pr._TempRotationMatrix), pr.TranslationToRef(-i, -d, pr._TempPostTranslationMatrix), pr._TempPreTranslationMatrix.multiplyToRef(pr._TempScalingMatrix, pr._TempCompose0), pr._TempCompose0.multiplyToRef(pr._TempRotationMatrix, pr._TempCompose1), N ? (pr._TempCompose1.multiplyToRef(pr._TempPostTranslationMatrix, pr._TempCompose2), pr._TempCompose2.multiplyToRef(N, O)) : pr._TempCompose1.multiplyToRef(pr._TempPostTranslationMatrix, O);+ }+}+pr._TempPreTranslationMatrix = pr.Identity();+pr._TempPostTranslationMatrix = pr.Identity();+pr._TempRotationMatrix = pr.Identity();+pr._TempScalingMatrix = pr.Identity();+pr._TempCompose0 = pr.Identity();+pr._TempCompose1 = pr.Identity();+pr._TempCompose2 = pr.Identity();+class kb {+ /**+ * Rounds a number to the nearest multiple of a given precision+ * @param value the value to be rounded+ * @param precision the multiple to which the value will be rounded. Default is 100 (2 decimal digits)+ * @returns+ */+ static Round(i, d = kb.DefaultRoundingPrecision) {+ return Math.round(i * d) / d;+ }+}+kb.DefaultRoundingPrecision = 100;+class pe {+ /**+ * Gets or sets a boolean indicating if the control is readonly (default: false).+ * A readonly control will still raise pointer events but will not react to them+ */+ get isReadOnly() {+ return this._isReadOnly;+ }+ set isReadOnly(i) {+ this._isReadOnly = i;+ }+ /**+ * Gets the transformed measure, that is the bounding box of the control after applying all transformations+ */+ get transformedMeasure() {+ return this._evaluatedMeasure;+ }+ /**+ * Sets/Gets a boolean indicating if the children are clipped to the current control bounds.+ * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children+ */+ set clipChildren(i) {+ this._clipChildren = i;+ }+ get clipChildren() {+ return this._clipChildren;+ }+ /**+ * Sets/Gets a boolean indicating that control content must be clipped+ * Please note that not clipping content may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children+ */+ set clipContent(i) {+ this._clipContent = i;+ }+ get clipContent() {+ return this._clipContent;+ }+ /** Gets or sets a value indicating the offset in pixels to apply on X axis to render the shadow */+ get shadowOffsetX() {+ return this._shadowOffsetX;+ }+ set shadowOffsetX(i) {+ this._shadowOffsetX !== i && (this._shadowOffsetX = i, this._markAsDirty());+ }+ /** Gets or sets a value indicating the offset in pixels to apply on Y axis to render the shadow */+ get shadowOffsetY() {+ return this._shadowOffsetY;+ }+ set shadowOffsetY(i) {+ this._shadowOffsetY !== i && (this._shadowOffsetY = i, this._markAsDirty());+ }+ /** Gets or sets a value indicating the amount of blur to use to render the shadow */+ get shadowBlur() {+ return this._shadowBlur;+ }+ set shadowBlur(i) {+ this._shadowBlur !== i && (this._previousShadowBlur = this._shadowBlur, this._shadowBlur = i, this._markAsDirty());+ }+ /** Gets or sets a value indicating the color of the shadow (black by default ie. "#000") */+ get shadowColor() {+ return this._shadowColor;+ }+ set shadowColor(i) {+ this._shadowColor !== i && (this._shadowColor = i, this._markAsDirty());+ }+ // Properties+ /** Gets the control type name */+ get typeName() {+ return this._getTypeName();+ }+ /**+ * Get the current class name of the control.+ * @returns current class name+ */+ getClassName() {+ return this._getTypeName();+ }+ /**+ * Gets or sets the accessibility tag to describe the control for accessibility purpose.+ * By default, GUI controls already indicate accessibility info, but one can override the info using this tag.+ */+ set accessibilityTag(i) {+ this._accessibilityTag = i, this.onAccessibilityTagChangedObservable.notifyObservers(i);+ }+ get accessibilityTag() {+ return this._accessibilityTag;+ }+ /**+ * Get the hosting AdvancedDynamicTexture+ */+ get host() {+ return this._host;+ }+ /** Gets or set information about font offsets (used to render and align text) */+ get fontOffset() {+ return this._fontOffset;+ }+ set fontOffset(i) {+ this._fontOffset = i;+ }+ /** Gets or sets alpha value for the control (1 means opaque and 0 means entirely transparent) */+ get alpha() {+ return this._alpha;+ }+ set alpha(i) {+ this._alpha !== i && (this._alphaSet = !0, this._alpha = i, this._markAsDirty());+ }+ /**+ * Gets or sets a number indicating size of stroke we want to highlight the control with (mostly for debugging purpose)+ */+ get highlightLineWidth() {+ return this._highlightLineWidth;+ }+ set highlightLineWidth(i) {+ this._highlightLineWidth !== i && (this._highlightLineWidth = i, this._markAsDirty());+ }+ /**+ * Gets or sets a boolean indicating that we want to highlight the control (mostly for debugging purpose)+ */+ get isHighlighted() {+ return this._isHighlighted;+ }+ set isHighlighted(i) {+ this._isHighlighted !== i && (this._isHighlighted = i, this._markAsDirty());+ }+ /**+ * Gets or sets a string defining the color to use for highlighting this control+ */+ get highlightColor() {+ return this._highlightColor;+ }+ set highlightColor(i) {+ this._highlightColor !== i && (this._highlightColor = i, this._markAsDirty());+ }+ /** Gets or sets a value indicating the scale factor on X axis (1 by default)+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling+ */+ get scaleX() {+ return this._scaleX;+ }+ set scaleX(i) {+ this._scaleX !== i && (this._scaleX = i, this._markAsDirty(), this._markMatrixAsDirty());+ }+ /** Gets or sets a value indicating the scale factor on Y axis (1 by default)+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling+ */+ get scaleY() {+ return this._scaleY;+ }+ set scaleY(i) {+ this._scaleY !== i && (this._scaleY = i, this._markAsDirty(), this._markMatrixAsDirty());+ }+ /** Gets or sets the rotation angle (0 by default)+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling+ */+ get rotation() {+ return this._rotation;+ }+ set rotation(i) {+ this._rotation !== i && (this._rotation = i, this._markAsDirty(), this._markMatrixAsDirty());+ }+ /** Gets or sets the transformation center on Y axis (0 by default)+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling+ */+ get transformCenterY() {+ return this._transformCenterY;+ }+ set transformCenterY(i) {+ this._transformCenterY !== i && (this._transformCenterY = i, this._markAsDirty(), this._markMatrixAsDirty());+ }+ /** Gets or sets the transformation center on X axis (0 by default)+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling+ */+ get transformCenterX() {+ return this._transformCenterX;+ }+ set transformCenterX(i) {+ this._transformCenterX !== i && (this._transformCenterX = i, this._markAsDirty(), this._markMatrixAsDirty());+ }+ /**+ * Gets or sets the horizontal alignment+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments+ */+ get horizontalAlignment() {+ return this._horizontalAlignment;+ }+ set horizontalAlignment(i) {+ this._horizontalAlignment !== i && (this._horizontalAlignment = i, this._markAsDirty());+ }+ /**+ * Gets or sets the vertical alignment+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments+ */+ get verticalAlignment() {+ return this._verticalAlignment;+ }+ set verticalAlignment(i) {+ this._verticalAlignment !== i && (this._verticalAlignment = i, this._markAsDirty());+ }+ set fixedRatio(i) {+ this._fixedRatio !== i && (this._fixedRatio = i, this._markAsDirty());+ }+ /**+ * Gets or sets a fixed ratio for this control.+ * When different from 0, the ratio is used to compute the "second" dimension.+ * The first dimension used in the computation is the last one set (by setting width / widthInPixels or height / heightInPixels), and the+ * second dimension is computed as first dimension * fixedRatio+ */+ get fixedRatio() {+ return this._fixedRatio;+ }+ set fixedRatioMasterIsWidth(i) {+ this._fixedRatioMasterIsWidth !== i && (this._fixedRatioMasterIsWidth = i, this._markAsDirty());+ }+ /**+ * Gets or sets a boolean indicating that the fixed ratio is set on the width instead of the height. True by default.+ * When the height of a control is set, this property is changed to false.+ */+ get fixedRatioMasterIsWidth() {+ return this._fixedRatioMasterIsWidth;+ }+ /**+ * Gets or sets control width+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get width() {+ return this._width.toString(this._host);+ }+ set width(i) {+ this._fixedRatioMasterIsWidth = !0, this._width.toString(this._host) !== i && this._width.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets the control width in pixel+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get widthInPixels() {+ return this._width.getValueInPixel(this._host, this._cachedParentMeasure.width);+ }+ set widthInPixels(i) {+ isNaN(i) || (this._fixedRatioMasterIsWidth = !0, this.width = i + "px");+ }+ /**+ * Gets or sets control height+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get height() {+ return this._height.toString(this._host);+ }+ set height(i) {+ this._fixedRatioMasterIsWidth = !1, this._height.toString(this._host) !== i && this._height.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets control height in pixel+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get heightInPixels() {+ return this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);+ }+ set heightInPixels(i) {+ isNaN(i) || (this._fixedRatioMasterIsWidth = !1, this.height = i + "px");+ }+ /** Gets or set font family */+ get fontFamily() {+ return this._fontFamily;+ }+ set fontFamily(i) {+ this._fontFamily !== i && (this._fontFamily = i, this._resetFontCache());+ }+ /** Gets or sets font style */+ get fontStyle() {+ return this._fontStyle;+ }+ set fontStyle(i) {+ this._fontStyle !== i && (this._fontStyle = i, this._resetFontCache());+ }+ /** Gets or sets font weight */+ get fontWeight() {+ return this._fontWeight;+ }+ set fontWeight(i) {+ this._fontWeight !== i && (this._fontWeight = i, this._resetFontCache());+ }+ /**+ * Gets or sets style+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#styles+ */+ get style() {+ return this._style;+ }+ set style(i) {+ this._style && (this._style.onChangedObservable.remove(this._styleObserver), this._styleObserver = null), this._style = i, this._style && (this._styleObserver = this._style.onChangedObservable.add(() => {+ this._markAsDirty(), this._resetFontCache();+ })), this._markAsDirty(), this._resetFontCache();+ }+ /** @internal */+ get _isFontSizeInPercentage() {+ return this._fontSize.isPercentage;+ }+ /** Gets or sets font size in pixels */+ get fontSizeInPixels() {+ const i = this._style ? this._style._fontSize : this._fontSize;+ return i.isPixel ? i.getValue(this._host) : i.getValueInPixel(this._host, this._tempParentMeasure.height || this._cachedParentMeasure.height);+ }+ set fontSizeInPixels(i) {+ isNaN(i) || (this.fontSize = i + "px");+ }+ /** Gets or sets font size */+ get fontSize() {+ return this._fontSize.toString(this._host);+ }+ set fontSize(i) {+ this._fontSize.toString(this._host) !== i && this._fontSize.fromString(i) && (this._markAsDirty(), this._resetFontCache());+ }+ /** Gets or sets foreground color */+ get color() {+ return this._color;+ }+ set color(i) {+ this._color !== i && (this._color = i, this._markAsDirty());+ }+ /** Gets or sets gradient. Setting a gradient will override the color */+ get gradient() {+ return this._gradient;+ }+ set gradient(i) {+ this._gradient !== i && (this._gradient = i, this._markAsDirty());+ }+ /** Gets or sets z index which is used to reorder controls on the z axis */+ get zIndex() {+ return this._zIndex;+ }+ set zIndex(i) {+ this.zIndex !== i && (this._zIndex = i, this.parent && this.parent._reOrderControl(this));+ }+ /** Gets or sets a boolean indicating if the control can be rendered */+ get notRenderable() {+ return this._doNotRender;+ }+ set notRenderable(i) {+ this._doNotRender !== i && (this._doNotRender = i, this._markAsDirty());+ }+ /** Gets or sets a boolean indicating if the control is visible */+ get isVisible() {+ return this._isVisible;+ }+ set isVisible(i) {+ this._isVisible !== i && (this._isVisible = i, this._markAsDirty(!0), this.onIsVisibleChangedObservable.notifyObservers(i));+ }+ /** Gets a boolean indicating that the control needs to update its rendering */+ get isDirty() {+ return this._isDirty;+ }+ /**+ * Gets the current linked mesh (or null if none)+ */+ get linkedMesh() {+ return this._linkedMesh;+ }+ /**+ * Gets or sets a value indicating the padding should work like in CSS.+ * Basically, it will add the padding amount on each side of the parent control for its children.+ */+ get descendantsOnlyPadding() {+ return this._descendantsOnlyPadding;+ }+ set descendantsOnlyPadding(i) {+ this._descendantsOnlyPadding !== i && (this._descendantsOnlyPadding = i, this._markAsDirty());+ }+ /**+ * Gets or sets a value indicating the padding to use on the left of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get paddingLeft() {+ return this._paddingLeft.toString(this._host);+ }+ set paddingLeft(i) {+ this._paddingLeft.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets a value indicating the padding in pixels to use on the left of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get paddingLeftInPixels() {+ return this._paddingLeft.getValueInPixel(this._host, this._cachedParentMeasure.width);+ }+ set paddingLeftInPixels(i) {+ isNaN(i) || (this.paddingLeft = i + "px");+ }+ /** @internal */+ get _paddingLeftInPixels() {+ return this._descendantsOnlyPadding ? 0 : this.paddingLeftInPixels;+ }+ /**+ * Gets or sets a value indicating the padding to use on the right of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get paddingRight() {+ return this._paddingRight.toString(this._host);+ }+ set paddingRight(i) {+ this._paddingRight.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets a value indicating the padding in pixels to use on the right of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get paddingRightInPixels() {+ return this._paddingRight.getValueInPixel(this._host, this._cachedParentMeasure.width);+ }+ set paddingRightInPixels(i) {+ isNaN(i) || (this.paddingRight = i + "px");+ }+ /** @internal */+ get _paddingRightInPixels() {+ return this._descendantsOnlyPadding ? 0 : this.paddingRightInPixels;+ }+ /**+ * Gets or sets a value indicating the padding to use on the top of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get paddingTop() {+ return this._paddingTop.toString(this._host);+ }+ set paddingTop(i) {+ this._paddingTop.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets a value indicating the padding in pixels to use on the top of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get paddingTopInPixels() {+ return this._paddingTop.getValueInPixel(this._host, this._cachedParentMeasure.height);+ }+ set paddingTopInPixels(i) {+ isNaN(i) || (this.paddingTop = i + "px");+ }+ /** @internal */+ get _paddingTopInPixels() {+ return this._descendantsOnlyPadding ? 0 : this.paddingTopInPixels;+ }+ /**+ * Gets or sets a value indicating the padding to use on the bottom of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get paddingBottom() {+ return this._paddingBottom.toString(this._host);+ }+ set paddingBottom(i) {+ this._paddingBottom.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets a value indicating the padding in pixels to use on the bottom of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get paddingBottomInPixels() {+ return this._paddingBottom.getValueInPixel(this._host, this._cachedParentMeasure.height);+ }+ set paddingBottomInPixels(i) {+ isNaN(i) || (this.paddingBottom = i + "px");+ }+ /** @internal */+ get _paddingBottomInPixels() {+ return this._descendantsOnlyPadding ? 0 : this.paddingBottomInPixels;+ }+ /**+ * Gets or sets a value indicating the left coordinate of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get left() {+ return this._left.toString(this._host);+ }+ set left(i) {+ this._left.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets a value indicating the left coordinate in pixels of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get leftInPixels() {+ return this._left.getValueInPixel(this._host, this._cachedParentMeasure.width);+ }+ set leftInPixels(i) {+ isNaN(i) || (this.left = i + "px");+ }+ /**+ * Gets or sets a value indicating the top coordinate of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get top() {+ return this._top.toString(this._host);+ }+ set top(i) {+ this._top.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets a value indicating the top coordinate in pixels of the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get topInPixels() {+ return this._top.getValueInPixel(this._host, this._cachedParentMeasure.height);+ }+ set topInPixels(i) {+ isNaN(i) || (this.top = i + "px");+ }+ /**+ * Gets or sets a value indicating the offset on X axis to the linked mesh+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions+ */+ get linkOffsetX() {+ return this._linkOffsetX.toString(this._host);+ }+ set linkOffsetX(i) {+ this._linkOffsetX.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets a value indicating the offset in pixels on X axis to the linked mesh+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions+ */+ get linkOffsetXInPixels() {+ return this._linkOffsetX.getValueInPixel(this._host, this._cachedParentMeasure.width);+ }+ set linkOffsetXInPixels(i) {+ isNaN(i) || (this.linkOffsetX = i + "px");+ }+ /**+ * Gets or sets a value indicating the offset on Y axis to the linked mesh+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions+ */+ get linkOffsetY() {+ return this._linkOffsetY.toString(this._host);+ }+ set linkOffsetY(i) {+ this._linkOffsetY.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets a value indicating the offset in pixels on Y axis to the linked mesh+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions+ */+ get linkOffsetYInPixels() {+ return this._linkOffsetY.getValueInPixel(this._host, this._cachedParentMeasure.height);+ }+ set linkOffsetYInPixels(i) {+ isNaN(i) || (this.linkOffsetY = i + "px");+ }+ /** Gets the center coordinate on X axis */+ get centerX() {+ return this._currentMeasure.left + this._currentMeasure.width / 2;+ }+ /** Gets the center coordinate on Y axis */+ get centerY() {+ return this._currentMeasure.top + this._currentMeasure.height / 2;+ }+ /** Gets or sets if control is Enabled */+ get isEnabled() {+ return this._isEnabled;+ }+ set isEnabled(i) {+ if (this._isEnabled === i)+ return;+ this._isEnabled = i, this._markAsDirty();+ const d = (g) => {+ if (g.host) {+ for (const y in g.host._lastControlOver)+ g === this.host._lastControlOver[y] && (g._onPointerOut(g, null, !0), delete g.host._lastControlOver[y]);+ if (g.children !== void 0)+ for (const y of g.children)+ d(y);+ }+ };+ d(this), this.onEnabledStateChangedObservable.notifyObservers(i);+ }+ /** Gets or sets background color of control if it's disabled. Only applies to Button class. */+ get disabledColor() {+ return this._disabledColor;+ }+ set disabledColor(i) {+ this._disabledColor !== i && (this._disabledColor = i, this._markAsDirty());+ }+ /** Gets or sets front color of control if it's disabled. Only applies to Checkbox class. */+ get disabledColorItem() {+ return this._disabledColorItem;+ }+ set disabledColorItem(i) {+ this._disabledColorItem !== i && (this._disabledColorItem = i, this._markAsDirty());+ }+ /**+ * Border color when control is focused+ * When not defined the ADT color will be used. If no ADT color is defined, focused state won't have any border+ */+ get focusedColor() {+ return this._focusedColor;+ }+ set focusedColor(i) {+ this._focusedColor = i;+ }+ /** @internal */+ onBlur() {+ this._isFocused && (this._isFocused = !1, this.focusedColor && this._unfocusedColor != null && (this.color = this._unfocusedColor), this.onBlurObservable.notifyObservers(this));+ }+ /** @internal */+ onFocus() {+ this._isFocused = !0, this.focusedColor && (this._unfocusedColor = this.color, this.color = this.focusedColor), this.onFocusObservable.notifyObservers(this);+ }+ /**+ * Function called to get the list of controls that should not steal the focus from this control+ * @returns an array of controls+ */+ keepsFocusWith() {+ return null;+ }+ /**+ * Function to focus a button programmatically+ */+ focus() {+ this._host.moveFocusToControl(this);+ }+ /**+ * Function to unfocus a button programmatically+ */+ blur() {+ this._host.focusedControl = null;+ }+ /**+ * Handles the keyboard event+ * @param evt Defines the KeyboardEvent+ */+ processKeyboard(i) {+ i.key === "Enter" && this.onEnterPressedObservable.notifyObservers(this), this.onKeyboardEventProcessedObservable.notifyObservers(i, -1, this);+ }+ // Functions+ /**+ * Creates a new control+ * @param name defines the name of the control+ */+ constructor(i) {+ this.name = i, this._alpha = 1, this._alphaSet = !1, this._zIndex = 0, this._currentMeasure = Ko.Empty(), this._tempPaddingMeasure = Ko.Empty(), this._fontFamily = "", this._fontStyle = "", this._fontWeight = "", this._fontSize = new St(18, St.UNITMODE_PIXEL, !1), this._width = new St(1, St.UNITMODE_PERCENTAGE, !1), this._height = new St(1, St.UNITMODE_PERCENTAGE, !1), this._color = "", this._style = null, this._horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_CENTER, this._verticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, this._isDirty = !0, this._wasDirty = !1, this._tempParentMeasure = Ko.Empty(), this._prevCurrentMeasureTransformedIntoGlobalSpace = Ko.Empty(), this._cachedParentMeasure = Ko.Empty(), this._descendantsOnlyPadding = !1, this._paddingLeft = new St(0), this._paddingRight = new St(0), this._paddingTop = new St(0), this._paddingBottom = new St(0), this._left = new St(0), this._top = new St(0), this._scaleX = 1, this._scaleY = 1, this._rotation = 0, this._transformCenterX = 0.5, this._transformCenterY = 0.5, this._transformMatrix = pr.Identity(), this._invertTransformMatrix = pr.Identity(), this._transformedPosition = mo.Zero(), this._isMatrixDirty = !0, this._isVisible = !0, this._isHighlighted = !1, this._highlightColor = "#4affff", this._highlightLineWidth = 2, this._fontSet = !1, this._dummyVector2 = mo.Zero(), this._downCount = 0, this._enterCount = -1, this._doNotRender = !1, this._downPointerIds = {}, this._evaluatedMeasure = new Ko(0, 0, 0, 0), this._evaluatedParentMeasure = new Ko(0, 0, 0, 0), this._isEnabled = !0, this._disabledColor = "#9a9a9a", this._disabledColorItem = "#6a6a6a", this._isReadOnly = !1, this._gradient = null, this._rebuildLayout = !1, this.onEnabledStateChangedObservable = new qt(), this._customData = {}, this._isClipped = !1, this._automaticSize = !1, this.metadata = null, this.isHitTestVisible = !0, this.isPointerBlocker = !1, this.isFocusInvisible = !1, this._clipChildren = !0, this._clipContent = !0, this.useBitmapCache = !1, this._shadowOffsetX = 0, this._shadowOffsetY = 0, this._shadowBlur = 0, this._previousShadowBlur = 0, this._shadowColor = "black", this.hoverCursor = "", this._linkOffsetX = new St(0), this._linkOffsetY = new St(0), this._accessibilityTag = null, this.onAccessibilityTagChangedObservable = new qt(), this.onWheelObservable = new qt(), this.onPointerMoveObservable = new qt(), this.onPointerOutObservable = new qt(), this.onPointerDownObservable = new qt(), this.onPointerUpObservable = new qt(), this.onPointerClickObservable = new qt(), this.onEnterPressedObservable = new qt(), this.onPointerEnterObservable = new qt(), this.onDirtyObservable = new qt(), this.onBeforeDrawObservable = new qt(), this.onAfterDrawObservable = new qt(), this.onDisposeObservable = new qt(), this.onIsVisibleChangedObservable = new qt(), this.isSerializable = !0, this._fixedRatio = 0, this._fixedRatioMasterIsWidth = !0, this.animations = null, this._focusedColor = null, this.tabIndex = -1, this._isFocused = !1, this._unfocusedColor = null, this.onFocusObservable = new qt(), this.onBlurObservable = new qt(), this.onKeyboardEventProcessedObservable = new qt(), this._tmpMeasureA = new Ko(0, 0, 0, 0);+ }+ /** @internal */+ _getTypeName() {+ return "Control";+ }+ /**+ * Gets the first ascendant in the hierarchy of the given type+ * @param className defines the required type+ * @returns the ascendant or null if not found+ */+ getAscendantOfClass(i) {+ return this.parent ? this.parent.getClassName() === i ? this.parent : this.parent.getAscendantOfClass(i) : null;+ }+ /**+ * Mark control element as dirty+ * @param force force non visible elements to be marked too+ */+ markAsDirty(i = !1) {+ this._markAsDirty(i);+ }+ /**+ * Mark the element and its children as dirty+ */+ markAllAsDirty() {+ this._markAllAsDirty();+ }+ /** @internal */+ _resetFontCache() {+ this._fontSet = !0, this._markAsDirty();+ }+ /**+ * Determines if a container is an ascendant of the current control+ * @param container defines the container to look for+ * @returns true if the container is one of the ascendant of the control+ */+ isAscendant(i) {+ return this.parent ? this.parent === i ? !0 : this.parent.isAscendant(i) : !1;+ }+ /**+ * Gets coordinates in local control space+ * @param globalCoordinates defines the coordinates to transform+ * @returns the new coordinates in local space+ */+ getLocalCoordinates(i) {+ const d = mo.Zero();+ return this.getLocalCoordinatesToRef(i, d), d;+ }+ /**+ * Gets coordinates in local control space+ * @param globalCoordinates defines the coordinates to transform+ * @param result defines the target vector2 where to store the result+ * @returns the current control+ */+ getLocalCoordinatesToRef(i, d) {+ return d.x = i.x - this._currentMeasure.left, d.y = i.y - this._currentMeasure.top, this;+ }+ /**+ * Gets coordinates in parent local control space+ * @param globalCoordinates defines the coordinates to transform+ * @returns the new coordinates in parent local space+ */+ getParentLocalCoordinates(i) {+ const d = mo.Zero();+ return d.x = i.x - this._cachedParentMeasure.left, d.y = i.y - this._cachedParentMeasure.top, d;+ }+ /**+ * Move the current control to a vector3 position projected onto the screen.+ * @param position defines the target position+ * @param scene defines the hosting scene+ */+ moveToVector3(i, d) {+ if (!this._host || this.parent !== this._host._rootContainer) {+ Lr.Error("Cannot move a control to a vector3 if the control is not at root level");+ return;+ }+ this.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP;+ const g = this._host._getGlobalViewport(), y = Se.Project(i, Oh.IdentityReadOnly, d.getTransformMatrix(), g);+ if (this._moveToProjectedPosition(y), y.z < 0 || y.z > 1) {+ this.notRenderable = !0;+ return;+ }+ this.notRenderable = !1;+ }+ /**+ * Will store all controls that have this control as ascendant in a given array+ * @param results defines the array where to store the descendants+ * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered+ * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored+ */+ getDescendantsToRef(i, d = !1, g) {+ }+ /**+ * Will return all controls that have this control as ascendant+ * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered+ * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored+ * @returns all child controls+ */+ getDescendants(i, d) {+ const g = [];+ return this.getDescendantsToRef(g, i, d), g;+ }+ /**+ * Link current control with a target mesh+ * @param mesh defines the mesh to link with+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions+ */+ linkWithMesh(i) {+ if (!this._host || this.parent && this.parent !== this._host._rootContainer) {+ i && Lr.Error("Cannot link a control to a mesh if the control is not at root level");+ return;+ }+ const d = this._host._linkedControls.indexOf(this);+ if (d !== -1) {+ this._linkedMesh = i, i || this._host._linkedControls.splice(d, 1);+ return;+ } else if (!i)+ return;+ this.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, this._linkedMesh = i, this._host._linkedControls.push(this);+ }+ /**+ * Shorthand function to set the top, right, bottom, and left padding values on the control.+ * @param { string | number} paddingTop - The value of the top padding.+ * @param { string | number} paddingRight - The value of the right padding. If omitted, top is used.+ * @param { string | number} paddingBottom - The value of the bottom padding. If omitted, top is used.+ * @param { string | number} paddingLeft - The value of the left padding. If omitted, right is used.+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ setPadding(i, d, g, y) {+ const M = i, N = d ?? M, O = g ?? M, F = y ?? N;+ this.paddingTop = M, this.paddingRight = N, this.paddingBottom = O, this.paddingLeft = F;+ }+ /**+ * Shorthand funtion to set the top, right, bottom, and left padding values in pixels on the control.+ * @param { number} paddingTop - The value in pixels of the top padding.+ * @param { number} paddingRight - The value in pixels of the right padding. If omitted, top is used.+ * @param { number} paddingBottom - The value in pixels of the bottom padding. If omitted, top is used.+ * @param { number} paddingLeft - The value in pixels of the left padding. If omitted, right is used.+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ setPaddingInPixels(i, d, g, y) {+ const M = i, N = d ?? M, O = g ?? M, F = y ?? N;+ this.paddingTopInPixels = M, this.paddingRightInPixels = N, this.paddingBottomInPixels = O, this.paddingLeftInPixels = F;+ }+ /**+ * @internal+ */+ _moveToProjectedPosition(i) {+ const d = this._left.getValue(this._host), g = this._top.getValue(this._host), y = this.parent?._currentMeasure;+ y && this._processMeasures(y, this._host.getContext());+ let M = i.x + this._linkOffsetX.getValue(this._host) - this._currentMeasure.width / 2, N = i.y + this._linkOffsetY.getValue(this._host) - this._currentMeasure.height / 2;+ this._left.ignoreAdaptiveScaling && this._top.ignoreAdaptiveScaling && (Math.abs(M - d) < 0.5 && (M = d), Math.abs(N - g) < 0.5 && (N = g)), !(d === M && g === N) && (this.left = M + "px", this.top = N + "px", this._left.ignoreAdaptiveScaling = !0, this._top.ignoreAdaptiveScaling = !0, this._markAsDirty());+ }+ /**+ * @internal+ */+ _offsetLeft(i) {+ this._isDirty = !0, this._currentMeasure.left += i;+ }+ /**+ * @internal+ */+ _offsetTop(i) {+ this._isDirty = !0, this._currentMeasure.top += i;+ }+ /** @internal */+ _markMatrixAsDirty() {+ this._isMatrixDirty = !0, this._flagDescendantsAsMatrixDirty();+ }+ /** @internal */+ _flagDescendantsAsMatrixDirty() {+ }+ /**+ * @internal+ */+ _intersectsRect(i, d) {+ return this._transform(d), !(this._evaluatedMeasure.left >= i.left + i.width || this._evaluatedMeasure.top >= i.top + i.height || this._evaluatedMeasure.left + this._evaluatedMeasure.width <= i.left || this._evaluatedMeasure.top + this._evaluatedMeasure.height <= i.top);+ }+ /** @internal */+ _computeAdditionalOffsetX() {+ return 0;+ }+ /** @internal */+ _computeAdditionalOffsetY() {+ return 0;+ }+ /** @internal */+ // eslint-disable-next-line @typescript-eslint/naming-convention+ invalidateRect() {+ if (this._transform(), this.host && this.host.useInvalidateRectOptimization) {+ this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA), Ko.CombineToRef(this._tmpMeasureA, this._prevCurrentMeasureTransformedIntoGlobalSpace, this._tmpMeasureA);+ const i = this.shadowOffsetX * this._host.idealRatio, d = this.shadowOffsetY * this._host.idealRatio, g = Math.max(this._previousShadowBlur, this.shadowBlur), y = Math.min(Math.min(i, 0) - g * 2, 0), M = Math.max(Math.max(i, 0) + g * 2, 0), N = Math.min(Math.min(d, 0) - g * 2, 0), O = Math.max(Math.max(d, 0) + g * 2, 0), F = this._computeAdditionalOffsetX(), ne = this._computeAdditionalOffsetY();+ this.host.invalidateRect(Math.floor(this._tmpMeasureA.left + y - F), Math.floor(this._tmpMeasureA.top + N - ne), Math.ceil(this._tmpMeasureA.left + this._tmpMeasureA.width + M + F), Math.ceil(this._tmpMeasureA.top + this._tmpMeasureA.height + O + ne));+ }+ }+ /**+ * @internal+ */+ _markAsDirty(i = !1) {+ !this._isVisible && !i || (this._isDirty = !0, this._markMatrixAsDirty(), this._host && this._host.markAsDirty());+ }+ /** @internal */+ _markAllAsDirty() {+ this._markAsDirty(), this._font && this._prepareFont();+ }+ /**+ * @internal+ */+ _link(i) {+ this._host = i, this._host && (this.uniqueId = this._host.getScene().getUniqueId());+ }+ /**+ * @internal+ */+ _transform(i) {+ if (!this._isMatrixDirty && this._scaleX === 1 && this._scaleY === 1 && this._rotation === 0)+ return;+ const d = this._currentMeasure.width * this._transformCenterX + this._currentMeasure.left, g = this._currentMeasure.height * this._transformCenterY + this._currentMeasure.top;+ i && (i.translate(d, g), i.rotate(this._rotation), i.scale(this._scaleX, this._scaleY), i.translate(-d, -g)), (this._isMatrixDirty || this._cachedOffsetX !== d || this._cachedOffsetY !== g) && (this._cachedOffsetX = d, this._cachedOffsetY = g, this._isMatrixDirty = !1, this._flagDescendantsAsMatrixDirty(), pr.ComposeToRef(-d, -g, this._rotation, this._scaleX, this._scaleY, this.parent ? this.parent._transformMatrix : null, this._transformMatrix), this._transformMatrix.invertToRef(this._invertTransformMatrix), this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure));+ }+ /**+ * @internal+ */+ _renderHighlight(i) {+ this.isHighlighted && (i.save(), i.strokeStyle = this._highlightColor, i.lineWidth = this._highlightLineWidth, this._renderHighlightSpecific(i), i.restore());+ }+ /**+ * @internal+ */+ _renderHighlightSpecific(i) {+ i.strokeRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);+ }+ _getColor(i) {+ return this.gradient ? this.gradient.getCanvasGradient(i) : this.color;+ }+ /**+ * Applies the control's state to the provided context. Important: unless this is a temporary context,+ * be sure to call context.save() before calling _applyStates() and later call context.restore() when+ * you are done using these state updates.+ * @internal+ */+ _applyStates(i) {+ this._isFontSizeInPercentage && (this._fontSet = !0), this._host && this._host.useSmallestIdeal && !this._font && (this._fontSet = !0), this._fontSet && (this._prepareFont(), this._fontSet = !1), this._font && (i.font = this._font), (this._color || this.gradient) && (i.fillStyle = this._getColor(i)), pe.AllowAlphaInheritance ? i.globalAlpha *= this._alpha : this._alphaSet && (i.globalAlpha = this.parent && !this.parent.renderToIntermediateTexture ? this.parent.alpha * this._alpha : this._alpha);+ }+ /**+ * @internal+ */+ _layout(i, d) {+ if (!this.isDirty && (!this.isVisible || this.notRenderable))+ return !1;+ if (this._isDirty || !this._cachedParentMeasure.isEqualsTo(i)) {+ this.host._numLayoutCalls++, this._currentMeasure.addAndTransformToRef(this._transformMatrix, -this._paddingLeftInPixels | 0, -this._paddingTopInPixels | 0, this._paddingRightInPixels | 0, this._paddingBottomInPixels | 0, this._prevCurrentMeasureTransformedIntoGlobalSpace), d.save();+ let g = 0;+ do+ this._rebuildLayout = !1, this._processMeasures(i, d), g++;+ while (this._rebuildLayout && g < 4);+ g >= 4 && zh.Error(`Layout cycle detected in GUI (Control name=${this.name}, uniqueId=${this.uniqueId})`), d.restore(), this.invalidateRect(), this._evaluateClippingState(i);+ }+ return this._wasDirty = this._isDirty, this._isDirty = !1, !0;+ }+ /**+ * @internal+ */+ _processMeasures(i, d) {+ d.save(), this._applyStates(d), this._tempPaddingMeasure.copyFrom(i), this.parent && this.parent.descendantsOnlyPadding && (this._tempPaddingMeasure.left += this.parent.paddingLeftInPixels, this._tempPaddingMeasure.top += this.parent.paddingTopInPixels, this._tempPaddingMeasure.width -= this.parent.paddingLeftInPixels + this.parent.paddingRightInPixels, this._tempPaddingMeasure.height -= this.parent.paddingTopInPixels + this.parent.paddingBottomInPixels), this._currentMeasure.copyFrom(this._tempPaddingMeasure), this._preMeasure(this._tempPaddingMeasure, d), this._measure(), this._postMeasure(this._tempPaddingMeasure, d), this._computeAlignment(this._tempPaddingMeasure, d), this._additionalProcessing(this._tempPaddingMeasure, d), this._cachedParentMeasure.copyFrom(this._tempPaddingMeasure), this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure), this.onDirtyObservable.hasObservers() && this.onDirtyObservable.notifyObservers(this), d.restore();+ }+ _evaluateClippingState(i) {+ if (this._transform(), this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure), this.parent && this.parent.clipChildren) {+ if (i.transformToRef(this.parent._transformMatrix, this._evaluatedParentMeasure), this._evaluatedMeasure.left > this._evaluatedParentMeasure.left + this._evaluatedParentMeasure.width) {+ this._isClipped = !0;+ return;+ }+ if (this._evaluatedMeasure.left + this._evaluatedMeasure.width < this._evaluatedParentMeasure.left) {+ this._isClipped = !0;+ return;+ }+ if (this._evaluatedMeasure.top > this._evaluatedParentMeasure.top + this._evaluatedParentMeasure.height) {+ this._isClipped = !0;+ return;+ }+ if (this._evaluatedMeasure.top + this._evaluatedMeasure.height < this._evaluatedParentMeasure.top) {+ this._isClipped = !0;+ return;+ }+ }+ this._isClipped = !1;+ }+ /** @internal */+ _measure() {+ this._width.isPixel ? this._currentMeasure.width = this._width.getValue(this._host) : this._currentMeasure.width *= this._width.getValue(this._host), this._height.isPixel ? this._currentMeasure.height = this._height.getValue(this._host) : this._currentMeasure.height *= this._height.getValue(this._host), this._fixedRatio !== 0 && (this._fixedRatioMasterIsWidth ? this._currentMeasure.height = this._currentMeasure.width * this._fixedRatio : this._currentMeasure.width = this._currentMeasure.height * this._fixedRatio);+ }+ /**+ * @internal+ */+ _computeAlignment(i, d) {+ const g = this._currentMeasure.width, y = this._currentMeasure.height, M = i.width, N = i.height;+ let O = 0, F = 0;+ switch (this.horizontalAlignment) {+ case pe.HORIZONTAL_ALIGNMENT_LEFT:+ O = 0;+ break;+ case pe.HORIZONTAL_ALIGNMENT_RIGHT:+ O = M - g;+ break;+ case pe.HORIZONTAL_ALIGNMENT_CENTER:+ O = (M - g) / 2;+ break;+ }+ switch (this.verticalAlignment) {+ case pe.VERTICAL_ALIGNMENT_TOP:+ F = 0;+ break;+ case pe.VERTICAL_ALIGNMENT_BOTTOM:+ F = N - y;+ break;+ case pe.VERTICAL_ALIGNMENT_CENTER:+ F = (N - y) / 2;+ break;+ }+ this.descendantsOnlyPadding || (this._paddingLeft.isPixel ? (this._currentMeasure.left += this._paddingLeft.getValue(this._host), this._currentMeasure.width -= this._paddingLeft.getValue(this._host)) : (this._currentMeasure.left += M * this._paddingLeft.getValue(this._host), this._currentMeasure.width -= M * this._paddingLeft.getValue(this._host)), this._paddingRight.isPixel ? this._currentMeasure.width -= this._paddingRight.getValue(this._host) : this._currentMeasure.width -= M * this._paddingRight.getValue(this._host), this._paddingTop.isPixel ? (this._currentMeasure.top += this._paddingTop.getValue(this._host), this._currentMeasure.height -= this._paddingTop.getValue(this._host)) : (this._currentMeasure.top += N * this._paddingTop.getValue(this._host), this._currentMeasure.height -= N * this._paddingTop.getValue(this._host)), this._paddingBottom.isPixel ? this._currentMeasure.height -= this._paddingBottom.getValue(this._host) : this._currentMeasure.height -= N * this._paddingBottom.getValue(this._host)), this._left.isPixel ? this._currentMeasure.left += this._left.getValue(this._host) : this._currentMeasure.left += M * this._left.getValue(this._host), this._top.isPixel ? this._currentMeasure.top += this._top.getValue(this._host) : this._currentMeasure.top += N * this._top.getValue(this._host), this._currentMeasure.left += O, this._currentMeasure.top += F;+ }+ /**+ * @internal+ */+ _preMeasure(i, d) {+ }+ /**+ * @internal+ */+ _postMeasure(i, d) {+ }+ /**+ * @internal+ */+ _additionalProcessing(i, d) {+ }+ /**+ * @internal+ */+ _clipForChildren(i) {+ }+ _clip(i, d) {+ if (i.beginPath(), pe._ClipMeasure.copyFrom(this._currentMeasure), d) {+ d.transformToRef(this._invertTransformMatrix, this._tmpMeasureA);+ const g = new Ko(0, 0, 0, 0);+ g.left = Math.max(this._tmpMeasureA.left, this._currentMeasure.left), g.top = Math.max(this._tmpMeasureA.top, this._currentMeasure.top), g.width = Math.min(this._tmpMeasureA.left + this._tmpMeasureA.width, this._currentMeasure.left + this._currentMeasure.width) - g.left, g.height = Math.min(this._tmpMeasureA.top + this._tmpMeasureA.height, this._currentMeasure.top + this._currentMeasure.height) - g.top, pe._ClipMeasure.copyFrom(g);+ }+ if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {+ const g = this.shadowOffsetX * this._host.idealRatio, y = this.shadowOffsetY * this._host.idealRatio, M = this.shadowBlur, N = Math.min(Math.min(g, 0) - M * 2, 0), O = Math.max(Math.max(g, 0) + M * 2, 0), F = Math.min(Math.min(y, 0) - M * 2, 0), ne = Math.max(Math.max(y, 0) + M * 2, 0);+ i.rect(pe._ClipMeasure.left + N, pe._ClipMeasure.top + F, pe._ClipMeasure.width + O - N, pe._ClipMeasure.height + ne - F);+ } else+ i.rect(pe._ClipMeasure.left, pe._ClipMeasure.top, pe._ClipMeasure.width, pe._ClipMeasure.height);+ i.clip();+ }+ /**+ * @internal+ */+ _render(i, d) {+ return !this.isVisible || this.notRenderable || this._isClipped ? (this._isDirty = !1, !1) : (this.host._numRenderCalls++, i.save(), this._applyStates(i), this._transform(i), this.clipContent && this._clip(i, d), this.onBeforeDrawObservable.hasObservers() && this.onBeforeDrawObservable.notifyObservers(this), this.useBitmapCache && !this._wasDirty && this._cacheData ? i.putImageData(this._cacheData, this._currentMeasure.left, this._currentMeasure.top) : this._draw(i, d), this.useBitmapCache && this._wasDirty && (this._cacheData = i.getImageData(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height)), this._renderHighlight(i), this.onAfterDrawObservable.hasObservers() && this.onAfterDrawObservable.notifyObservers(this), i.restore(), !0);+ }+ /**+ * @internal+ */+ _draw(i, d) {+ }+ /**+ * Tests if a given coordinates belong to the current control+ * @param x defines x coordinate to test+ * @param y defines y coordinate to test+ * @returns true if the coordinates are inside the control+ */+ contains(i, d) {+ return this._invertTransformMatrix.transformCoordinates(i, d, this._transformedPosition), i = this._transformedPosition.x, d = this._transformedPosition.y, i < this._currentMeasure.left || i > this._currentMeasure.left + this._currentMeasure.width || d < this._currentMeasure.top || d > this._currentMeasure.top + this._currentMeasure.height ? !1 : (this.isPointerBlocker && (this._host._shouldBlockPointer = !0), !0);+ }+ /**+ * @internal+ */+ _processPicking(i, d, g, y, M, N, O, F) {+ return !this._isEnabled || !this.isHitTestVisible || !this.isVisible || this._doNotRender || !this.contains(i, d) ? !1 : (this._processObservables(y, i, d, g, M, N, O, F), !0);+ }+ /**+ * @internal+ */+ _onPointerMove(i, d, g, y) {+ this.onPointerMoveObservable.notifyObservers(d, -1, i, this, y) && this.parent != null && !this.isPointerBlocker && this.parent._onPointerMove(i, d, g, y);+ }+ /**+ * @internal+ */+ _onPointerEnter(i, d) {+ return !this._isEnabled || this._enterCount > 0 ? !1 : (this._enterCount === -1 && (this._enterCount = 0), this._enterCount++, this.onPointerEnterObservable.notifyObservers(this, -1, i, this, d) && this.parent != null && !this.isPointerBlocker && this.parent._onPointerEnter(i, d), !0);+ }+ /**+ * @internal+ */+ _onPointerOut(i, d, g = !1) {+ if (!g && !this._isEnabled)+ return;+ this._enterCount = 0;+ let y = !0;+ i.isAscendant(this) || (y = this.onPointerOutObservable.notifyObservers(this, -1, i, this, d)), y && this.parent != null && !this.isPointerBlocker && this.parent._onPointerOut(i, d, g);+ }+ /**+ * @internal+ */+ _onPointerDown(i, d, g, y, M) {+ return this._onPointerEnter(this, M), this.tabIndex !== -1 && (this.host.focusedControl = this), this._downCount !== 0 ? !1 : (this._downCount++, this._downPointerIds[g] = !0, this.onPointerDownObservable.notifyObservers(new Nh(d, y), -1, i, this, M) && this.parent != null && !this.isPointerBlocker && this.parent._onPointerDown(i, d, g, y, M), M && this.uniqueId !== this._host.rootContainer.uniqueId && this._host._capturedPointerIds.add(M.event.pointerId), !0);+ }+ /**+ * @internal+ */+ _onPointerUp(i, d, g, y, M, N) {+ if (!this._isEnabled)+ return;+ this._downCount = 0, delete this._downPointerIds[g];+ let O = M;+ M && (this._enterCount > 0 || this._enterCount === -1) && (this._host.usePointerTapForClickEvent || (O = this.onPointerClickObservable.notifyObservers(new Nh(d, y), -1, i, this, N))), this.onPointerUpObservable.notifyObservers(new Nh(d, y), -1, i, this, N) && this.parent != null && !this.isPointerBlocker && this.parent._onPointerUp(i, d, g, y, O, N), N && this.uniqueId !== this._host.rootContainer.uniqueId && this._host._capturedPointerIds.delete(N.event.pointerId), this._host.usePointerTapForClickEvent && this.isPointerBlocker && (this._host._shouldBlockPointer = !1);+ }+ _onPointerPick(i, d, g, y, M, N) {+ if (!this._host.usePointerTapForClickEvent)+ return !1;+ let O = M;+ return M && (this._enterCount > 0 || this._enterCount === -1) && (O = this.onPointerClickObservable.notifyObservers(new Nh(d, y), -1, i, this, N)), this.onPointerUpObservable.notifyObservers(new Nh(d, y), -1, i, this, N) && this.parent != null && !this.isPointerBlocker && this.parent._onPointerPick(i, d, g, y, O, N), this._host.usePointerTapForClickEvent && this.isPointerBlocker && (this._host._shouldBlockPointer = !0), !0;+ }+ /**+ * @internal+ */+ _forcePointerUp(i = null) {+ if (i !== null)+ this._onPointerUp(this, mo.Zero(), i, 0, !0);+ else+ for (const d in this._downPointerIds)+ this._onPointerUp(this, mo.Zero(), +d, 0, !0);+ }+ /**+ * @internal+ */+ _onWheelScroll(i, d) {+ if (!this._isEnabled)+ return;+ this.onWheelObservable.notifyObservers(new mo(i, d)) && this.parent != null && this.parent._onWheelScroll(i, d);+ }+ /** @internal */+ _onCanvasBlur() {+ }+ /**+ * @internal+ */+ _processObservables(i, d, g, y, M, N, O, F) {+ if (!this._isEnabled)+ return !1;+ if (this._dummyVector2.copyFromFloats(d, g), i === Ir.POINTERMOVE) {+ this._onPointerMove(this, this._dummyVector2, M, y);+ const ne = this._host._lastControlOver[M];+ return ne && ne !== this && ne._onPointerOut(this, y), ne !== this && this._onPointerEnter(this, y), this._host._lastControlOver[M] = this, !0;+ } else {+ if (i === Ir.POINTERDOWN)+ return this._onPointerDown(this, this._dummyVector2, M, N, y), this._host._registerLastControlDown(this, M), this._host._lastPickedControl = this, !0;+ if (i === Ir.POINTERUP)+ return this._host._lastControlDown[M] && this._host._lastControlDown[M]._onPointerUp(this, this._dummyVector2, M, N, !0, y), this._host.usePointerTapForClickEvent || delete this._host._lastControlDown[M], !0;+ if (i === Ir.POINTERWHEEL) {+ if (this._host._lastControlOver[M])+ return this._host._lastControlOver[M]._onWheelScroll(O, F), !0;+ } else if (i === Ir.POINTERTAP)+ return this._host._lastControlDown[M] && this._host._lastControlDown[M]._onPointerPick(this, this._dummyVector2, M, N, !0, y), delete this._host._lastControlDown[M], !0;+ }+ return !1;+ }+ _getStyleProperty(i, d) {+ const g = (this._style && this._style[i]) ?? this[i];+ return !g && this.parent ? this.parent._getStyleProperty(i, d) : this.parent ? g : d;+ }+ _prepareFont() {+ if (!this._font && !this._fontSet)+ return;+ this._font = this._getStyleProperty("fontStyle", "") + " " + this._getStyleProperty("fontWeight", "") + " " + this.fontSizeInPixels + "px " + this._getStyleProperty("fontFamily", "Arial"), this._fontOffset = pe._GetFontOffset(this._font, this._host?.getScene()?.getEngine());+ const i = this.getDescendants();+ for (const d of i)+ d._markAllAsDirty();+ }+ /**+ * A control has a dimension fully defined if that dimension doesn't depend on the parent's dimension.+ * As an example, a control that has dimensions in pixels is fully defined, while in percentage is not fully defined.+ * @param dim the dimension to check (width or height)+ * @returns if the dimension is fully defined+ */+ isDimensionFullyDefined(i) {+ return this.getDimension(i).isPixel;+ }+ /**+ * Gets the dimension of the control along a specified axis+ * @param dim the dimension to retrieve (width or height)+ * @returns the dimension value along the specified axis+ */+ getDimension(i) {+ return i === "width" ? this._width : this._height;+ }+ /**+ * Clones a control and its descendants+ * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture+ * @returns the cloned control+ */+ clone(i) {+ const d = {};+ this.serialize(d, !0);+ const g = Lr.Instantiate("BABYLON.GUI." + d.className), y = new g();+ return y.parse(d, i), y;+ }+ /**+ * Parses a serialized object into this control+ * @param serializedObject the object with the serialized properties+ * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture+ * @param urlRewriter defines an url rewriter to update urls before sending them to the controls+ * @returns this control+ */+ parse(i, d, g) {+ return this._urlRewriter = g, Eo.Parse(() => this, i, null), this.name = i.name, this._parseFromContent(i, d ?? this._host), this;+ }+ /**+ * Serializes the current control+ * @param serializationObject defined the JSON serialized object+ * @param force if the control should be serialized even if the isSerializable flag is set to false (default false)+ * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize (true by default)+ */+ serialize(i, d = !1, g = !0) {+ if (!this.isSerializable && !d)+ return;+ let y = 0, M = 0;+ this.host && (M = this.host.idealHeight, y = this.host.idealWidth, this.host.idealWidth = 0, this.host.idealHeight = 0), Eo.Serialize(this, i), i.name = this.name, i.className = this.getClassName(), g && this._prepareFont(), this._fontFamily && (i.fontFamily = this._fontFamily), this.fontSize && (i.fontSize = this.fontSize), this.fontWeight && (i.fontWeight = this.fontWeight), this.fontStyle && (i.fontStyle = this.fontStyle), this._gradient && (i.gradient = {}, this._gradient.serialize(i.gradient)), Eo.AppendSerializedAnimations(this, i), this.host && (this.host.idealWidth = y, this.host.idealHeight = M);+ }+ /**+ * @internal+ */+ _parseFromContent(i, d, g) {+ if (i.fontFamily && (this.fontFamily = i.fontFamily), i.fontSize && (this.fontSize = i.fontSize), i.fontWeight && (this.fontWeight = i.fontWeight), i.fontStyle && (this.fontStyle = i.fontStyle), i.gradient) {+ const y = Lr.Instantiate("BABYLON.GUI." + i.gradient.className);+ this._gradient = new y(), this._gradient?.parse(i.gradient);+ }+ if (i.animations) {+ this.animations = [];+ for (let y = 0; y < i.animations.length; y++) {+ const M = i.animations[y], N = yb("BABYLON.Animation");+ N && this.animations.push(N.Parse(M));+ }+ i.autoAnimate && this._host && this._host.getScene() && this._host.getScene().beginAnimation(this, i.autoAnimateFrom, i.autoAnimateTo, i.autoAnimateLoop, i.autoAnimateSpeed || 1);+ }+ this.fixedRatioMasterIsWidth = i.fixedRatioMasterIsWidth ?? this.fixedRatioMasterIsWidth;+ }+ /** Releases associated resources */+ dispose() {+ this.onDirtyObservable.clear(), this.onBeforeDrawObservable.clear(), this.onAfterDrawObservable.clear(), this.onPointerDownObservable.clear(), this.onPointerEnterObservable.clear(), this.onPointerMoveObservable.clear(), this.onPointerOutObservable.clear(), this.onPointerUpObservable.clear(), this.onPointerClickObservable.clear(), this.onWheelObservable.clear(), this.onBlurObservable.clear(), this.onFocusObservable.clear(), this.onKeyboardEventProcessedObservable.clear(), this._styleObserver && this._style && (this._style.onChangedObservable.remove(this._styleObserver), this._styleObserver = null), this.parent && (this.parent.removeControl(this), this.parent = null), this._host && this._host._linkedControls.indexOf(this) > -1 && this.linkWithMesh(null), this.onDisposeObservable.notifyObservers(this), this.onDisposeObservable.clear();+ }+ /** HORIZONTAL_ALIGNMENT_LEFT */+ static get HORIZONTAL_ALIGNMENT_LEFT() {+ return pe._HORIZONTAL_ALIGNMENT_LEFT;+ }+ /** HORIZONTAL_ALIGNMENT_RIGHT */+ static get HORIZONTAL_ALIGNMENT_RIGHT() {+ return pe._HORIZONTAL_ALIGNMENT_RIGHT;+ }+ /** HORIZONTAL_ALIGNMENT_CENTER */+ static get HORIZONTAL_ALIGNMENT_CENTER() {+ return pe._HORIZONTAL_ALIGNMENT_CENTER;+ }+ /** VERTICAL_ALIGNMENT_TOP */+ static get VERTICAL_ALIGNMENT_TOP() {+ return pe._VERTICAL_ALIGNMENT_TOP;+ }+ /** VERTICAL_ALIGNMENT_BOTTOM */+ static get VERTICAL_ALIGNMENT_BOTTOM() {+ return pe._VERTICAL_ALIGNMENT_BOTTOM;+ }+ /** VERTICAL_ALIGNMENT_CENTER */+ static get VERTICAL_ALIGNMENT_CENTER() {+ return pe._VERTICAL_ALIGNMENT_CENTER;+ }+ /**+ * @internal+ */+ static _GetFontOffset(i, d) {+ if (pe._FontHeightSizes[i])+ return pe._FontHeightSizes[i];+ const g = d || md.LastCreatedEngine;+ if (!g)+ throw new Error("Invalid engine. Unable to create a canvas.");+ const y = g.getFontOffset(i);+ return pe._FontHeightSizes[i] = y, y;+ }+ /**+ * Creates a Control from parsed data+ * @param serializedObject defines parsed data+ * @param host defines the hosting AdvancedDynamicTexture+ * @param urlRewriter defines an url rewriter to update urls before sending them to the controls+ * @returns a new Control+ */+ static Parse(i, d, g) {+ const y = Lr.Instantiate("BABYLON.GUI." + i.className), M = Eo.Parse(() => {+ const N = new y();+ return N._urlRewriter = g, N;+ }, i, null);+ return M.name = i.name, M._parseFromContent(i, d, g), M;+ }+ /**+ * @internal+ */+ static drawEllipse(i, d, g, y, M, N) {+ N.translate(i, d), N.scale(g, y), N.beginPath(), N.arc(0, 0, 1, 0, 2 * Math.PI * M, M < 0), M >= 1 && N.closePath(), N.scale(1 / g, 1 / y), N.translate(-i, -d);+ }+ /**+ * Returns true if the control is ready to be used+ * @returns+ */+ isReady() {+ return !0;+ }+}+pe.AllowAlphaInheritance = !1;+pe._ClipMeasure = new Ko(0, 0, 0, 0);+pe._HORIZONTAL_ALIGNMENT_LEFT = 0;+pe._HORIZONTAL_ALIGNMENT_RIGHT = 1;+pe._HORIZONTAL_ALIGNMENT_CENTER = 2;+pe._VERTICAL_ALIGNMENT_TOP = 0;+pe._VERTICAL_ALIGNMENT_BOTTOM = 1;+pe._VERTICAL_ALIGNMENT_CENTER = 2;+pe._FontHeightSizes = {};+pe.AddHeader = () => {+};+q([+ H()+], pe.prototype, "metadata", void 0);+q([+ H()+], pe.prototype, "isHitTestVisible", void 0);+q([+ H()+], pe.prototype, "isPointerBlocker", void 0);+q([+ H()+], pe.prototype, "isFocusInvisible", void 0);+q([+ H()+], pe.prototype, "clipChildren", null);+q([+ H()+], pe.prototype, "clipContent", null);+q([+ H()+], pe.prototype, "useBitmapCache", void 0);+q([+ H()+], pe.prototype, "shadowOffsetX", null);+q([+ H()+], pe.prototype, "shadowOffsetY", null);+q([+ H()+], pe.prototype, "shadowBlur", null);+q([+ H()+], pe.prototype, "shadowColor", null);+q([+ H()+], pe.prototype, "hoverCursor", void 0);+q([+ H()+], pe.prototype, "fontOffset", null);+q([+ H()+], pe.prototype, "alpha", null);+q([+ H()+], pe.prototype, "isSerializable", void 0);+q([+ H()+], pe.prototype, "scaleX", null);+q([+ H()+], pe.prototype, "scaleY", null);+q([+ H()+], pe.prototype, "rotation", null);+q([+ H()+], pe.prototype, "transformCenterY", null);+q([+ H()+], pe.prototype, "transformCenterX", null);+q([+ H()+], pe.prototype, "horizontalAlignment", null);+q([+ H()+], pe.prototype, "verticalAlignment", null);+q([+ H()+], pe.prototype, "fixedRatio", null);+q([+ H()+], pe.prototype, "fixedRatioMasterIsWidth", null);+q([+ H()+], pe.prototype, "width", null);+q([+ H()+], pe.prototype, "height", null);+q([+ H()+], pe.prototype, "style", null);+q([+ H()+], pe.prototype, "color", null);+q([+ H()+], pe.prototype, "gradient", null);+q([+ H()+], pe.prototype, "zIndex", null);+q([+ H()+], pe.prototype, "notRenderable", null);+q([+ H()+], pe.prototype, "isVisible", null);+q([+ H()+], pe.prototype, "descendantsOnlyPadding", null);+q([+ H()+], pe.prototype, "paddingLeft", null);+q([+ H()+], pe.prototype, "paddingRight", null);+q([+ H()+], pe.prototype, "paddingTop", null);+q([+ H()+], pe.prototype, "paddingBottom", null);+q([+ H()+], pe.prototype, "left", null);+q([+ H()+], pe.prototype, "top", null);+q([+ H()+], pe.prototype, "linkOffsetX", null);+q([+ H()+], pe.prototype, "linkOffsetY", null);+q([+ H()+], pe.prototype, "isEnabled", null);+q([+ H()+], pe.prototype, "disabledColor", null);+q([+ H()+], pe.prototype, "disabledColorItem", null);+q([+ H()+], pe.prototype, "overlapGroup", void 0);+q([+ H()+], pe.prototype, "overlapDeltaMultiplier", void 0);+kr("BABYLON.GUI.Control", pe);+class wi extends pe {+ /** Gets or sets boolean indicating if children should be rendered to an intermediate texture rather than directly to host, useful for alpha blending */+ get renderToIntermediateTexture() {+ return this._renderToIntermediateTexture;+ }+ set renderToIntermediateTexture(i) {+ this._renderToIntermediateTexture !== i && (this._renderToIntermediateTexture = i, this._markAsDirty());+ }+ /** Gets or sets a boolean indicating if the container should try to adapt to its children height */+ get adaptHeightToChildren() {+ return this._adaptHeightToChildren;+ }+ set adaptHeightToChildren(i) {+ this._adaptHeightToChildren !== i && (this._adaptHeightToChildren = i, i && (this.height = "100%"), this._rebuildLayout = !0, this._markAsDirty());+ }+ /** Gets or sets a boolean indicating if the container should try to adapt to its children width */+ get adaptWidthToChildren() {+ return this._adaptWidthToChildren;+ }+ set adaptWidthToChildren(i) {+ this._adaptWidthToChildren !== i && (this._adaptWidthToChildren = i, i && (this.width = "100%"), this._rebuildLayout = !0, this._markAsDirty());+ }+ /** Gets or sets background color */+ get background() {+ return this._background;+ }+ set background(i) {+ this._background !== i && (this._background = i, this._markAsDirty());+ }+ /** Gets or sets background gradient color. Takes precedence over background */+ get backgroundGradient() {+ return this._backgroundGradient;+ }+ set backgroundGradient(i) {+ this._backgroundGradient !== i && (this._backgroundGradient = i, this._markAsDirty());+ }+ /** Gets the list of children */+ get children() {+ return this._children;+ }+ get isReadOnly() {+ return this._isReadOnly;+ }+ set isReadOnly(i) {+ this._isReadOnly = i;+ for (const d of this._children)+ d.isReadOnly = i;+ }+ /**+ * Creates a new Container+ * @param name defines the name of the container+ */+ constructor(i) {+ super(i), this.name = i, this._children = new Array(), this._measureForChildren = Ko.Empty(), this._background = "", this._backgroundGradient = null, this._adaptWidthToChildren = !1, this._adaptHeightToChildren = !1, this._renderToIntermediateTexture = !1, this._intermediateTexture = null, this.delegatePickingToChildren = !1, this.logLayoutCycleErrors = !1, this.maxLayoutCycle = 3, this.onControlAddedObservable = new qt(), this.onControlRemovedObservable = new qt(), this._inverseTransformMatrix = pr.Identity(), this._inverseMeasure = new Ko(0, 0, 0, 0);+ }+ _getTypeName() {+ return "Container";+ }+ _flagDescendantsAsMatrixDirty() {+ for (const i of this.children)+ i._isClipped = !1, i._markMatrixAsDirty();+ }+ /**+ * Gets a child using its name+ * @param name defines the child name to look for+ * @returns the child control if found+ */+ getChildByName(i) {+ for (const d of this.children)+ if (d.name === i)+ return d;+ return null;+ }+ /**+ * Gets a child using its type and its name+ * @param name defines the child name to look for+ * @param type defines the child type to look for+ * @returns the child control if found+ */+ getChildByType(i, d) {+ for (const g of this.children)+ if (g.name === i && g.typeName === d)+ return g;+ return null;+ }+ /**+ * Search for a specific control in children+ * @param control defines the control to look for+ * @returns true if the control is in child list+ */+ containsControl(i) {+ return this.children.indexOf(i) !== -1;+ }+ /**+ * Adds a new control to the current container+ * @param control defines the control to add+ * @returns the current container+ */+ addControl(i) {+ return i ? this._children.indexOf(i) !== -1 ? this : (i._link(this._host), i._markAllAsDirty(), this._reOrderControl(i), this._markAsDirty(), this.onControlAddedObservable.notifyObservers(i), this) : this;+ }+ /**+ * Removes all controls from the current container+ * @returns the current container+ */+ clearControls() {+ const i = this.children.slice();+ for (const d of i)+ this.removeControl(d);+ return this;+ }+ /**+ * Removes a control from the current container+ * @param control defines the control to remove+ * @returns the current container+ */+ removeControl(i) {+ const d = this._children.indexOf(i);+ return d !== -1 && (this._children.splice(d, 1), i.parent = null), i.linkWithMesh(null), this._host && this._host._cleanControlAfterRemoval(i), this._markAsDirty(), this.onControlRemovedObservable.notifyObservers(i), this;+ }+ /**+ * @internal+ */+ _reOrderControl(i) {+ const d = i.linkedMesh;+ this.removeControl(i);+ let g = !1;+ for (let y = 0; y < this._children.length; y++)+ if (this._children[y].zIndex > i.zIndex) {+ this._children.splice(y, 0, i), g = !0;+ break;+ }+ g || this._children.push(i), i.parent = this, d && i.linkWithMesh(d), this._markAsDirty();+ }+ /**+ * @internal+ */+ _offsetLeft(i) {+ super._offsetLeft(i);+ for (const d of this._children)+ d._offsetLeft(i);+ }+ /**+ * @internal+ */+ _offsetTop(i) {+ super._offsetTop(i);+ for (const d of this._children)+ d._offsetTop(i);+ }+ /** @internal */+ _markAllAsDirty() {+ super._markAllAsDirty();+ for (let i = 0; i < this._children.length; i++)+ this._children[i]._markAllAsDirty();+ }+ _getBackgroundColor(i) {+ return this._backgroundGradient ? this._backgroundGradient.getCanvasGradient(i) : this._background;+ }+ /**+ * @internal+ */+ _localDraw(i) {+ (this._background || this._backgroundGradient) && (i.save(), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), i.fillStyle = this._getBackgroundColor(i), i.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height), i.restore());+ }+ /**+ * @internal+ */+ _link(i) {+ super._link(i);+ for (const d of this._children)+ d._link(i);+ }+ /** @internal */+ _beforeLayout() {+ }+ /**+ * @internal+ */+ _processMeasures(i, d) {+ (this._isDirty || !this._cachedParentMeasure.isEqualsTo(i)) && (super._processMeasures(i, d), this._evaluateClippingState(i), this._renderToIntermediateTexture && (this._intermediateTexture && this._host.getScene() != this._intermediateTexture.getScene() && (this._intermediateTexture.dispose(), this._intermediateTexture = null), this._intermediateTexture ? this._intermediateTexture.scaleTo(this._currentMeasure.width, this._currentMeasure.height) : (this._intermediateTexture = new K4("", { width: this._currentMeasure.width, height: this._currentMeasure.height }, this._host.getScene(), !1, Wr.NEAREST_SAMPLINGMODE, Is.TEXTUREFORMAT_RGBA, !1), this._intermediateTexture.hasAlpha = !0)));+ }+ /**+ * @internal+ */+ _layout(i, d) {+ if (!this.isDirty && (!this.isVisible || this.notRenderable))+ return !1;+ this.host._numLayoutCalls++, this._isDirty && this._currentMeasure.transformToRef(this._transformMatrix, this._prevCurrentMeasureTransformedIntoGlobalSpace);+ let g = 0;+ d.save(), this._applyStates(d), this._beforeLayout();+ do {+ let y = -1, M = -1;+ if (this._rebuildLayout = !1, this._processMeasures(i, d), !this._isClipped) {+ for (const N of this._children)+ N._tempParentMeasure.copyFrom(this._measureForChildren), N._layout(this._measureForChildren, d) && N.isVisible && !N.notRenderable && (this.adaptWidthToChildren && N._width.isPixel && (y = Math.max(y, N._currentMeasure.width + N._paddingLeftInPixels + N._paddingRightInPixels)), this.adaptHeightToChildren && N._height.isPixel && (M = Math.max(M, N._currentMeasure.height + N._paddingTopInPixels + N._paddingBottomInPixels)));+ if (this.adaptWidthToChildren && y >= 0) {+ y += this.paddingLeftInPixels + this.paddingRightInPixels;+ const N = y + "px";+ this.width !== N && (this.parent?._markAsDirty(), this.width = N, this._width.ignoreAdaptiveScaling = !0, this._rebuildLayout = !0);+ }+ if (this.adaptHeightToChildren && M >= 0) {+ M += this.paddingTopInPixels + this.paddingBottomInPixels;+ const N = M + "px";+ this.height !== N && (this.parent?._markAsDirty(), this.height = N, this._height.ignoreAdaptiveScaling = !0, this._rebuildLayout = !0);+ }+ this._postMeasure();+ }+ g++;+ } while (this._rebuildLayout && g < this.maxLayoutCycle);+ return this._rebuildLayout && g >= this.maxLayoutCycle && this.logLayoutCycleErrors && zh.Error(`Layout cycle detected in GUI (Container name=${this.name}, uniqueId=${this.uniqueId})`), d.restore(), this._isDirty && (this.invalidateRect(), this._isDirty = !1), !0;+ }+ _postMeasure() {+ }+ /**+ * @internal+ */+ _draw(i, d) {+ const g = this._renderToIntermediateTexture && this._intermediateTexture, y = g ? this._intermediateTexture.getContext() : i;+ g && (y.save(), y.translate(-this._currentMeasure.left, -this._currentMeasure.top), d ? (this._transformMatrix.invertToRef(this._inverseTransformMatrix), d.transformToRef(this._inverseTransformMatrix, this._inverseMeasure), y.clearRect(this._inverseMeasure.left, this._inverseMeasure.top, this._inverseMeasure.width, this._inverseMeasure.height)) : y.clearRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height)), this._localDraw(y), i.save(), this.clipChildren && this._clipForChildren(y);+ for (const M of this._children)+ d && !M._intersectsRect(d) || M._render(y, d);+ g && (y.restore(), i.save(), i.globalAlpha = this.alpha, i.drawImage(y.canvas, this._currentMeasure.left, this._currentMeasure.top), i.restore()), i.restore();+ }+ getDescendantsToRef(i, d = !1, g) {+ if (this.children)+ for (let y = 0; y < this.children.length; y++) {+ const M = this.children[y];+ (!g || g(M)) && i.push(M), d || M.getDescendantsToRef(i, !1, g);+ }+ }+ /**+ * @internal+ */+ _processPicking(i, d, g, y, M, N, O, F) {+ if (!this._isEnabled || !this.isVisible || this.notRenderable)+ return !1;+ const ne = super.contains(i, d);+ if (!ne && this.clipChildren)+ return !1;+ if (this.delegatePickingToChildren) {+ let $ = !1;+ for (let Q = this._children.length - 1; Q >= 0; Q--) {+ const X = this._children[Q];+ if (X.isEnabled && X.isHitTestVisible && X.isVisible && !X.notRenderable && X.contains(i, d)) {+ $ = !0;+ break;+ }+ }+ if (!$)+ return !1;+ }+ for (let $ = this._children.length - 1; $ >= 0; $--) {+ const Q = this._children[$];+ if (Q._processPicking(i, d, g, y, M, N, O, F))+ return Q.hoverCursor && this._host._changeCursor(Q.hoverCursor), !0;+ }+ return !ne || !this.isHitTestVisible ? !1 : this._processObservables(y, i, d, g, M, N, O, F);+ }+ /**+ * @internal+ */+ _additionalProcessing(i, d) {+ super._additionalProcessing(i, d), this._measureForChildren.copyFrom(this._currentMeasure);+ }+ _getAdaptDimTo(i) {+ return i === "width" ? this.adaptWidthToChildren : this.adaptHeightToChildren;+ }+ isDimensionFullyDefined(i) {+ if (this._getAdaptDimTo(i)) {+ for (const d of this.children)+ if (!d.isDimensionFullyDefined(i))+ return !1;+ return !0;+ }+ return super.isDimensionFullyDefined(i);+ }+ /**+ * Serializes the current control+ * @param serializationObject defined the JSON serialized object+ * @param force force serialization even if isSerializable === false+ * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize (true by default)+ */+ serialize(i, d = !1, g = !0) {+ if (super.serialize(i, d, g), !(!this.isSerializable && !d) && (this.backgroundGradient && (i.backgroundGradient = {}, this.backgroundGradient.serialize(i.backgroundGradient)), !!this.children.length)) {+ i.children = [];+ for (const y of this.children)+ if (y.isSerializable || d) {+ const M = {};+ y.serialize(M, d, g), i.children.push(M);+ }+ }+ }+ /** Releases associated resources */+ dispose() {+ super.dispose();+ for (let i = this.children.length - 1; i >= 0; i--)+ this.children[i].dispose();+ this._intermediateTexture?.dispose();+ }+ /**+ * @internal+ */+ _parseFromContent(i, d, g) {+ if (super._parseFromContent(i, d, g), this._link(d), i.backgroundGradient) {+ const y = Lr.Instantiate("BABYLON.GUI." + i.backgroundGradient.className);+ this._backgroundGradient = new y(), this._backgroundGradient?.parse(i.backgroundGradient);+ }+ if (i.children)+ for (const y of i.children)+ this.addControl(pe.Parse(y, d, g));+ }+ isReady() {+ for (const i of this.children)+ if (!i.isReady())+ return !1;+ return !0;+ }+}+q([+ H()+], wi.prototype, "delegatePickingToChildren", void 0);+q([+ H()+], wi.prototype, "renderToIntermediateTexture", null);+q([+ H()+], wi.prototype, "maxLayoutCycle", void 0);+q([+ H()+], wi.prototype, "adaptHeightToChildren", null);+q([+ H()+], wi.prototype, "adaptWidthToChildren", null);+q([+ H()+], wi.prototype, "background", null);+q([+ H()+], wi.prototype, "backgroundGradient", null);+kr("BABYLON.GUI.Container", wi);+class si extends wi {+ /** Gets or sets border thickness */+ get thickness() {+ return this._thickness;+ }+ set thickness(i) {+ this._thickness !== i && (this._thickness = i, this._markAsDirty());+ }+ /** Gets or sets the corner radius of all angles */+ get cornerRadius() {+ return this._cornerRadius[0];+ }+ set cornerRadius(i) {+ i < 0 && (i = 0), !(this._cornerRadius[0] === i && this._cornerRadius[1] === i && this._cornerRadius[2] === i && this._cornerRadius[3] === i) && (this._cornerRadius[0] = this._cornerRadius[1] = this._cornerRadius[2] = this._cornerRadius[3] = i, this._markAsDirty());+ }+ /** Gets or sets the corner radius top left angle */+ get cornerRadiusX() {+ return this._cornerRadius[0];+ }+ set cornerRadiusX(i) {+ this._cornerRadius[0] !== i && (this._cornerRadius[0] = i);+ }+ /** Gets or sets the corner radius top right angle */+ get cornerRadiusY() {+ return this._cornerRadius[1];+ }+ set cornerRadiusY(i) {+ this._cornerRadius[1] !== i && (this._cornerRadius[1] = i);+ }+ /** Gets or sets the corner radius bottom left angle */+ get cornerRadiusZ() {+ return this._cornerRadius[2];+ }+ set cornerRadiusZ(i) {+ this._cornerRadius[2] !== i && (this._cornerRadius[2] = i);+ }+ /** Gets or sets the corner radius bottom right angle */+ get cornerRadiusW() {+ return this._cornerRadius[3];+ }+ set cornerRadiusW(i) {+ this._cornerRadius[3] !== i && (this._cornerRadius[3] = i);+ }+ /**+ * Creates a new Rectangle+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._thickness = 1, this._cornerRadius = [0, 0, 0, 0], this._cachedRadius = [0, 0, 0, 0];+ }+ _getTypeName() {+ return "Rectangle";+ }+ /** @internal */+ _computeAdditionalOffsetX() {+ let i = 0;+ return (this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0) && (i += 1), this.thickness && (i += this.thickness / 2), i;+ }+ /** @internal */+ _computeAdditionalOffsetY() {+ let i = 0;+ return (this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0) && (i += 1), this.thickness && (i += this.thickness / 2), i;+ }+ _getRectangleFill(i) {+ return this._getBackgroundColor(i);+ }+ _localDraw(i) {+ i.save(), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), (this._background || this._backgroundGradient) && (i.fillStyle = this._getRectangleFill(i), this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0 ? (this._drawRoundedRect(i, this._thickness / 2), i.fill()) : i.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height)), this._thickness && ((this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), (this.color || this.gradient) && (i.strokeStyle = this.gradient ? this.gradient.getCanvasGradient(i) : this.color), i.lineWidth = this._thickness, this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0 ? (this._drawRoundedRect(i, this._thickness / 2), i.stroke()) : i.strokeRect(this._currentMeasure.left + this._thickness / 2, this._currentMeasure.top + this._thickness / 2, this._currentMeasure.width - this._thickness, this._currentMeasure.height - this._thickness)), i.restore();+ }+ _additionalProcessing(i, d) {+ super._additionalProcessing(i, d), this._measureForChildren.width -= 2 * this._thickness, this._measureForChildren.height -= 2 * this._thickness, this._measureForChildren.left += this._thickness, this._measureForChildren.top += this._thickness;+ }+ _drawRoundedRect(i, d = 0) {+ const g = this._currentMeasure.left + d, y = this._currentMeasure.top + d, M = this._currentMeasure.width - d * 2, N = this._currentMeasure.height - d * 2, O = this._host.idealRatio;+ for (let F = 0; F < this._cornerRadius.length; F++)+ this._cachedRadius[F] = Math.abs(Math.min(N / 2, Math.min(M / 2, this._cornerRadius[F] * O)));+ i.beginPath(), i.moveTo(g + this._cachedRadius[0], y), i.lineTo(g + M - this._cachedRadius[1], y), i.arc(g + M - this._cachedRadius[1], y + this._cachedRadius[1], this._cachedRadius[1], 3 * Math.PI / 2, Math.PI * 2), i.lineTo(g + M, y + N - this._cachedRadius[2]), i.arc(g + M - this._cachedRadius[2], y + N - this._cachedRadius[2], this._cachedRadius[2], 0, Math.PI / 2), i.lineTo(g + this._cachedRadius[3], y + N), i.arc(g + this._cachedRadius[3], y + N - this._cachedRadius[3], this._cachedRadius[3], Math.PI / 2, Math.PI), i.lineTo(g, y + this._cachedRadius[0]), i.arc(g + this._cachedRadius[0], y + this._cachedRadius[0], this._cachedRadius[0], Math.PI, 3 * Math.PI / 2), i.closePath();+ }+ _clipForChildren(i) {+ (this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0) && (this._drawRoundedRect(i, this._thickness), i.clip());+ }+}+q([+ H()+], si.prototype, "thickness", null);+q([+ H()+], si.prototype, "cornerRadius", null);+q([+ H()+], si.prototype, "cornerRadiusX", null);+q([+ H()+], si.prototype, "cornerRadiusY", null);+q([+ H()+], si.prototype, "cornerRadiusZ", null);+q([+ H()+], si.prototype, "cornerRadiusW", null);+kr("BABYLON.GUI.Rectangle", si);+var iw;+(function($e) {+ $e[$e.Clip = 0] = "Clip", $e[$e.WordWrap = 1] = "WordWrap", $e[$e.Ellipsis = 2] = "Ellipsis", $e[$e.WordWrapEllipsis = 3] = "WordWrapEllipsis", $e[$e.HTML = 4] = "HTML";+})(iw || (iw = {}));+class zr extends pe {+ /**+ * Return the line list (you may need to use the onLinesReadyObservable to make sure the list is ready)+ */+ get lines() {+ return this._lines;+ }+ /**+ * Gets or sets a boolean indicating that the TextBlock will be resized to fit its content+ + */+ get resizeToFit() {+ return this._resizeToFit;+ }+ /**+ * Gets or sets a boolean indicating that the TextBlock will be resized to fit its content+ + */+ set resizeToFit(i) {+ this._resizeToFit !== i && (this._resizeToFit = i, this._resizeToFit && (this._width.ignoreAdaptiveScaling = !0, this._height.ignoreAdaptiveScaling = !0), this._markAsDirty());+ }+ /**+ * Gets or sets a boolean indicating if text must be wrapped+ */+ get textWrapping() {+ return this._textWrapping;+ }+ /**+ * Gets or sets a boolean indicating if text must be wrapped+ */+ set textWrapping(i) {+ this._textWrapping !== i && (this._textWrapping = +i, this._markAsDirty());+ }+ /**+ * Gets or sets text to display+ */+ get text() {+ return this._text;+ }+ /**+ * Gets or sets text to display+ */+ set text(i) {+ this._text !== i && (this._text = i + "", this._markAsDirty(), this.onTextChangedObservable.notifyObservers(this));+ }+ /**+ * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)+ */+ get textHorizontalAlignment() {+ return this._textHorizontalAlignment;+ }+ /**+ * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)+ */+ set textHorizontalAlignment(i) {+ this._textHorizontalAlignment !== i && (this._textHorizontalAlignment = i, this._markAsDirty());+ }+ /**+ * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)+ */+ get textVerticalAlignment() {+ return this._textVerticalAlignment;+ }+ /**+ * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)+ */+ set textVerticalAlignment(i) {+ this._textVerticalAlignment !== i && (this._textVerticalAlignment = i, this._markAsDirty());+ }+ /**+ * Gets or sets line spacing value+ */+ set lineSpacing(i) {+ this._lineSpacing.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets line spacing value+ */+ get lineSpacing() {+ return this._lineSpacing.toString(this._host);+ }+ /**+ * Gets or sets outlineWidth of the text to display+ */+ get outlineWidth() {+ return this._outlineWidth;+ }+ /**+ * Gets or sets outlineWidth of the text to display+ */+ set outlineWidth(i) {+ this._outlineWidth !== i && (this._outlineWidth = i, this._markAsDirty());+ }+ /**+ * Gets or sets a boolean indicating that text must have underline+ */+ get underline() {+ return this._underline;+ }+ /**+ * Gets or sets a boolean indicating that text must have underline+ */+ set underline(i) {+ this._underline !== i && (this._underline = i, this._markAsDirty());+ }+ /**+ * Gets or sets an boolean indicating that text must be crossed out+ */+ get lineThrough() {+ return this._lineThrough;+ }+ /**+ * Gets or sets an boolean indicating that text must be crossed out+ */+ set lineThrough(i) {+ this._lineThrough !== i && (this._lineThrough = i, this._markAsDirty());+ }+ /**+ * If the outline should be applied to the underline/strike-through too. Has different behavior in Edge/Chrome vs Firefox.+ */+ get applyOutlineToUnderline() {+ return this._applyOutlineToUnderline;+ }+ set applyOutlineToUnderline(i) {+ this._applyOutlineToUnderline !== i && (this._applyOutlineToUnderline = i, this._markAsDirty());+ }+ /**+ * Gets or sets outlineColor of the text to display+ */+ get outlineColor() {+ return this._outlineColor;+ }+ /**+ * Gets or sets outlineColor of the text to display+ */+ set outlineColor(i) {+ this._outlineColor !== i && (this._outlineColor = i, this._markAsDirty());+ }+ /**+ * Gets or sets word divider+ */+ get wordDivider() {+ return this._wordDivider;+ }+ /**+ * Gets or sets word divider+ */+ set wordDivider(i) {+ this._wordDivider !== i && (this._wordDivider = i, this._markAsDirty());+ }+ /**+ * By default, if a text block has text wrapping other than Clip, its width+ * is not resized even if resizeToFit = true. This parameter forces the width+ * to be resized.+ */+ get forceResizeWidth() {+ return this._forceResizeWidth;+ }+ set forceResizeWidth(i) {+ this._forceResizeWidth !== i && (this._forceResizeWidth = i, this._markAsDirty());+ }+ /**+ * Creates a new TextBlock object+ * @param name defines the name of the control+ * @param text defines the text to display (empty string by default)+ */+ constructor(i, d = "") {+ super(i), this.name = i, this._text = "", this._textWrapping = 0, this._textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_CENTER, this._textVerticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, this._resizeToFit = !1, this._lineSpacing = new St(0), this._outlineWidth = 0, this._outlineColor = "white", this._underline = !1, this._lineThrough = !1, this._wordDivider = " ", this._forceResizeWidth = !1, this._applyOutlineToUnderline = !1, this.onTextChangedObservable = new qt(), this.onLinesReadyObservable = new qt(), this.reuseHTMLForWordWrapping = !1, this._linesTemp = [], this._htmlElement = null, this.text = d;+ }+ _getTypeName() {+ return "TextBlock";+ }+ _processMeasures(i, d) {+ super._processMeasures(i, d), d.save(), this._applyStates(d), (!this._fontOffset || this.isDirty) && (this._fontOffset = pe._GetFontOffset(d.font, this._host.getScene()?.getEngine())), this._lines = this._breakLines(this._currentMeasure.width, this._currentMeasure.height, d), this.onLinesReadyObservable.notifyObservers(this), d.restore();+ let g = 0;+ for (let y = 0; y < this._lines.length; y++) {+ const M = this._lines[y];+ M.width > g && (g = M.width);+ }+ if (this._resizeToFit) {+ if (this._textWrapping === 0 || this._forceResizeWidth) {+ const M = Math.ceil(this._paddingLeftInPixels) + Math.ceil(this._paddingRightInPixels) + Math.ceil(g);+ M !== this._width.getValueInPixel(this._host, this._tempParentMeasure.width) && (this._width.updateInPlace(M, St.UNITMODE_PIXEL), this._rebuildLayout = !0);+ }+ let y = this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * this._lines.length | 0;+ if (this._lines.length > 0 && this._lineSpacing.internalValue !== 0) {+ let M;+ this._lineSpacing.isPixel ? M = this._lineSpacing.getValue(this._host) : M = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height), y += (this._lines.length - 1) * M;+ }+ y !== this._height.internalValue && (this._height.updateInPlace(y, St.UNITMODE_PIXEL), this._rebuildLayout = !0);+ }+ }+ _drawText(i, d, g, y) {+ const M = this._currentMeasure.width;+ let N = 0;+ switch (this._textHorizontalAlignment) {+ case pe.HORIZONTAL_ALIGNMENT_LEFT:+ N = 0;+ break;+ case pe.HORIZONTAL_ALIGNMENT_RIGHT:+ N = M - d;+ break;+ case pe.HORIZONTAL_ALIGNMENT_CENTER:+ N = (M - d) / 2;+ break;+ }+ if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {+ y.shadowColor = this.shadowColor, y.shadowBlur = this.shadowBlur;+ const O = this.host.idealRatio;+ y.shadowOffsetX = this.shadowOffsetX * O, y.shadowOffsetY = this.shadowOffsetY * O;+ }+ this.outlineWidth && y.strokeText(i, this._currentMeasure.left + N, g), y.fillText(i, this._currentMeasure.left + N, g), this._underline && this._drawLine(this._currentMeasure.left + N, g + 3, this._currentMeasure.left + N + d, g + 3, y), this._lineThrough && this._drawLine(this._currentMeasure.left + N, g - this.fontSizeInPixels / 3, this._currentMeasure.left + N + d, g - this.fontSizeInPixels / 3, y);+ }+ _drawLine(i, d, g, y, M) {+ if (M.beginPath(), M.lineWidth = Math.round(this.fontSizeInPixels * 0.05), M.moveTo(i, d), M.lineTo(g, y), this.outlineWidth && this.applyOutlineToUnderline)+ M.stroke(), M.fill();+ else {+ const N = M.strokeStyle;+ M.strokeStyle = M.fillStyle, M.stroke(), M.strokeStyle = N;+ }+ M.closePath();+ }+ /**+ * @internal+ */+ _draw(i) {+ i.save(), this._applyStates(i), this._renderLines(i), i.restore();+ }+ _applyStates(i) {+ super._applyStates(i), this.outlineWidth && (i.lineWidth = this.outlineWidth, i.strokeStyle = this.outlineColor, i.lineJoin = "miter", i.miterLimit = 2);+ }+ _breakLines(i, d, g) {+ this._linesTemp.length = 0;+ const y = this._textWrapping === 4 ? this._parseHTMLText(i, d, g) : this.text.split(`+`);+ switch (this._textWrapping) {+ case 1:+ for (const M of y)+ this._linesTemp.push(...this._parseLineWordWrap(M, i, g));+ break;+ case 2:+ for (const M of y)+ this._linesTemp.push(this._parseLineEllipsis(M, i, g));+ break;+ case 3:+ for (const M of y)+ this._linesTemp.push(...this._parseLineWordWrapEllipsis(M, i, d, g));+ break;+ case 4:+ default:+ for (const M of y)+ this._linesTemp.push(this._parseLine(M, g));+ break;+ }+ return this._linesTemp;+ }+ _parseHTMLText(i, d, g) {+ const y = [];+ this._htmlElement || (this._htmlElement = document.createElement("div"), document.body.appendChild(this._htmlElement));+ const M = this._htmlElement;+ M.textContent = this.text, M.style.font = g.font, M.style.position = "absolute", M.style.visibility = "hidden", M.style.top = "-1000px", M.style.left = "-1000px", this.adjustWordWrappingHTMLElement?.(M), M.style.width = i + "px", M.style.height = d + "px";+ const N = M.textContent;+ if (!N)+ return y;+ const O = M.childNodes[0], F = document.createRange();+ let ne = 0;+ for (const $ of N) {+ F.setStart(O, 0), F.setEnd(O, ne + 1);+ const Q = F.getClientRects().length - 1;+ y[Q] = (y[Q] || "") + $, ne++;+ }+ return this.reuseHTMLForWordWrapping || (M.remove(), this._htmlElement = null), y;+ }+ _parseLine(i = "", d) {+ return { text: i, width: this._getTextMetricsWidth(d.measureText(i)) };+ }+ //Calculate how many characters approximately we need to remove+ _getCharsToRemove(i, d, g) {+ const y = i > d ? i - d : 0, M = i / g;+ return Math.max(Math.floor(y / M), 1);+ }+ _parseLineEllipsis(i = "", d, g) {+ let y = this._getTextMetricsWidth(g.measureText(i)), M = this._getCharsToRemove(y, d, i.length);+ const N = Array.from && Array.from(i);+ if (N)+ for (; N.length && y > d; )+ N.splice(N.length - M, M), i = `${N.join("")}…`, y = this._getTextMetricsWidth(g.measureText(i)), M = this._getCharsToRemove(y, d, i.length);+ else {+ for (; i.length > 2 && y > d; )+ i = i.slice(0, -M), y = this._getTextMetricsWidth(g.measureText(i + "…")), M = this._getCharsToRemove(y, d, i.length);+ i += "…";+ }+ return { text: i, width: y };+ }+ _getTextMetricsWidth(i) {+ return i.actualBoundingBoxLeft !== void 0 ? Math.abs(i.actualBoundingBoxLeft) + Math.abs(i.actualBoundingBoxRight) : i.width;+ }+ _parseLineWordWrap(i = "", d, g) {+ const y = [], M = this.wordSplittingFunction ? this.wordSplittingFunction(i) : i.split(this._wordDivider);+ let N = this._getTextMetricsWidth(g.measureText(i));+ for (let O = 0; O < M.length; O++) {+ const F = O > 0 ? i + this._wordDivider + M[O] : M[0], ne = this._getTextMetricsWidth(g.measureText(F));+ ne > d && O > 0 ? (y.push({ text: i, width: N }), i = M[O], N = this._getTextMetricsWidth(g.measureText(i))) : (N = ne, i = F);+ }+ return y.push({ text: i, width: N }), y;+ }+ _parseLineWordWrapEllipsis(i = "", d, g, y) {+ const M = this._parseLineWordWrap(i, d, y);+ for (let N = 1; N <= M.length; N++)+ if (this._computeHeightForLinesOf(N) > g && N > 1) {+ const F = M[N - 2], ne = M[N - 1];+ M[N - 2] = this._parseLineEllipsis(F.text + this._wordDivider + ne.text, d, y);+ const $ = M.length - N + 1;+ for (let Q = 0; Q < $; Q++)+ M.pop();+ return M;+ }+ return M;+ }+ _renderLines(i) {+ if (!this._fontOffset || !this._lines)+ return;+ const d = this._currentMeasure.height;+ let g = 0;+ switch (this._textVerticalAlignment) {+ case pe.VERTICAL_ALIGNMENT_TOP:+ g = this._fontOffset.ascent;+ break;+ case pe.VERTICAL_ALIGNMENT_BOTTOM:+ g = d - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;+ break;+ case pe.VERTICAL_ALIGNMENT_CENTER:+ g = this._fontOffset.ascent + (d - this._fontOffset.height * this._lines.length) / 2;+ break;+ }+ g += this._currentMeasure.top;+ for (let y = 0; y < this._lines.length; y++) {+ const M = this._lines[y];+ y !== 0 && this._lineSpacing.internalValue !== 0 && (this._lineSpacing.isPixel ? g += this._lineSpacing.getValue(this._host) : g = g + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height)), this._drawText(M.text, M.width, g, i), g += this._fontOffset.height;+ }+ }+ _computeHeightForLinesOf(i) {+ let d = this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * i;+ if (i > 0 && this._lineSpacing.internalValue !== 0) {+ let g;+ this._lineSpacing.isPixel ? g = this._lineSpacing.getValue(this._host) : g = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height), d += (i - 1) * g;+ }+ return d;+ }+ isDimensionFullyDefined(i) {+ return this.resizeToFit ? !0 : super.isDimensionFullyDefined(i);+ }+ /**+ * Given a width constraint applied on the text block, find the expected height+ * @returns expected height+ */+ computeExpectedHeight() {+ if (this.text && this.widthInPixels) {+ const i = md.LastCreatedEngine?.createCanvas(0, 0).getContext("2d");+ if (i) {+ this._applyStates(i), this._fontOffset || (this._fontOffset = pe._GetFontOffset(i.font, this._host.getScene()?.getEngine()));+ const d = this._lines ? this._lines : this._breakLines(this.widthInPixels - this._paddingLeftInPixels - this._paddingRightInPixels, this.heightInPixels - this._paddingTopInPixels - this._paddingBottomInPixels, i);+ return this._computeHeightForLinesOf(d.length);+ }+ }+ return 0;+ }+ dispose() {+ super.dispose(), this.onTextChangedObservable.clear(), this._htmlElement?.remove(), this._htmlElement = null;+ }+}+q([+ H()+], zr.prototype, "resizeToFit", null);+q([+ H()+], zr.prototype, "textWrapping", null);+q([+ H()+], zr.prototype, "text", null);+q([+ H()+], zr.prototype, "textHorizontalAlignment", null);+q([+ H()+], zr.prototype, "textVerticalAlignment", null);+q([+ H()+], zr.prototype, "lineSpacing", null);+q([+ H()+], zr.prototype, "outlineWidth", null);+q([+ H()+], zr.prototype, "underline", null);+q([+ H()+], zr.prototype, "lineThrough", null);+q([+ H()+], zr.prototype, "applyOutlineToUnderline", null);+q([+ H()+], zr.prototype, "outlineColor", null);+q([+ H()+], zr.prototype, "wordDivider", null);+q([+ H()+], zr.prototype, "forceResizeWidth", null);+kr("BABYLON.GUI.TextBlock", zr);+class Ft extends pe {+ /**+ * Gets a boolean indicating that the content is loaded+ */+ get isLoaded() {+ return this._loaded;+ }+ isReady() {+ return this.isLoaded;+ }+ /**+ * Gets or sets a boolean indicating if pointers should only be validated on pixels with alpha > 0.+ * Beware using this as this will consume more memory as the image has to be stored twice+ */+ get detectPointerOnOpaqueOnly() {+ return this._detectPointerOnOpaqueOnly;+ }+ set detectPointerOnOpaqueOnly(i) {+ this._detectPointerOnOpaqueOnly !== i && (this._detectPointerOnOpaqueOnly = i);+ }+ /**+ * Gets or sets the left value for slicing (9-patch)+ */+ get sliceLeft() {+ return this._sliceLeft;+ }+ set sliceLeft(i) {+ this._sliceLeft !== i && (this._sliceLeft = i, this._markAsDirty());+ }+ /**+ * Gets or sets the right value for slicing (9-patch)+ */+ get sliceRight() {+ return this._sliceRight;+ }+ set sliceRight(i) {+ this._sliceRight !== i && (this._sliceRight = i, this._markAsDirty());+ }+ /**+ * Gets or sets the top value for slicing (9-patch)+ */+ get sliceTop() {+ return this._sliceTop;+ }+ set sliceTop(i) {+ this._sliceTop !== i && (this._sliceTop = i, this._markAsDirty());+ }+ /**+ * Gets or sets the bottom value for slicing (9-patch)+ */+ get sliceBottom() {+ return this._sliceBottom;+ }+ set sliceBottom(i) {+ this._sliceBottom !== i && (this._sliceBottom = i, this._markAsDirty());+ }+ /**+ * Gets or sets the left coordinate in the source image+ */+ get sourceLeft() {+ return this._sourceLeft;+ }+ set sourceLeft(i) {+ this._sourceLeft !== i && (this._sourceLeft = i, this._markAsDirty());+ }+ /**+ * Gets or sets the top coordinate in the source image+ */+ get sourceTop() {+ return this._sourceTop;+ }+ set sourceTop(i) {+ this._sourceTop !== i && (this._sourceTop = i, this._markAsDirty());+ }+ /**+ * Gets or sets the width to capture in the source image+ */+ get sourceWidth() {+ return this._sourceWidth;+ }+ set sourceWidth(i) {+ this._sourceWidth !== i && (this._sourceWidth = i, this._markAsDirty());+ }+ /**+ * Gets or sets the height to capture in the source image+ */+ get sourceHeight() {+ return this._sourceHeight;+ }+ set sourceHeight(i) {+ this._sourceHeight !== i && (this._sourceHeight = i, this._markAsDirty());+ }+ /**+ * Gets the image width+ */+ get imageWidth() {+ return this._imageWidth;+ }+ /**+ * Gets the image height+ */+ get imageHeight() {+ return this._imageHeight;+ }+ /**+ * Gets or sets a boolean indicating if nine patch slices (left, top, right, bottom) should be read from image data+ */+ get populateNinePatchSlicesFromImage() {+ return this._populateNinePatchSlicesFromImage;+ }+ set populateNinePatchSlicesFromImage(i) {+ this._populateNinePatchSlicesFromImage !== i && (this._populateNinePatchSlicesFromImage = i, this._populateNinePatchSlicesFromImage && this._loaded && this._extractNinePatchSliceDataFromImage());+ }+ /** Indicates if the format of the image is SVG */+ get isSVG() {+ return this._isSVG;+ }+ /** Gets the status of the SVG attributes computation (sourceLeft, sourceTop, sourceWidth, sourceHeight) */+ get svgAttributesComputationCompleted() {+ return this._svgAttributesComputationCompleted;+ }+ /**+ * Gets or sets a boolean indicating if the image can force its container to adapt its size+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image+ */+ get autoScale() {+ return this._autoScale;+ }+ set autoScale(i) {+ this._autoScale !== i && (this._autoScale = i, i && this._loaded && this.synchronizeSizeWithContent());+ }+ /** Gets or sets the stretching mode used by the image */+ get stretch() {+ return this._stretch;+ }+ set stretch(i) {+ this._stretch !== i && (this._stretch = i, this._markAsDirty());+ }+ /**+ * @internal+ */+ _rotate90(i, d = !1) {+ const g = this._domImage.width, y = this._domImage.height, M = this._host?.getScene()?.getEngine() || md.LastCreatedEngine;+ if (!M)+ throw new Error("Invalid engine. Unable to create a canvas.");+ const N = M.createCanvas(y, g), O = N.getContext("2d");+ O.translate(N.width / 2, N.height / 2), O.rotate(i * Math.PI / 2), O.drawImage(this._domImage, 0, 0, g, y, -g / 2, -y / 2, g, y);+ const F = N.toDataURL("image/jpg"), ne = new Ft(this.name + "rotated", F);+ return d && (ne._stretch = this._stretch, ne._autoScale = this._autoScale, ne._cellId = this._cellId, ne._cellWidth = i % 1 ? this._cellHeight : this._cellWidth, ne._cellHeight = i % 1 ? this._cellWidth : this._cellHeight), this._handleRotationForSVGImage(this, ne, i), this._imageDataCache.data = null, ne;+ }+ _handleRotationForSVGImage(i, d, g) {+ i._isSVG && (i._svgAttributesComputationCompleted ? (this._rotate90SourceProperties(i, d, g), this._markAsDirty()) : i.onSVGAttributesComputedObservable.addOnce(() => {+ this._rotate90SourceProperties(i, d, g), this._markAsDirty();+ }));+ }+ _rotate90SourceProperties(i, d, g) {+ let y = i.sourceLeft, M = i.sourceTop, N = i.domImage.width, O = i.domImage.height, F = y, ne = M, $ = i.sourceWidth, Q = i.sourceHeight;+ if (g != 0) {+ const X = g < 0 ? -1 : 1;+ g = g % 4;+ for (let he = 0; he < Math.abs(g); ++he)+ F = -(M - O / 2) * X + O / 2, ne = (y - N / 2) * X + N / 2, [$, Q] = [Q, $], g < 0 ? ne -= Q : F -= $, y = F, M = ne, [N, O] = [O, N];+ }+ d.sourceLeft = F, d.sourceTop = ne, d.sourceWidth = $, d.sourceHeight = Q;+ }+ _extractNinePatchSliceDataFromImage() {+ const i = this._domImage.width, d = this._domImage.height;+ if (!this._workingCanvas) {+ const N = this._host?.getScene()?.getEngine() || md.LastCreatedEngine;+ if (!N)+ throw new Error("Invalid engine. Unable to create a canvas.");+ this._workingCanvas = N.createCanvas(i, d);+ }+ const y = this._workingCanvas.getContext("2d");+ y.drawImage(this._domImage, 0, 0, i, d);+ const M = y.getImageData(0, 0, i, d);+ this._sliceLeft = -1, this._sliceRight = -1;+ for (let N = 0; N < i; N++) {+ const O = M.data[N * 4 + 3];+ if (O > 127 && this._sliceLeft === -1) {+ this._sliceLeft = N;+ continue;+ }+ if (O < 127 && this._sliceLeft > -1) {+ this._sliceRight = N;+ break;+ }+ }+ this._sliceTop = -1, this._sliceBottom = -1;+ for (let N = 0; N < d; N++) {+ const O = M.data[N * i * 4 + 3];+ if (O > 127 && this._sliceTop === -1) {+ this._sliceTop = N;+ continue;+ }+ if (O < 127 && this._sliceTop > -1) {+ this._sliceBottom = N;+ break;+ }+ }+ }+ /**+ * Gets or sets the internal DOM image used to render the control+ */+ set domImage(i) {+ this._domImage = i, this._loaded = !1, this._imageDataCache.data = null, this._domImage.width ? this._onImageLoaded() : this._domImage.onload = () => {+ this._onImageLoaded();+ };+ }+ get domImage() {+ return this._domImage;+ }+ _onImageLoaded() {+ this._imageDataCache.data = null, this._imageWidth = this._domImage.width, this._imageHeight = this._domImage.height, this._loaded = !0, this._populateNinePatchSlicesFromImage && this._extractNinePatchSliceDataFromImage(), this._autoScale && this.synchronizeSizeWithContent(), this.onImageLoadedObservable.notifyObservers(this), this._markAsDirty();+ }+ /**+ * Gets the image source url+ */+ get source() {+ return this._source;+ }+ /**+ * Resets the internal Image Element cache. Can reduce memory usage.+ */+ static ResetImageCache() {+ Ft.SourceImgCache.clear();+ }+ _removeCacheUsage(i) {+ const d = i && Ft.SourceImgCache.get(i);+ if (d) {+ d.timesUsed -= 1;+ const g = d.img;+ g.parentNode && g.parentNode.removeChild(g), d.timesUsed === 0 && Ft.SourceImgCache.delete(i);+ }+ }+ /**+ * Gets or sets image source url+ */+ set source(i) {+ if (this._urlRewriter && i && (i = this._urlRewriter(i)), this._source === i)+ return;+ this._removeCacheUsage(this._source), this._loaded = !1, this._source = i, this._imageDataCache.data = null, i && (i = this._svgCheck(i));+ const d = this._host?.getScene()?.getEngine() || md.LastCreatedEngine;+ if (!d)+ return;+ if (i && Ft.SourceImgCache.has(i)) {+ const M = Ft.SourceImgCache.get(i);+ this._domImage = M.img, M.timesUsed += 1, M.loaded ? this._onImageLoaded() : M.waitingForLoadCallback.push(this._onImageLoaded.bind(this));+ return;+ }+ this._domImage = d.createCanvasImage();+ const g = this._domImage;+ let y = !1;+ g.style && this._source?.endsWith(".svg") && (g.style.visibility = "hidden", g.style.position = "absolute", g.style.top = "0", d.getRenderingCanvas()?.parentNode?.appendChild(g), y = !0), i && Ft.SourceImgCache.set(i, { img: this._domImage, timesUsed: 1, loaded: !1, waitingForLoadCallback: [this._onImageLoaded.bind(this)] }), this._domImage.onload = () => {+ if (i) {+ const M = Ft.SourceImgCache.get(i);+ if (M) {+ M.loaded = !0;+ for (const N of M.waitingForLoadCallback)+ N();+ M.waitingForLoadCallback.length = 0, y && g.remove();+ return;+ }+ }+ this._onImageLoaded(), y && g.remove();+ }, i && (Lr.SetCorsBehavior(i, this._domImage), Lr.SetReferrerPolicyBehavior(this.referrerPolicy, this._domImage), this._domImage.src = i);+ }+ _sanitizeSVG(i) {+ if (i.indexOf("<svg") === -1)+ return i;+ const g = new DOMParser().parseFromString(i, "image/svg+xml"), y = ["script", "iframe", "foreignObject", "object", "embed", "link", "style"], M = [/^on/i, /^xlink:href$/, /^href$/];+ y.forEach((O) => {+ const F = g.getElementsByTagName(O);+ for (let ne = F.length - 1; ne >= 0; ne--)+ F[ne].remove();+ });+ function N(O) {+ if (O.attributes)+ for (let F = O.attributes.length - 1; F >= 0; F--) {+ const ne = O.attributes[F], $ = ne.name, Q = ne.value;+ M.some((X) => X.test($)) && O.removeAttribute($), typeof Q == "string" && Q.trim().toLowerCase().startsWith("javascript:") && O.removeAttribute($);+ }+ for (let F = 0; F < O.children.length; F++)+ N(O.children[F]);+ }+ return N(g.documentElement), new XMLSerializer().serializeToString(g);+ }+ /**+ * Checks for svg document with icon id present+ * @param value the source svg+ * @returns the svg+ */+ _svgCheck(i) {+ if (typeof window > "u" || typeof document > "u" || !window.SVGSVGElement)+ return i;+ if (window.SVGSVGElement && i.search(/(\.svg|\.svg?[?|#].*)$/gi) !== -1 && i.indexOf("#") === i.lastIndexOf("#")) {+ this._isSVG = !0, i = this._sanitizeSVG(i);+ const d = i.split("#")[0], g = i.split("#")[1], y = document.body.querySelector('object[data="' + d + '"]');+ if (y) {+ const M = y.contentDocument;+ if (M && M.documentElement) {+ const N = M.documentElement.getAttribute("viewBox"), O = Number(M.documentElement.getAttribute("width")), F = Number(M.documentElement.getAttribute("height"));+ if (M.getElementById(g) && N && O && F)+ return this._getSVGAttribs(y, g), i;+ }+ y.addEventListener("load", () => {+ this._getSVGAttribs(y, g);+ });+ } else {+ const M = document.createElement("object");+ M.data = d, M.type = "image/svg+xml", M.width = "0%", M.height = "0%", document.body.appendChild(M), M.onload = () => {+ const N = document.body.querySelector('object[data="' + d + '"]');+ N && this._getSVGAttribs(N, g);+ };+ }+ return d;+ } else+ return i;+ }+ /**+ * Sets sourceLeft, sourceTop, sourceWidth, sourceHeight automatically+ * given external svg file and icon id+ * @param svgsrc+ * @param elemid+ */+ _getSVGAttribs(i, d) {+ const g = i.contentDocument;+ if (g && g.documentElement) {+ const y = g.documentElement.getAttribute("viewBox"), M = Number(g.documentElement.getAttribute("width")), N = Number(g.documentElement.getAttribute("height")), O = g.getElementById(d);+ if (y && M && N && O) {+ const F = Number(y.split(" ")[2]), ne = Number(y.split(" ")[3]), $ = O.getBBox();+ let Q = 1, X = 1, he = 0, Me = 0;+ const p = O.transform?.baseVal.consolidate();+ if (p) {+ const De = p.matrix;+ Q = De.a, X = De.d, he = De.e, Me = De.f;+ }+ this.sourceLeft = (Q * $.x + he) * M / F, this.sourceTop = (X * $.y + Me) * N / ne, this.sourceWidth = $.width * Q * (M / F), this.sourceHeight = $.height * X * (N / ne), this._svgAttributesComputationCompleted = !0, this.onSVGAttributesComputedObservable.notifyObservers(this);+ }+ }+ }+ /**+ * Gets or sets the cell width to use when animation sheet is enabled+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image+ */+ get cellWidth() {+ return this._cellWidth;+ }+ set cellWidth(i) {+ this._cellWidth !== i && (this._cellWidth = i, this._markAsDirty());+ }+ /**+ * Gets or sets the cell height to use when animation sheet is enabled+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image+ */+ get cellHeight() {+ return this._cellHeight;+ }+ set cellHeight(i) {+ this._cellHeight !== i && (this._cellHeight = i, this._markAsDirty());+ }+ /**+ * Gets or sets the cell id to use (this will turn on the animation sheet mode)+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image+ */+ get cellId() {+ return this._cellId;+ }+ set cellId(i) {+ this._cellId !== i && (this._cellId = i, this._markAsDirty());+ }+ /**+ * Creates a new Image+ * @param name defines the control name+ * @param url defines the image url+ */+ constructor(i, d = null) {+ super(i), this.name = i, this._workingCanvas = null, this._loaded = !1, this._stretch = Ft.STRETCH_FILL, this._source = null, this._autoScale = !1, this._sourceLeft = 0, this._sourceTop = 0, this._sourceWidth = 0, this._sourceHeight = 0, this._svgAttributesComputationCompleted = !1, this._isSVG = !1, this._cellWidth = 0, this._cellHeight = 0, this._cellId = -1, this._populateNinePatchSlicesFromImage = !1, this._imageDataCache = { data: null, key: "" }, this.onImageLoadedObservable = new qt(), this.onSVGAttributesComputedObservable = new qt(), this.source = d;+ }+ /**+ * Tests if a given coordinates belong to the current control+ * @param x defines x coordinate to test+ * @param y defines y coordinate to test+ * @returns true if the coordinates are inside the control+ */+ contains(i, d) {+ if (!super.contains(i, d))+ return !1;+ if (!this._detectPointerOnOpaqueOnly || !this._workingCanvas)+ return !0;+ const g = this._currentMeasure.width | 0, y = this._currentMeasure.height | 0, M = g + "_" + y;+ let N = this._imageDataCache.data;+ if (!N || this._imageDataCache.key !== M) {+ const ne = this._workingCanvas.getContext("2d");+ this._imageDataCache.data = N = ne.getImageData(0, 0, g, y).data, this._imageDataCache.key = M;+ }+ return i = i - this._currentMeasure.left | 0, d = d - this._currentMeasure.top | 0, N[(i + d * g) * 4 + 3] > 0;+ }+ _getTypeName() {+ return "Image";+ }+ /** Force the control to synchronize with its content */+ synchronizeSizeWithContent() {+ this._loaded && (this.width = this._domImage.width + "px", this.height = this._domImage.height + "px");+ }+ _processMeasures(i, d) {+ if (this._loaded)+ switch (this._stretch) {+ case Ft.STRETCH_NONE:+ break;+ case Ft.STRETCH_FILL:+ break;+ case Ft.STRETCH_UNIFORM:+ break;+ case Ft.STRETCH_NINE_PATCH:+ break;+ case Ft.STRETCH_EXTEND:+ this._autoScale && this.synchronizeSizeWithContent(), this.parent && this.parent.parent && (this.parent.adaptWidthToChildren = !0, this.parent.adaptHeightToChildren = !0);+ break;+ }+ super._processMeasures(i, d);+ }+ _prepareWorkingCanvasForOpaqueDetection() {+ if (!this._detectPointerOnOpaqueOnly)+ return;+ const i = this._currentMeasure.width, d = this._currentMeasure.height;+ if (!this._workingCanvas) {+ const M = this._host?.getScene()?.getEngine() || md.LastCreatedEngine;+ if (!M)+ throw new Error("Invalid engine. Unable to create a canvas.");+ this._workingCanvas = M.createCanvas(i, d);+ }+ this._workingCanvas.getContext("2d").clearRect(0, 0, i, d);+ }+ _drawImage(i, d, g, y, M, N, O, F, ne) {+ if (i.drawImage(this._domImage, d, g, y, M, N, O, F, ne), !this._detectPointerOnOpaqueOnly)+ return;+ const $ = i.getTransform(), X = this._workingCanvas.getContext("2d");+ X.save();+ const he = N - this._currentMeasure.left, Me = O - this._currentMeasure.top;+ X.setTransform($.a, $.b, $.c, $.d, (he + F) / 2, (Me + ne) / 2), X.translate(-(he + F) / 2, -(Me + ne) / 2), X.drawImage(this._domImage, d, g, y, M, he, Me, F, ne), X.restore();+ }+ _draw(i) {+ i.save(), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio);+ let d, g, y, M;+ if (this.cellId == -1)+ d = this._sourceLeft, g = this._sourceTop, y = this._sourceWidth ? this._sourceWidth : this._imageWidth, M = this._sourceHeight ? this._sourceHeight : this._imageHeight;+ else {+ const N = this._domImage.naturalWidth / this.cellWidth, O = this.cellId / N >> 0, F = this.cellId % N;+ d = this.cellWidth * F, g = this.cellHeight * O, y = this.cellWidth, M = this.cellHeight;+ }+ if (this._prepareWorkingCanvasForOpaqueDetection(), this._applyStates(i), this._loaded)+ switch (this._stretch) {+ case Ft.STRETCH_NONE:+ this._drawImage(i, d, g, y, M, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);+ break;+ case Ft.STRETCH_FILL:+ this._drawImage(i, d, g, y, M, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);+ break;+ case Ft.STRETCH_UNIFORM: {+ const N = this._currentMeasure.width / y, O = this._currentMeasure.height / M, F = Math.min(N, O), ne = (this._currentMeasure.width - y * F) / 2, $ = (this._currentMeasure.height - M * F) / 2;+ this._drawImage(i, d, g, y, M, this._currentMeasure.left + ne, this._currentMeasure.top + $, y * F, M * F);+ break;+ }+ case Ft.STRETCH_EXTEND:+ this._drawImage(i, d, g, y, M, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);+ break;+ case Ft.STRETCH_NINE_PATCH:+ this._renderNinePatch(i, d, g, y, M);+ break;+ }+ i.restore();+ }+ _renderNinePatch(i, d, g, y, M) {+ const N = this.host.idealRatio, O = this._sliceLeft, F = this._sliceTop, ne = M - this._sliceBottom, $ = y - this._sliceRight, Q = this._sliceRight - this._sliceLeft, X = this._sliceBottom - this._sliceTop, he = Math.round(O * N), Me = Math.round(F * N), p = Math.round(ne * N), De = Math.round($ * N), Ke = Math.round(this._currentMeasure.width) - De - he + 2, oe = Math.round(this._currentMeasure.height) - p - Me + 2, Bt = Math.round(this._currentMeasure.left) + he - 1, xe = Math.round(this._currentMeasure.top) + Me - 1, yt = Math.round(this._currentMeasure.left + this._currentMeasure.width) - De, at = Math.round(this._currentMeasure.top + this._currentMeasure.height) - p;+ this._drawImage(i, d, g, O, F, this._currentMeasure.left, this._currentMeasure.top, he, Me), this._drawImage(i, d + this._sliceLeft, g, Q, F, Bt + 1, this._currentMeasure.top, Ke - 2, Me), this._drawImage(i, d + this._sliceRight, g, $, F, yt, this._currentMeasure.top, De, Me), this._drawImage(i, d, g + this._sliceTop, O, X, this._currentMeasure.left, xe + 1, he, oe - 2), this._drawImage(i, d + this._sliceLeft, g + this._sliceTop, Q, X, Bt + 1, xe + 1, Ke - 2, oe - 2), this._drawImage(i, d + this._sliceRight, g + this._sliceTop, $, X, yt, xe + 1, De, oe - 2), this._drawImage(i, d, g + this._sliceBottom, O, ne, this._currentMeasure.left, at, he, p), this._drawImage(i, d + this.sliceLeft, g + this._sliceBottom, Q, ne, Bt + 1, at, Ke - 2, p), this._drawImage(i, d + this._sliceRight, g + this._sliceBottom, $, ne, yt, at, De, p);+ }+ dispose() {+ super.dispose(), this.onImageLoadedObservable.clear(), this.onSVGAttributesComputedObservable.clear(), this._removeCacheUsage(this._source);+ }+}+Ft.SourceImgCache = /* @__PURE__ */ new Map();+Ft.STRETCH_NONE = 0;+Ft.STRETCH_FILL = 1;+Ft.STRETCH_UNIFORM = 2;+Ft.STRETCH_EXTEND = 3;+Ft.STRETCH_NINE_PATCH = 4;+q([+ H()+], Ft.prototype, "detectPointerOnOpaqueOnly", null);+q([+ H()+], Ft.prototype, "sliceLeft", null);+q([+ H()+], Ft.prototype, "sliceRight", null);+q([+ H()+], Ft.prototype, "sliceTop", null);+q([+ H()+], Ft.prototype, "sliceBottom", null);+q([+ H()+], Ft.prototype, "sourceLeft", null);+q([+ H()+], Ft.prototype, "sourceTop", null);+q([+ H()+], Ft.prototype, "sourceWidth", null);+q([+ H()+], Ft.prototype, "sourceHeight", null);+q([+ H()+], Ft.prototype, "populateNinePatchSlicesFromImage", null);+q([+ H()+], Ft.prototype, "autoScale", null);+q([+ H()+], Ft.prototype, "stretch", null);+q([+ H()+], Ft.prototype, "source", null);+q([+ H()+], Ft.prototype, "cellWidth", null);+q([+ H()+], Ft.prototype, "cellHeight", null);+q([+ H()+], Ft.prototype, "cellId", null);+kr("BABYLON.GUI.Image", Ft);+class Bs extends si {+ /**+ * Returns the image part of the button (if any)+ */+ get image() {+ return this._image;+ }+ /**+ * Returns the TextBlock part of the button (if any)+ */+ get textBlock() {+ return this._textBlock;+ }+ /**+ * Creates a new Button+ * @param name defines the name of the button+ */+ constructor(i) {+ super(i), this.name = i, this.thickness = 1, this.isPointerBlocker = !0;+ let d = null;+ this.pointerEnterAnimation = () => {+ d = this.alpha, this.alpha -= 0.1;+ }, this.pointerOutAnimation = () => {+ d !== null && (this.alpha = d);+ }, this.pointerDownAnimation = () => {+ this.scaleX -= 0.05, this.scaleY -= 0.05;+ }, this.pointerUpAnimation = () => {+ this.scaleX += 0.05, this.scaleY += 0.05;+ };+ }+ _getTypeName() {+ return "Button";+ }+ // While being a container, the button behaves like a control.+ /**+ * @internal+ */+ _processPicking(i, d, g, y, M, N, O, F) {+ if (!this._isEnabled || !this.isHitTestVisible || !this.isVisible || this.notRenderable || !super.contains(i, d))+ return !1;+ if (this.delegatePickingToChildren) {+ let ne = !1;+ for (let $ = this._children.length - 1; $ >= 0; $--) {+ const Q = this._children[$];+ if (Q.isEnabled && Q.isHitTestVisible && Q.isVisible && !Q.notRenderable && Q.contains(i, d)) {+ ne = !0;+ break;+ }+ }+ if (!ne)+ return !1;+ }+ return this._processObservables(y, i, d, g, M, N, O, F), !0;+ }+ /**+ * @internal+ */+ _onPointerEnter(i, d) {+ return super._onPointerEnter(i, d) ? (!this.isReadOnly && this.pointerEnterAnimation && this.pointerEnterAnimation(), !0) : !1;+ }+ /**+ * @internal+ */+ _onPointerOut(i, d, g = !1) {+ !this.isReadOnly && this.pointerOutAnimation && this.pointerOutAnimation(), super._onPointerOut(i, d, g);+ }+ /**+ * @internal+ */+ _onPointerDown(i, d, g, y, M) {+ return super._onPointerDown(i, d, g, y, M) ? (!this.isReadOnly && this.pointerDownAnimation && this.pointerDownAnimation(), !0) : !1;+ }+ _getRectangleFill(i) {+ return this.isEnabled ? this._getBackgroundColor(i) : this._disabledColor;+ }+ /**+ * @internal+ */+ _onPointerUp(i, d, g, y, M, N) {+ !this.isReadOnly && this.pointerUpAnimation && this.pointerUpAnimation(), super._onPointerUp(i, d, g, y, M, N);+ }+ /**+ * Serializes the current button+ * @param serializationObject defines the JSON serialized object+ * @param force force serialization even if isSerializable === false+ * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize+ */+ serialize(i, d, g) {+ super.serialize(i, d, g), !(!this.isSerializable && !d) && (this._textBlock && (i.textBlockName = this._textBlock.name), this._image && (i.imageName = this._image.name));+ }+ /**+ * @internal+ */+ _parseFromContent(i, d) {+ super._parseFromContent(i, d), i.textBlockName && (this._textBlock = this.getChildByName(i.textBlockName)), i.imageName && (this._image = this.getChildByName(i.imageName));+ }+ // Statics+ /**+ * Creates a new button made with an image and a text+ * @param name defines the name of the button+ * @param text defines the text of the button+ * @param imageUrl defines the url of the image+ * @returns a new Button+ */+ static CreateImageButton(i, d, g) {+ const y = new this(i), M = new zr(i + "_button", d);+ M.textWrapping = !0, M.textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_CENTER, M.paddingLeft = "20%", y.addControl(M);+ const N = new Ft(i + "_icon", g);+ return N.width = "20%", N.stretch = Ft.STRETCH_UNIFORM, N.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, y.addControl(N), y._image = N, y._textBlock = M, y;+ }+ /**+ * Creates a new button made with an image+ * @param name defines the name of the button+ * @param imageUrl defines the url of the image+ * @returns a new Button+ */+ static CreateImageOnlyButton(i, d) {+ const g = new this(i), y = new Ft(i + "_icon", d);+ return y.stretch = Ft.STRETCH_FILL, y.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, g.addControl(y), g._image = y, g;+ }+ /**+ * Creates a new button made with a text+ * @param name defines the name of the button+ * @param text defines the text of the button+ * @returns a new Button+ */+ static CreateSimpleButton(i, d) {+ const g = new this(i), y = new zr(i + "_button", d);+ return y.textWrapping = !0, y.textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_CENTER, g.addControl(y), g._textBlock = y, g;+ }+ /**+ * Creates a new button made with an image and a centered text+ * @param name defines the name of the button+ * @param text defines the text of the button+ * @param imageUrl defines the url of the image+ * @returns a new Button+ */+ static CreateImageWithCenterTextButton(i, d, g) {+ const y = new this(i), M = new Ft(i + "_icon", g);+ M.stretch = Ft.STRETCH_FILL, y.addControl(M);+ const N = new zr(i + "_button", d);+ return N.textWrapping = !0, N.textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_CENTER, y.addControl(N), y._image = M, y._textBlock = N, y;+ }+}+kr("BABYLON.GUI.Button", Bs);+class Gi extends wi {+ /** Gets or sets a boolean indicating if the stack panel is vertical or horizontal*/+ get isVertical() {+ return this._isVertical;+ }+ set isVertical(i) {+ this._isVertical !== i && (this._isVertical = i, this._markAsDirty());+ }+ /**+ * Gets or sets the spacing (in pixels) between each child.+ */+ get spacing() {+ return this._spacing;+ }+ set spacing(i) {+ this._spacing !== i && (this._spacing = i, this._markAsDirty());+ }+ /**+ * Gets or sets panel width.+ * This value should not be set when in horizontal mode as it will be computed automatically+ */+ set width(i) {+ this._doNotTrackManualChanges || (this._manualWidth = !0), this._width.toString(this._host) !== i && this._width.fromString(i) && this._markAsDirty();+ }+ get width() {+ return this._width.toString(this._host);+ }+ /**+ * Gets or sets panel height.+ * This value should not be set when in vertical mode as it will be computed automatically+ */+ set height(i) {+ this._doNotTrackManualChanges || (this._manualHeight = !0), this._height.toString(this._host) !== i && this._height.fromString(i) && this._markAsDirty();+ }+ get height() {+ return this._height.toString(this._host);+ }+ /**+ * Creates a new StackPanel+ * @param name defines control name+ */+ constructor(i) {+ super(i), this.name = i, this._isVertical = !0, this._manualWidth = !1, this._manualHeight = !1, this._doNotTrackManualChanges = !1, this._spacing = 0, this.ignoreLayoutWarnings = !1;+ }+ _getTypeName() {+ return "StackPanel";+ }+ /**+ * @internal+ */+ _preMeasure(i, d) {+ for (const g of this._children)+ this._isVertical ? g.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP : g.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT;+ super._preMeasure(i, d);+ }+ _additionalProcessing(i, d) {+ super._additionalProcessing(i, d), this._measureForChildren.copyFrom(i), this._measureForChildren.left = this._currentMeasure.left, this._measureForChildren.top = this._currentMeasure.top, (!this.isVertical || this._manualWidth) && (this._measureForChildren.width = this._currentMeasure.width), (this.isVertical || this._manualHeight) && (this._measureForChildren.height = this._currentMeasure.height);+ }+ _postMeasure() {+ let i = 0, d = 0;+ const g = this._children.length, y = this._spacing * this._host.idealRatio;+ for (let O = 0; O < g; O++) {+ const F = this._children[O];+ if (!(!F.isVisible || F.notRenderable))+ if (this._isVertical) {+ const ne = d + "px";+ F.top !== ne && (F.top = ne, this._rebuildLayout = !0, F._top.ignoreAdaptiveScaling = !0), !this.ignoreLayoutWarnings && !F.isDimensionFullyDefined("height") ? zh.Warn(`Control (Name:${F.name}, UniqueId:${F.uniqueId}) is using height in percentage mode inside a vertical StackPanel`, 1) : d += F._currentMeasure.height + F._paddingTopInPixels + F._paddingBottomInPixels + (O < g - 1 ? y : 0);+ } else {+ const ne = i + "px";+ F.left !== ne && (F.left = ne, this._rebuildLayout = !0, F._left.ignoreAdaptiveScaling = !0), !this.ignoreLayoutWarnings && !F.isDimensionFullyDefined("width") ? zh.Warn(`Control (Name:${F.name}, UniqueId:${F.uniqueId}) is using width in percentage mode inside a horizontal StackPanel`, 1) : i += F._currentMeasure.width + F._paddingLeftInPixels + F._paddingRightInPixels + (O < g - 1 ? y : 0);+ }+ }+ i += this._paddingLeftInPixels + this._paddingRightInPixels, d += this._paddingTopInPixels + this._paddingBottomInPixels, this._doNotTrackManualChanges = !0;+ let M = !1, N = !1;+ if ((!this._manualHeight || this.adaptHeightToChildren) && this._isVertical) {+ const O = this.height;+ this.height = d + "px", N = O !== this.height || !this._height.ignoreAdaptiveScaling;+ }+ if ((!this._manualWidth || this.adaptWidthToChildren) && !this._isVertical) {+ const O = this.width;+ this.width = i + "px", M = O !== this.width || !this._width.ignoreAdaptiveScaling;+ }+ N && (this._height.ignoreAdaptiveScaling = !0), M && (this._width.ignoreAdaptiveScaling = !0), this._doNotTrackManualChanges = !1, (M || N) && (this._rebuildLayout = !0), super._postMeasure();+ }+ _getManualDim(i) {+ return i === "width" ? this._manualWidth : this._manualHeight;+ }+ isDimensionFullyDefined(i) {+ if (i === "height" ? this.isVertical : !this.isVertical && !this._getManualDim(i)) {+ for (const d of this._children)+ if (!d.isDimensionFullyDefined(i))+ return !1;+ return !0;+ }+ return this.getDimension(i).isPixel || this._getAdaptDimTo(i);+ }+ /**+ * Serializes the current control+ * @param serializationObject defined the JSON serialized object+ * @param force force serialization even if isSerializable === false+ * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize+ */+ serialize(i, d, g) {+ super.serialize(i, d, g), !(!this.isSerializable && !d) && (i.manualWidth = this._manualWidth, i.manualHeight = this._manualHeight);+ }+ /**+ * @internal+ */+ _parseFromContent(i, d) {+ this._manualWidth = i.manualWidth, this._manualHeight = i.manualHeight, super._parseFromContent(i, d);+ }+}+q([+ H()+], Gi.prototype, "ignoreLayoutWarnings", void 0);+q([+ H()+], Gi.prototype, "isVertical", null);+q([+ H()+], Gi.prototype, "spacing", null);+q([+ H()+], Gi.prototype, "width", null);+q([+ H()+], Gi.prototype, "height", null);+kr("BABYLON.GUI.StackPanel", Gi);+class pc extends pe {+ /** Gets or sets border thickness */+ get thickness() {+ return this._thickness;+ }+ set thickness(i) {+ this._thickness !== i && (this._thickness = i, this._markAsDirty());+ }+ /** Gets or sets a value indicating the ratio between overall size and check size */+ get checkSizeRatio() {+ return this._checkSizeRatio;+ }+ set checkSizeRatio(i) {+ i = Math.max(Math.min(1, i), 0), this._checkSizeRatio !== i && (this._checkSizeRatio = i, this._markAsDirty());+ }+ /** Gets or sets background color */+ get background() {+ return this._background;+ }+ set background(i) {+ this._background !== i && (this._background = i, this._markAsDirty());+ }+ /** Gets or sets a boolean indicating if the checkbox is checked or not */+ get isChecked() {+ return this._isChecked;+ }+ set isChecked(i) {+ this._isChecked !== i && (this._isChecked = i, this._markAsDirty(), this.onIsCheckedChangedObservable.notifyObservers(i));+ }+ /**+ * Creates a new CheckBox+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._isChecked = !1, this._background = "black", this._checkSizeRatio = 0.8, this._thickness = 1, this.onIsCheckedChangedObservable = new qt(), this.isPointerBlocker = !0;+ }+ _getTypeName() {+ return "Checkbox";+ }+ /**+ * @internal+ */+ _draw(i) {+ i.save(), this._applyStates(i);+ const d = this._currentMeasure.width - this._thickness, g = this._currentMeasure.height - this._thickness;+ if ((this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), i.fillStyle = this._isEnabled ? this._background : this._disabledColor, i.fillRect(this._currentMeasure.left + this._thickness / 2, this._currentMeasure.top + this._thickness / 2, d, g), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), this._isChecked) {+ i.fillStyle = this._isEnabled ? this.color ? this.color : "#ffffff" : this._disabledColorItem;+ const y = d * this._checkSizeRatio, M = g * this._checkSizeRatio;+ i.fillRect(this._currentMeasure.left + this._thickness / 2 + (d - y) / 2, this._currentMeasure.top + this._thickness / 2 + (g - M) / 2, y, M);+ }+ i.strokeStyle = this.color, i.lineWidth = this._thickness, i.strokeRect(this._currentMeasure.left + this._thickness / 2, this._currentMeasure.top + this._thickness / 2, d, g), i.restore();+ }+ // Events+ /**+ * @internal+ */+ _onPointerDown(i, d, g, y, M) {+ return super._onPointerDown(i, d, g, y, M) ? (this.isReadOnly || (this.isChecked = !this.isChecked), !0) : !1;+ }+ /**+ * Utility function to easily create a checkbox with a header+ * @param title defines the label to use for the header+ * @param onValueChanged defines the callback to call when value changes+ * @returns a StackPanel containing the checkbox and a textBlock+ */+ static AddCheckBoxWithHeader(i, d) {+ const g = new Gi();+ g.isVertical = !1, g.height = "30px";+ const y = new pc();+ y.width = "20px", y.height = "20px", y.isChecked = !0, y.color = "green", y.onIsCheckedChangedObservable.add(d), g.addControl(y);+ const M = new zr();+ return M.text = i, M.width = "180px", M.paddingLeft = "5px", M.textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, M.color = "white", g.addControl(M), g;+ }+}+q([+ H()+], pc.prototype, "thickness", null);+q([+ H()+], pc.prototype, "checkSizeRatio", null);+q([+ H()+], pc.prototype, "background", null);+q([+ H()+], pc.prototype, "isChecked", null);+kr("BABYLON.GUI.Checkbox", pc);+class Ab {+ get text() {+ return this._characters ? this._characters.join("") : this._text;+ }+ set text(i) {+ this._text = i, this._characters = Array.from && Array.from(i);+ }+ get length() {+ return this._characters ? this._characters.length : this._text.length;+ }+ removePart(i, d, g) {+ if (this._text = this._text.slice(0, i) + (g || "") + this._text.slice(d), this._characters) {+ const y = g ? Array.from(g) : [];+ this._characters.splice(i, d - i, ...y);+ }+ }+ charAt(i) {+ return this._characters ? this._characters[i] : this._text.charAt(i);+ }+ substr(i, d) {+ if (this._characters) {+ isNaN(i) ? i = 0 : i >= 0 ? i = Math.min(i, this._characters.length) : i = this._characters.length + Math.max(i, -this._characters.length), d === void 0 ? d = this._characters.length - i : (isNaN(d) || d < 0) && (d = 0);+ const g = [];+ for (; --d >= 0; )+ g[d] = this._characters[i + d];+ return g.join("");+ }+ return this._text.substring(i, d ? d + i : void 0);+ }+ substring(i, d) {+ if (this._characters) {+ isNaN(i) ? i = 0 : i > this._characters.length ? i = this._characters.length : i < 0 && (i = 0), d === void 0 ? d = this._characters.length : isNaN(d) ? d = 0 : d > this._characters.length ? d = this._characters.length : d < 0 && (d = 0);+ const g = [];+ let y = 0;+ for (; i < d; )+ g[y++] = this._characters[i++];+ return g.join("");+ }+ return this._text.substring(i, d);+ }+ isWord(i) {+ const d = /\w/g;+ return this._characters ? this._characters[i].search(d) !== -1 : this._text.search(d) !== -1;+ }+}+class bo extends pe {+ /**+ * Gets or sets outlineWidth of the text to display+ */+ get outlineWidth() {+ return this._outlineWidth;+ }+ set outlineWidth(i) {+ this._outlineWidth !== i && (this._outlineWidth = i, this._markAsDirty());+ }+ /**+ * Gets or sets outlineColor of the text to display+ */+ get outlineColor() {+ return this._outlineColor;+ }+ set outlineColor(i) {+ this._outlineColor !== i && (this._outlineColor = i, this._markAsDirty());+ }+ /** Gets or sets the maximum width allowed by the control */+ get maxWidth() {+ return this._maxWidth.toString(this._host);+ }+ /** Gets the maximum width allowed by the control in pixels */+ get maxWidthInPixels() {+ return this._maxWidth.getValueInPixel(this._host, this._cachedParentMeasure.width);+ }+ set maxWidth(i) {+ this._maxWidth.toString(this._host) !== i && this._maxWidth.fromString(i) && this._markAsDirty();+ }+ /**+ * Gets or sets the text highlighter transparency; default: 0.4+ * @deprecated Please use highlighterOpacity instead+ */+ get highligherOpacity() {+ return this.highlighterOpacity;+ }+ set highligherOpacity(i) {+ this.highlighterOpacity = i;+ }+ /**+ * Gets or sets the text highlighter transparency; default: 0.4+ */+ get highlighterOpacity() {+ return this._highlighterOpacity;+ }+ set highlighterOpacity(i) {+ this._highlighterOpacity !== i && (this._highlighterOpacity = i, this._markAsDirty());+ }+ /** Gets or sets a boolean indicating whether to select complete text by default on input focus */+ get onFocusSelectAll() {+ return this._onFocusSelectAll;+ }+ set onFocusSelectAll(i) {+ this._onFocusSelectAll !== i && (this._onFocusSelectAll = i, this._markAsDirty());+ }+ /** Gets or sets the text hightlight color */+ get textHighlightColor() {+ return this._textHighlightColor;+ }+ set textHighlightColor(i) {+ this._textHighlightColor !== i && (this._textHighlightColor = i, this._markAsDirty());+ }+ /** Gets or sets control margin */+ get margin() {+ return this._margin.toString(this._host);+ }+ /** Gets control margin in pixels */+ get marginInPixels() {+ return this._margin.getValueInPixel(this._host, this._cachedParentMeasure.width);+ }+ set margin(i) {+ this._margin.toString(this._host) !== i && this._margin.fromString(i) && this._markAsDirty();+ }+ /** Gets or sets a boolean indicating if the control can auto stretch its width to adapt to the text */+ get autoStretchWidth() {+ return this._autoStretchWidth;+ }+ set autoStretchWidth(i) {+ this._autoStretchWidth !== i && (this._autoStretchWidth = i, this._markAsDirty());+ }+ /** Gets or sets border thickness */+ get thickness() {+ return this._thickness;+ }+ set thickness(i) {+ this._thickness !== i && (this._thickness = i, this._markAsDirty());+ }+ /** Gets or sets the background color when focused */+ get focusedBackground() {+ return this._focusedBackground;+ }+ set focusedBackground(i) {+ this._focusedBackground !== i && (this._focusedBackground = i, this._markAsDirty());+ }+ /** Gets or sets the background color when focused */+ set focusedColor(i) {+ this._focusedColor !== i && (this._focusedColor = i, this._markAsDirty());+ }+ /** Gets or sets the background color */+ get background() {+ return this._background;+ }+ set background(i) {+ this._background !== i && (this._background = i, this._markAsDirty());+ }+ /** Gets or sets the placeholder color */+ get placeholderColor() {+ return this._placeholderColor;+ }+ set placeholderColor(i) {+ this._placeholderColor !== i && (this._placeholderColor = i, this._markAsDirty());+ }+ /** Gets or sets the text displayed when the control is empty */+ get placeholderText() {+ return this._placeholderText;+ }+ set placeholderText(i) {+ this._placeholderText !== i && (this._placeholderText = i, this._markAsDirty());+ }+ /** Gets or sets the dead key. 0 to disable. */+ get deadKey() {+ return this._deadKey;+ }+ set deadKey(i) {+ this._deadKey = i;+ }+ /** Gets or sets the highlight text */+ get highlightedText() {+ return this._highlightedText;+ }+ set highlightedText(i) {+ this._highlightedText !== i && (this._highlightedText = i, this._markAsDirty());+ }+ /** Gets or sets if the current key should be added */+ get addKey() {+ return this._addKey;+ }+ set addKey(i) {+ this._addKey = i;+ }+ /** Gets or sets the value of the current key being entered */+ get currentKey() {+ return this._currentKey;+ }+ set currentKey(i) {+ this._currentKey = i;+ }+ /** Gets or sets the text displayed in the control */+ get text() {+ return this._textWrapper.text;+ }+ set text(i) {+ const d = i.toString();+ this._textWrapper || (this._textWrapper = new Ab()), this._textWrapper.text !== d && (this._textWrapper.text = d, this._textHasChanged());+ }+ _textHasChanged() {+ this._markAsDirty(), this.onTextChangedObservable.notifyObservers(this);+ }+ _applyStates(i) {+ super._applyStates(i), this.outlineWidth && (i.lineWidth = this.outlineWidth, i.strokeStyle = this.outlineColor);+ }+ /** Gets or sets control width */+ get width() {+ return this._width.toString(this._host);+ }+ set width(i) {+ this._width.toString(this._host) === i && !this._autoStretchWidth || (this._width.fromString(i) && this._markAsDirty(), this.autoStretchWidth = !1);+ }+ /**+ * Creates a new InputText+ * @param name defines the control name+ * @param text defines the text of the control+ */+ constructor(i, d = "") {+ super(i), this.name = i, this._placeholderText = "", this._background = "#222222", this._focusedBackground = "#000000", this._placeholderColor = "gray", this._thickness = 1, this._margin = new St(10, St.UNITMODE_PIXEL), this._autoStretchWidth = !0, this._maxWidth = new St(1, St.UNITMODE_PERCENTAGE, !1), this._blinkIsEven = !1, this._cursorOffset = 0, this._deadKey = !1, this._addKey = !0, this._currentKey = "", this._isTextHighlightOn = !1, this._textHighlightColor = "#d5e0ff", this._highlighterOpacity = 0.4, this._highlightedText = "", this._startHighlightIndex = 0, this._endHighlightIndex = 0, this._cursorIndex = -1, this._outlineWidth = 0, this._outlineColor = "white", this._onFocusSelectAll = !1, this._isPointerDown = !1, this.promptMessage = "Please enter text:", this.disableMobilePrompt = !1, this.onTextChangedObservable = new qt(), this.onBeforeKeyAddObservable = new qt(), this.onTextHighlightObservable = new qt(), this.onTextCopyObservable = new qt(), this.onTextCutObservable = new qt(), this.onTextPasteObservable = new qt(), this.text = d, this.isPointerBlocker = !0, this._focusedColor = "white";+ }+ /** @internal */+ onBlur() {+ this._isFocused = !1, this._scrollLeft = null, this._cursorOffset = 0, clearTimeout(this._blinkTimeout), this._markAsDirty(), this.onBlurObservable.notifyObservers(this), this._host.unRegisterClipboardEvents(), this._onClipboardObserver && this._host.onClipboardObservable.remove(this._onClipboardObserver);+ const i = this._host.getScene();+ this._onPointerDblTapObserver && i && i.onPointerObservable.remove(this._onPointerDblTapObserver);+ }+ /** @internal */+ onFocus() {+ if (!this._isEnabled)+ return;+ if (this._scrollLeft = null, this._isFocused = !0, this._blinkIsEven = !1, this._cursorOffset = 0, this._markAsDirty(), this.onFocusObservable.notifyObservers(this), this._focusedBy === "touch" && !this.disableMobilePrompt) {+ const d = prompt(this.promptMessage);+ d !== null && (this.text = d), this._host.focusedControl = null;+ return;+ }+ this._host.registerClipboardEvents(), this._onClipboardObserver = this._host.onClipboardObservable.add((d) => {+ switch (d.type) {+ case Ih.COPY:+ this._onCopyText(d.event), this.onTextCopyObservable.notifyObservers(this);+ break;+ case Ih.CUT:+ this._onCutText(d.event), this.onTextCutObservable.notifyObservers(this);+ break;+ case Ih.PASTE:+ this._onPasteText(d.event), this.onTextPasteObservable.notifyObservers(this);+ break;+ default:+ return;+ }+ });+ const i = this._host.getScene();+ i && (this._onPointerDblTapObserver = i.onPointerObservable.add((d) => {+ this._isFocused && d.type === Ir.POINTERDOUBLETAP && this._processDblClick(d);+ })), this._onFocusSelectAll && this.selectAllText();+ }+ _getTypeName() {+ return "InputText";+ }+ /**+ * Function called to get the list of controls that should not steal the focus from this control+ * @returns an array of controls+ */+ keepsFocusWith() {+ return this._connectedVirtualKeyboard ? [this._connectedVirtualKeyboard] : null;+ }+ /**+ * @internal+ */+ processKey(i, d, g) {+ if (!this.isReadOnly && !(g && (g.ctrlKey || g.metaKey) && (i === 67 || i === 86 || i === 88))) {+ if (g && (g.ctrlKey || g.metaKey) && i === 65) {+ this.selectAllText(), g.preventDefault();+ return;+ }+ switch (i) {+ case 32:+ d = " ";+ break;+ case 191:+ g && g.preventDefault();+ break;+ case 8:+ if (this._textWrapper.text && this._textWrapper.length > 0) {+ if (this.isTextHighlightOn) {+ this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex), this._textHasChanged(), this.isTextHighlightOn = !1, this._cursorOffset = this._textWrapper.length - this._startHighlightIndex, this._blinkIsEven = !1, g && g.preventDefault();+ return;+ }+ if (this._cursorOffset === 0)+ this.text = this._textWrapper.substring(0, this._textWrapper.length - 1);+ else {+ const y = this._textWrapper.length - this._cursorOffset;+ y > 0 && (this._textWrapper.removePart(y - 1, y), this._textHasChanged());+ }+ }+ g && g.preventDefault();+ return;+ case 46:+ if (this.isTextHighlightOn) {+ this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex), this._textHasChanged(), this.isTextHighlightOn = !1, this._cursorOffset = this._textWrapper.length - this._startHighlightIndex, g && g.preventDefault();+ return;+ }+ if (this._textWrapper.text && this._textWrapper.length > 0 && this._cursorOffset > 0) {+ const y = this._textWrapper.length - this._cursorOffset;+ this._textWrapper.removePart(y, y + 1), this._textHasChanged(), this._cursorOffset--;+ }+ g && g.preventDefault();+ return;+ case 13:+ this._host.focusedControl = null, this.isTextHighlightOn = !1;+ return;+ case 35:+ this._cursorOffset = 0, this._blinkIsEven = !1, this.isTextHighlightOn = !1, this._markAsDirty();+ return;+ case 36:+ this._cursorOffset = this._textWrapper.length, this._blinkIsEven = !1, this.isTextHighlightOn = !1, this._markAsDirty();+ return;+ case 37:+ if (this._cursorOffset++, this._cursorOffset > this._textWrapper.length && (this._cursorOffset = this._textWrapper.length), g && g.shiftKey) {+ if (this._blinkIsEven = !1, g.ctrlKey || g.metaKey) {+ if (!this.isTextHighlightOn) {+ if (this._textWrapper.length === this._cursorOffset)+ return;+ this._endHighlightIndex = this._textWrapper.length - this._cursorOffset + 1;+ }+ this._startHighlightIndex = 0, this._cursorIndex = this._textWrapper.length - this._endHighlightIndex, this._cursorOffset = this._textWrapper.length, this.isTextHighlightOn = !0, this._markAsDirty();+ return;+ }+ this.isTextHighlightOn ? this._cursorIndex === -1 && (this._cursorIndex = this._textWrapper.length - this._endHighlightIndex, this._cursorOffset = this._startHighlightIndex === 0 ? this._textWrapper.length : this._textWrapper.length - this._startHighlightIndex + 1) : (this.isTextHighlightOn = !0, this._cursorIndex = this._cursorOffset >= this._textWrapper.length ? this._textWrapper.length : this._cursorOffset - 1), this._cursorIndex < this._cursorOffset ? (this._endHighlightIndex = this._textWrapper.length - this._cursorIndex, this._startHighlightIndex = this._textWrapper.length - this._cursorOffset) : this._cursorIndex > this._cursorOffset ? (this._endHighlightIndex = this._textWrapper.length - this._cursorOffset, this._startHighlightIndex = this._textWrapper.length - this._cursorIndex) : this.isTextHighlightOn = !1, this._markAsDirty();+ return;+ }+ this.isTextHighlightOn && (this._cursorOffset = this._textWrapper.length - this._startHighlightIndex, this.isTextHighlightOn = !1), g && (g.ctrlKey || g.metaKey) && (this._cursorOffset = this._textWrapper.length, g.preventDefault()), this._blinkIsEven = !1, this.isTextHighlightOn = !1, this._cursorIndex = -1, this._markAsDirty();+ return;+ case 39:+ if (this._cursorOffset--, this._cursorOffset < 0 && (this._cursorOffset = 0), g && g.shiftKey) {+ if (this._blinkIsEven = !1, g.ctrlKey || g.metaKey) {+ if (!this.isTextHighlightOn) {+ if (this._cursorOffset === 0)+ return;+ this._startHighlightIndex = this._textWrapper.length - this._cursorOffset - 1;+ }+ this._endHighlightIndex = this._textWrapper.length, this.isTextHighlightOn = !0, this._cursorIndex = this._textWrapper.length - this._startHighlightIndex, this._cursorOffset = 0, this._markAsDirty();+ return;+ }+ this.isTextHighlightOn ? this._cursorIndex === -1 && (this._cursorIndex = this._textWrapper.length - this._startHighlightIndex, this._cursorOffset = this._textWrapper.length === this._endHighlightIndex ? 0 : this._textWrapper.length - this._endHighlightIndex - 1) : (this.isTextHighlightOn = !0, this._cursorIndex = this._cursorOffset <= 0 ? 0 : this._cursorOffset + 1), this._cursorIndex < this._cursorOffset ? (this._endHighlightIndex = this._textWrapper.length - this._cursorIndex, this._startHighlightIndex = this._textWrapper.length - this._cursorOffset) : this._cursorIndex > this._cursorOffset ? (this._endHighlightIndex = this._textWrapper.length - this._cursorOffset, this._startHighlightIndex = this._textWrapper.length - this._cursorIndex) : this.isTextHighlightOn = !1, this._markAsDirty();+ return;+ }+ this.isTextHighlightOn && (this._cursorOffset = this._textWrapper.length - this._endHighlightIndex, this.isTextHighlightOn = !1), g && (g.ctrlKey || g.metaKey) && (this._cursorOffset = 0, g.preventDefault()), this._blinkIsEven = !1, this.isTextHighlightOn = !1, this._cursorIndex = -1, this._markAsDirty();+ return;+ }+ if (i === 32 && (d = g?.key ?? " "), this._deadKey = d === "Dead", d && (i === -1 || // Direct access+ i === 32 || // Space+ i === 34 || // " add support for single and double quotes+ i === 39 || // '+ i > 47 && i < 64 || // Numbers+ i > 64 && i < 91 || // Letters+ i > 159 && i < 193 || // Special characters+ i > 218 && i < 223 || // Special characters+ i > 95 && i < 112) && (this._currentKey = d, this.onBeforeKeyAddObservable.notifyObservers(this), d = this._currentKey, this._addKey && !this._deadKey)) {+ if (this.isTextHighlightOn)+ this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex, d), this._textHasChanged(), this._cursorOffset = this._textWrapper.length - (this._startHighlightIndex + 1), this.isTextHighlightOn = !1, this._blinkIsEven = !1, this._markAsDirty();+ else if (this._cursorOffset === 0)+ this.text += this._deadKey && g?.key ? g.key : d;+ else {+ const y = this._textWrapper.length - this._cursorOffset;+ this._textWrapper.removePart(y, y, d), this._textHasChanged();+ }+ g && g.preventDefault();+ }+ }+ }+ /**+ * @internal+ */+ _updateValueFromCursorIndex(i) {+ if (this._blinkIsEven = !1, this._cursorIndex === -1)+ this._cursorIndex = i;+ else if (this._cursorIndex < this._cursorOffset)+ this._endHighlightIndex = this._textWrapper.length - this._cursorIndex, this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;+ else if (this._cursorIndex > this._cursorOffset)+ this._endHighlightIndex = this._textWrapper.length - this._cursorOffset, this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;+ else {+ this.isTextHighlightOn = !1, this._markAsDirty();+ return;+ }+ this.isTextHighlightOn = !0, this._markAsDirty();+ }+ /**+ * @internal+ */+ // eslint-disable-next-line @typescript-eslint/no-unused-vars+ _processDblClick(i) {+ this._startHighlightIndex = this._textWrapper.length - this._cursorOffset, this._endHighlightIndex = this._startHighlightIndex;+ let d, g;+ do+ g = this._endHighlightIndex < this._textWrapper.length && this._textWrapper.isWord(this._endHighlightIndex) ? ++this._endHighlightIndex : 0, d = this._startHighlightIndex > 0 && this._textWrapper.isWord(this._startHighlightIndex - 1) ? --this._startHighlightIndex : 0;+ while (d || g);+ this._cursorOffset = this._textWrapper.length - this._startHighlightIndex, this.isTextHighlightOn = !0, this._clickedCoordinate = null, this._blinkIsEven = !0, this._cursorIndex = -1, this._markAsDirty();+ }+ /**+ * Allow the user to select all text+ */+ selectAllText() {+ this._blinkIsEven = !0, this.isTextHighlightOn = !0, this._startHighlightIndex = 0, this._endHighlightIndex = this._textWrapper.length, this._cursorOffset = this._textWrapper.length, this._cursorIndex = -1, this._markAsDirty();+ }+ /**+ * Handles the keyboard event+ * @param evt Defines the KeyboardEvent+ */+ processKeyboard(i) {+ this.processKey(i.keyCode, i.key, i), super.processKeyboard(i);+ }+ /**+ * @internal+ */+ _onCopyText(i) {+ this.isTextHighlightOn = !1;+ try {+ i.clipboardData && i.clipboardData.setData("text/plain", this._highlightedText);+ } catch {+ }+ this._host.clipboardData = this._highlightedText;+ }+ /**+ * @internal+ */+ _onCutText(i) {+ if (this._highlightedText) {+ this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex), this._textHasChanged(), this.isTextHighlightOn = !1, this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;+ try {+ i.clipboardData && i.clipboardData.setData("text/plain", this._highlightedText);+ } catch {+ }+ this._host.clipboardData = this._highlightedText, this._highlightedText = "";+ }+ }+ /**+ * @internal+ */+ _onPasteText(i) {+ let d;+ i.clipboardData && i.clipboardData.types.indexOf("text/plain") !== -1 ? d = i.clipboardData.getData("text/plain") : d = this._host.clipboardData;+ const g = this._textWrapper.length - this._cursorOffset;+ this._textWrapper.removePart(g, g, d), this._textHasChanged();+ }+ _draw(i) {+ i.save(), this._applyStates(i), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), this._isFocused ? this._focusedBackground && (i.fillStyle = this._isEnabled ? this._focusedBackground : this._disabledColor, i.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height)) : this._background && (i.fillStyle = this._isEnabled ? this._background : this._disabledColor, i.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height)), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), (!this._fontOffset || this._wasDirty) && (this._fontOffset = pe._GetFontOffset(i.font, this._host.getScene()?.getEngine()));+ const d = this._currentMeasure.left + this._margin.getValueInPixel(this._host, this._tempParentMeasure.width);+ this.color && (i.fillStyle = this.color);+ let g = this._beforeRenderText(this._textWrapper);+ !this._isFocused && !this._textWrapper.text && this._placeholderText && (g = new Ab(), g.text = this._placeholderText, this._placeholderColor && (i.fillStyle = this._placeholderColor)), this._textWidth = i.measureText(g.text).width;+ const y = this._margin.getValueInPixel(this._host, this._tempParentMeasure.width) * 2;+ this._autoStretchWidth && (this.width = Math.min(this._maxWidth.getValueInPixel(this._host, this._tempParentMeasure.width), this._textWidth + y) + "px", this._autoStretchWidth = !0);+ const M = this._fontOffset.ascent + (this._currentMeasure.height - this._fontOffset.height) / 2, N = this._width.getValueInPixel(this._host, this._tempParentMeasure.width) - y;+ if (i.save(), i.beginPath(), i.rect(d, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, N + 2, this._currentMeasure.height), i.clip(), this._isFocused && this._textWidth > N) {+ const O = d - this._textWidth + N;+ this._scrollLeft || (this._scrollLeft = O);+ } else+ this._scrollLeft = d;+ if (this.outlineWidth && i.strokeText(g.text, this._scrollLeft, this._currentMeasure.top + M), i.fillText(g.text, this._scrollLeft, this._currentMeasure.top + M), this._isFocused) {+ if (this._clickedCoordinate) {+ const F = this._scrollLeft + this._textWidth - this._clickedCoordinate;+ let ne = 0;+ this._cursorOffset = 0;+ let $ = 0;+ do+ this._cursorOffset && ($ = Math.abs(F - ne)), this._cursorOffset++, ne = i.measureText(g.substr(g.length - this._cursorOffset, this._cursorOffset)).width;+ while (ne < F && g.length >= this._cursorOffset);+ Math.abs(F - ne) > $ && this._cursorOffset--, this._blinkIsEven = !1, this._clickedCoordinate = null;+ }+ if (!this._blinkIsEven) {+ const O = g.substr(g.length - this._cursorOffset), F = i.measureText(O).width;+ let ne = this._scrollLeft + this._textWidth - F;+ ne < d ? (this._scrollLeft += d - ne, ne = d, this._markAsDirty()) : ne > d + N && (this._scrollLeft += d + N - ne, ne = d + N, this._markAsDirty()), this.isTextHighlightOn || i.fillRect(ne, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, 2, this._fontOffset.height);+ }+ if (clearTimeout(this._blinkTimeout), this._blinkTimeout = setTimeout(() => {+ this._blinkIsEven = !this._blinkIsEven, this._markAsDirty();+ }, 500), this.isTextHighlightOn) {+ clearTimeout(this._blinkTimeout);+ const O = i.measureText(g.substring(this._startHighlightIndex)).width;+ let F = this._scrollLeft + this._textWidth - O;+ this._highlightedText = g.substring(this._startHighlightIndex, this._endHighlightIndex);+ let ne = i.measureText(g.substring(this._startHighlightIndex, this._endHighlightIndex)).width;+ F < d && (ne = ne - (d - F), ne || (ne = i.measureText(g.charAt(g.length - this._cursorOffset)).width), F = d), i.globalAlpha = this._highlighterOpacity, i.fillStyle = this._textHighlightColor, i.fillRect(F, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, ne, this._fontOffset.height), i.globalAlpha = 1;+ }+ }+ i.restore(), this._thickness && (this._isFocused ? this.focusedColor && (i.strokeStyle = this.focusedColor) : this.color && (i.strokeStyle = this.color), i.lineWidth = this._thickness, i.strokeRect(this._currentMeasure.left + this._thickness / 2, this._currentMeasure.top + this._thickness / 2, this._currentMeasure.width - this._thickness, this._currentMeasure.height - this._thickness)), i.restore();+ }+ _onPointerDown(i, d, g, y, M) {+ return super._onPointerDown(i, d, g, y, M) ? this.isReadOnly ? !0 : (this._clickedCoordinate = d.x, this.isTextHighlightOn = !1, this._highlightedText = "", this._cursorIndex = -1, this._isPointerDown = !0, this._host._capturingControl[g] = this, this._focusedBy = M.event.pointerType, this._host.focusedControl === this ? (clearTimeout(this._blinkTimeout), this._markAsDirty(), !0) : this._isEnabled ? (this._host.focusedControl = this, !0) : !1) : !1;+ }+ _onPointerMove(i, d, g, y) {+ this._host.focusedControl === this && this._isPointerDown && !this.isReadOnly && (this._clickedCoordinate = d.x, this._markAsDirty(), this._updateValueFromCursorIndex(this._cursorOffset)), super._onPointerMove(i, d, g, y);+ }+ _onPointerUp(i, d, g, y, M) {+ this._isPointerDown = !1, delete this._host._capturingControl[g], super._onPointerUp(i, d, g, y, M);+ }+ _beforeRenderText(i) {+ return i;+ }+ /** @internal */+ // eslint-disable-next-line @typescript-eslint/naming-convention+ set isTextHighlightOn(i) {+ this._isTextHighlightOn !== i && (i && this.onTextHighlightObservable.notifyObservers(this), this._isTextHighlightOn = i);+ }+ /** @internal */+ // eslint-disable-next-line @typescript-eslint/naming-convention+ get isTextHighlightOn() {+ return this._isTextHighlightOn;+ }+ dispose() {+ super.dispose(), this.onBlurObservable.clear(), this.onFocusObservable.clear(), this.onTextChangedObservable.clear(), this.onTextCopyObservable.clear(), this.onTextCutObservable.clear(), this.onTextPasteObservable.clear(), this.onTextHighlightObservable.clear(), this.onKeyboardEventProcessedObservable.clear();+ }+}+q([+ H()+], bo.prototype, "promptMessage", void 0);+q([+ H()+], bo.prototype, "disableMobilePrompt", void 0);+q([+ H()+], bo.prototype, "maxWidth", null);+q([+ H()+], bo.prototype, "highligherOpacity", null);+q([+ H()+], bo.prototype, "highlighterOpacity", null);+q([+ H()+], bo.prototype, "onFocusSelectAll", null);+q([+ H()+], bo.prototype, "textHighlightColor", null);+q([+ H()+], bo.prototype, "margin", null);+q([+ H()+], bo.prototype, "autoStretchWidth", null);+q([+ H()+], bo.prototype, "thickness", null);+q([+ H()+], bo.prototype, "focusedBackground", null);+q([+ H()+], bo.prototype, "background", null);+q([+ H()+], bo.prototype, "placeholderColor", null);+q([+ H()+], bo.prototype, "placeholderText", null);+q([+ H()+], bo.prototype, "deadKey", null);+q([+ H()+], bo.prototype, "text", null);+q([+ H()+], bo.prototype, "width", null);+kr("BABYLON.GUI.InputText", bo);+class Hi extends wi {+ /**+ * Sets/Gets a boolean indicating that control content must be clipped+ * Please note that not clipping content may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children+ */+ set clipContent(i) {+ this._clipContent = i;+ for (const d in this._cells)+ this._cells[d].clipContent = i;+ }+ get clipContent() {+ return this._clipContent;+ }+ /**+ * Sets/Gets a boolean indicating if the children are clipped to the current control bounds.+ * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children+ */+ set clipChildren(i) {+ this._clipChildren = i;+ for (const d in this._cells)+ this._cells[d].clipChildren = i;+ }+ get clipChildren() {+ return this._clipChildren;+ }+ /**+ * Gets the number of columns+ */+ get columnCount() {+ return this._columnDefinitions.length;+ }+ /**+ * Gets the number of rows+ */+ get rowCount() {+ return this._rowDefinitions.length;+ }+ /** Gets the list of children */+ get children() {+ return this._childControls;+ }+ /** Gets the list of cells (e.g. the containers) */+ get cells() {+ return this._cells;+ }+ /**+ * Gets the definition of a specific row+ * @param index defines the index of the row+ * @returns the row definition+ */+ getRowDefinition(i) {+ return i < 0 || i >= this._rowDefinitions.length ? null : this._rowDefinitions[i];+ }+ /**+ * Gets the definition of a specific column+ * @param index defines the index of the column+ * @returns the column definition+ */+ getColumnDefinition(i) {+ return i < 0 || i >= this._columnDefinitions.length ? null : this._columnDefinitions[i];+ }+ /**+ * Adds a new row to the grid+ * @param height defines the height of the row (either in pixel or a value between 0 and 1)+ * @param isPixel defines if the height is expressed in pixel (or in percentage)+ * @returns the current grid+ */+ addRowDefinition(i, d = !1) {+ return this._rowDefinitions.push(new St(i, d ? St.UNITMODE_PIXEL : St.UNITMODE_PERCENTAGE)), this._rowDefinitionObservers.push(this._rowDefinitions[this.rowCount - 1].onChangedObservable.add(() => this._markAsDirty())), this._markAsDirty(), this;+ }+ /**+ * Adds a new column to the grid+ * @param width defines the width of the column (either in pixel or a value between 0 and 1)+ * @param isPixel defines if the width is expressed in pixel (or in percentage)+ * @returns the current grid+ */+ addColumnDefinition(i, d = !1) {+ return this._columnDefinitions.push(new St(i, d ? St.UNITMODE_PIXEL : St.UNITMODE_PERCENTAGE)), this._columnDefinitionObservers.push(this._columnDefinitions[this.columnCount - 1].onChangedObservable.add(() => this._markAsDirty())), this._markAsDirty(), this;+ }+ /**+ * Update a row definition+ * @param index defines the index of the row to update+ * @param height defines the height of the row (either in pixel or a value between 0 and 1)+ * @param isPixel defines if the weight is expressed in pixel (or in percentage)+ * @returns the current grid+ */+ setRowDefinition(i, d, g = !1) {+ if (i < 0 || i >= this._rowDefinitions.length)+ return this;+ const y = this._rowDefinitions[i];+ return y && y.isPixel === g && y.value === d ? this : (this._rowDefinitions[i].onChangedObservable.remove(this._rowDefinitionObservers[i]), this._rowDefinitions[i] = new St(d, g ? St.UNITMODE_PIXEL : St.UNITMODE_PERCENTAGE), this._rowDefinitionObservers[i] = this._rowDefinitions[i].onChangedObservable.add(() => this._markAsDirty()), this._markAsDirty(), this);+ }+ /**+ * Update a column definition+ * @param index defines the index of the column to update+ * @param width defines the width of the column (either in pixel or a value between 0 and 1)+ * @param isPixel defines if the width is expressed in pixel (or in percentage)+ * @returns the current grid+ */+ setColumnDefinition(i, d, g = !1) {+ if (i < 0 || i >= this._columnDefinitions.length)+ return this;+ const y = this._columnDefinitions[i];+ return y && y.isPixel === g && y.value === d ? this : (this._columnDefinitions[i].onChangedObservable.remove(this._columnDefinitionObservers[i]), this._columnDefinitions[i] = new St(d, g ? St.UNITMODE_PIXEL : St.UNITMODE_PERCENTAGE), this._columnDefinitionObservers[i] = this._columnDefinitions[i].onChangedObservable.add(() => this._markAsDirty()), this._markAsDirty(), this);+ }+ /**+ * Gets the list of children stored in a specific cell+ * @param row defines the row to check+ * @param column defines the column to check+ * @returns the list of controls+ */+ getChildrenAt(i, d) {+ const g = this._cells[`${i}:${d}`];+ return g ? g.children : null;+ }+ /**+ * Gets a string representing the child cell info (row x column)+ * @param child defines the control to get info from+ * @returns a string containing the child cell info (row x column)+ */+ getChildCellInfo(i) {+ return i._tag;+ }+ _removeCell(i, d) {+ if (i) {+ super.removeControl(i);+ for (const g of i.children) {+ const y = this._childControls.indexOf(g);+ y !== -1 && this._childControls.splice(y, 1);+ }+ delete this._cells[d];+ }+ }+ _offsetCell(i, d) {+ if (this._cells[d]) {+ this._cells[i] = this._cells[d];+ for (const g of this._cells[i].children)+ g._tag = i;+ delete this._cells[d];+ }+ }+ /**+ * Remove a column definition at specified index+ * @param index defines the index of the column to remove+ * @returns the current grid+ */+ removeColumnDefinition(i) {+ if (i < 0 || i >= this._columnDefinitions.length)+ return this;+ for (let d = 0; d < this._rowDefinitions.length; d++) {+ const g = `${d}:${i}`, y = this._cells[g];+ this._removeCell(y, g);+ }+ for (let d = 0; d < this._rowDefinitions.length; d++)+ for (let g = i + 1; g < this._columnDefinitions.length; g++) {+ const y = `${d}:${g - 1}`, M = `${d}:${g}`;+ this._offsetCell(y, M);+ }+ return this._columnDefinitions[i].onChangedObservable.remove(this._columnDefinitionObservers[i]), this._columnDefinitions.splice(i, 1), this._columnDefinitionObservers.splice(i, 1), this._markAsDirty(), this;+ }+ /**+ * Remove a row definition at specified index+ * @param index defines the index of the row to remove+ * @returns the current grid+ */+ removeRowDefinition(i) {+ if (i < 0 || i >= this._rowDefinitions.length)+ return this;+ for (let d = 0; d < this._columnDefinitions.length; d++) {+ const g = `${i}:${d}`, y = this._cells[g];+ this._removeCell(y, g);+ }+ for (let d = 0; d < this._columnDefinitions.length; d++)+ for (let g = i + 1; g < this._rowDefinitions.length; g++) {+ const y = `${g - 1}:${d}`, M = `${g}:${d}`;+ this._offsetCell(y, M);+ }+ return this._rowDefinitions[i].onChangedObservable.remove(this._rowDefinitionObservers[i]), this._rowDefinitions.splice(i, 1), this._rowDefinitionObservers.splice(i, 1), this._markAsDirty(), this;+ }+ /**+ * Adds a new control to the current grid+ * @param control defines the control to add+ * @param row defines the row where to add the control (0 by default)+ * @param column defines the column where to add the control (0 by default)+ * @returns the current grid+ */+ addControl(i, d = 0, g = 0) {+ if (this._rowDefinitions.length === 0 && this.addRowDefinition(1, !1), this._columnDefinitions.length === 0 && this.addColumnDefinition(1, !1), this._childControls.indexOf(i) !== -1)+ return Lr.Warn(`Control (Name:${i.name}, UniqueId:${i.uniqueId}) is already associated with this grid. You must remove it before reattaching it`), this;+ const y = Math.min(d, this._rowDefinitions.length - 1), M = Math.min(g, this._columnDefinitions.length - 1), N = `${y}:${M}`;+ let O = this._cells[N];+ return O || (O = new wi(N), this._cells[N] = O, O.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, O.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, O.clipContent = this.clipContent, O.clipChildren = this.clipChildren, super.addControl(O)), O.addControl(i), this._childControls.push(i), i._tag = N, i.parent = this, this._markAsDirty(), this;+ }+ /**+ * Removes a control from the current container+ * @param control defines the control to remove+ * @returns the current container+ */+ removeControl(i) {+ const d = this._childControls.indexOf(i);+ d !== -1 && this._childControls.splice(d, 1);+ const g = this._cells[i._tag];+ return g && (g.removeControl(i), i._tag = null), this._markAsDirty(), this;+ }+ /**+ * Creates a new Grid+ * @param name defines control name+ */+ constructor(i) {+ super(i), this.name = i, this._rowDefinitions = new Array(), this._rowDefinitionObservers = [], this._columnDefinitions = new Array(), this._columnDefinitionObservers = [], this._cells = {}, this._childControls = new Array();+ }+ _getTypeName() {+ return "Grid";+ }+ _getGridDefinitions(i) {+ const d = [], g = [], y = [], M = [];+ let N = this._currentMeasure.width, O = 0, F = this._currentMeasure.height, ne = 0, $ = 0;+ for (const he of this._rowDefinitions) {+ if (he.isPixel) {+ const Me = he.getValue(this._host);+ F -= Me, g[$] = Me;+ } else+ ne += he.value;+ $++;+ }+ let Q = 0;+ $ = 0;+ for (const he of this._rowDefinitions) {+ if (M.push(Q), he.isPixel)+ Q += he.getValue(this._host);+ else {+ const Me = Math.round(he.value / ne * F);+ Q += Me, g[$] = Me;+ }+ $++;+ }+ $ = 0;+ for (const he of this._columnDefinitions) {+ if (he.isPixel) {+ const Me = he.getValue(this._host);+ N -= Me, d[$] = Me;+ } else+ O += he.value;+ $++;+ }+ let X = 0;+ $ = 0;+ for (const he of this._columnDefinitions) {+ if (y.push(X), he.isPixel)+ X += he.getValue(this._host);+ else {+ const Me = Math.round(he.value / O * N);+ X += Me, d[$] = Me;+ }+ $++;+ }+ i(y, M, d, g);+ }+ _additionalProcessing(i, d) {+ this._getGridDefinitions((g, y, M, N) => {+ for (const O in this._cells) {+ if (!Object.prototype.hasOwnProperty.call(this._cells, O))+ continue;+ const F = O.split(":"), ne = parseInt(F[0]), $ = parseInt(F[1]), Q = this._cells[O];+ Q.leftInPixels = g[$], Q.topInPixels = y[ne], Q.widthInPixels = M[$], Q.heightInPixels = N[ne], Q._left.ignoreAdaptiveScaling = !0, Q._top.ignoreAdaptiveScaling = !0, Q._width.ignoreAdaptiveScaling = !0, Q._height.ignoreAdaptiveScaling = !0;+ }+ }), super._additionalProcessing(i, d);+ }+ _flagDescendantsAsMatrixDirty() {+ for (const i in this._cells) {+ if (!Object.prototype.hasOwnProperty.call(this._cells, i))+ continue;+ this._cells[i]._markMatrixAsDirty();+ }+ }+ _renderHighlightSpecific(i) {+ super._renderHighlightSpecific(i), this._getGridDefinitions((d, g, y, M) => {+ for (let N = 0; N < d.length; N++) {+ const O = this._currentMeasure.left + d[N] + y[N];+ i.beginPath(), i.moveTo(O, this._currentMeasure.top), i.lineTo(O, this._currentMeasure.top + this._currentMeasure.height), i.stroke();+ }+ for (let N = 0; N < g.length; N++) {+ const O = this._currentMeasure.top + g[N] + M[N];+ i.beginPath(), i.moveTo(this._currentMeasure.left, O), i.lineTo(this._currentMeasure.left + this._currentMeasure.width, O), i.stroke();+ }+ }), i.restore();+ }+ /** Releases associated resources */+ dispose() {+ super.dispose();+ for (const i of this._childControls)+ i.dispose();+ for (let i = 0; i < this._rowDefinitions.length; i++)+ this._rowDefinitions[i].onChangedObservable.remove(this._rowDefinitionObservers[i]);+ for (let i = 0; i < this._columnDefinitions.length; i++)+ this._columnDefinitions[i].onChangedObservable.remove(this._columnDefinitionObservers[i]);+ this._rowDefinitionObservers.length = 0, this._rowDefinitions.length = 0, this._columnDefinitionObservers.length = 0, this._columnDefinitions.length = 0, this._cells = {}, this._childControls.length = 0;+ }+ /**+ * Serializes the current control+ * @param serializationObject defined the JSON serialized object+ * @param force force serialization even if isSerializable === false+ * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize+ */+ serialize(i, d, g) {+ if (super.serialize(i, d, g), !(!this.isSerializable && !d)) {+ i.columnCount = this.columnCount, i.rowCount = this.rowCount, i.columns = [], i.rows = [], i.tags = [];+ for (let y = 0; y < this.columnCount; ++y) {+ const M = this.getColumnDefinition(y), N = { value: M?.getValue(this.host), unit: M?.unit };+ i.columns.push(N);+ }+ for (let y = 0; y < this.rowCount; ++y) {+ const M = this.getRowDefinition(y), N = { value: M?.getValue(this.host), unit: M?.unit };+ i.rows.push(N);+ }+ for (const y of this.children)+ i.tags.push(y._tag);+ }+ }+ /**+ * @internal+ */+ _parseFromContent(i, d) {+ super._parseFromContent(i, d);+ const g = [];+ for (const y of this.children)+ g.push(y);+ this.removeRowDefinition(0), this.removeColumnDefinition(0);+ for (let y = 0; y < i.columnCount; ++y) {+ const M = i.columns[y].value, N = i.columns[y].unit;+ this.addColumnDefinition(M, N === 1);+ }+ for (let y = 0; y < i.rowCount; ++y) {+ const M = i.rows[y].value, N = i.rows[y].unit;+ this.addRowDefinition(M, N === 1);+ }+ for (let y = 0; y < g.length; ++y) {+ const M = i.tags[y];+ let N = parseInt(M.substring(0, M.search(":")));+ isNaN(N) && (N = 0);+ let O = parseInt(M.substring(M.search(":") + 1));+ isNaN(O) && (O = 0), this.addControl(g[y], N, O);+ }+ }+}+q([+ H()+], Hi.prototype, "clipContent", null);+kr("BABYLON.GUI.Grid", Hi);+class an extends pe {+ /** Gets or sets the color of the color picker */+ get value() {+ return this._value;+ }+ set value(i) {+ this._value.equals(i) || (this._value.copyFrom(i), this._value.toHSVToRef(this._tmpColor), this._h = this._tmpColor.r, this._s = Math.max(this._tmpColor.g, 1e-5), this._v = Math.max(this._tmpColor.b, 1e-5), this._markAsDirty(), this._value.r <= an._Epsilon && (this._value.r = 0), this._value.g <= an._Epsilon && (this._value.g = 0), this._value.b <= an._Epsilon && (this._value.b = 0), this._value.r >= 1 - an._Epsilon && (this._value.r = 1), this._value.g >= 1 - an._Epsilon && (this._value.g = 1), this._value.b >= 1 - an._Epsilon && (this._value.b = 1), this.onValueChangedObservable.notifyObservers(this._value, void 0, this, this));+ }+ /**+ * Gets or sets control width+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get width() {+ return this._width.toString(this._host);+ }+ set width(i) {+ this._width.toString(this._host) !== i && this._width.fromString(i) && (this._width.getValue(this._host) === 0 && (i = "1px", this._width.fromString(i)), this._height.fromString(i), this._markAsDirty());+ }+ /**+ * Gets or sets control height+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size+ */+ get height() {+ return this._height.toString(this._host);+ }+ /** Gets or sets control height */+ set height(i) {+ this._height.toString(this._host) !== i && this._height.fromString(i) && (this._height.getValue(this._host) === 0 && (i = "1px", this._height.fromString(i)), this._width.fromString(i), this._markAsDirty());+ }+ /** Gets or sets control size */+ get size() {+ return this.width;+ }+ set size(i) {+ this.width = i;+ }+ /**+ * Creates a new ColorPicker+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._value = nr.Red(), this._tmpColor = new nr(), this._pointerStartedOnSquare = !1, this._pointerStartedOnWheel = !1, this._squareLeft = 0, this._squareTop = 0, this._squareSize = 0, this._h = 360, this._s = 1, this._v = 1, this._lastPointerDownId = -1, this.onValueChangedObservable = new qt(), this._pointerIsDown = !1, this.value = new nr(0.88, 0.1, 0.1), this.size = "200px", this.isPointerBlocker = !0;+ }+ _getTypeName() {+ return "ColorPicker";+ }+ /**+ * @internal+ */+ _preMeasure(i) {+ i.width < i.height ? this._currentMeasure.height = i.width : this._currentMeasure.width = i.height;+ }+ _updateSquareProps() {+ const i = Math.min(this._currentMeasure.width, this._currentMeasure.height) * 0.5, d = i * 0.2, y = (i - d) * 2 / Math.sqrt(2), M = i - y * 0.5;+ this._squareLeft = this._currentMeasure.left + M, this._squareTop = this._currentMeasure.top + M, this._squareSize = y;+ }+ _drawGradientSquare(i, d, g, y, M, N) {+ const O = N.createLinearGradient(d, g, y + d, g);+ O.addColorStop(0, "#fff"), O.addColorStop(1, "hsl(" + i + ", 100%, 50%)"), N.fillStyle = O, N.fillRect(d, g, y, M);+ const F = N.createLinearGradient(d, g, d, M + g);+ F.addColorStop(0, "rgba(0,0,0,0)"), F.addColorStop(1, "#000"), N.fillStyle = F, N.fillRect(d, g, y, M);+ }+ _drawCircle(i, d, g, y) {+ y.beginPath(), y.arc(i, d, g + 1, 0, 2 * Math.PI, !1), y.lineWidth = 3, y.strokeStyle = "#333333", y.stroke(), y.beginPath(), y.arc(i, d, g, 0, 2 * Math.PI, !1), y.lineWidth = 3, y.strokeStyle = "#ffffff", y.stroke();+ }+ _createColorWheelCanvas(i, d) {+ const g = md.LastCreatedEngine;+ if (!g)+ throw new Error("Invalid engine. Unable to create a canvas.");+ const y = g.createCanvas(i * 2, i * 2), M = y.getContext("2d"), N = M.getImageData(0, 0, i * 2, i * 2), O = N.data, F = this._tmpColor, ne = i * i, $ = i - d, Q = $ * $;+ for (let X = -i; X < i; X++)+ for (let he = -i; he < i; he++) {+ const Me = X * X + he * he;+ if (Me > ne || Me < Q)+ continue;+ const p = Math.sqrt(Me), De = Math.atan2(he, X);+ nr.HSVtoRGBToRef(De * 180 / Math.PI + 180, p / i, 1, F);+ const Ke = (X + i + (he + i) * 2 * i) * 4;+ O[Ke] = F.r * 255, O[Ke + 1] = F.g * 255, O[Ke + 2] = F.b * 255;+ let oe;+ const Bt = 0.2, xe = 0.04, yt = 50, at = 150;+ i < yt ? oe = Bt : i > at ? oe = xe : oe = (xe - Bt) * (i - yt) / (at - yt) + Bt;+ const Re = (p - $) / (i - $);+ Re < oe ? O[Ke + 3] = 255 * (Re / oe) : Re > 1 - oe ? O[Ke + 3] = 255 * (1 - (Re - (1 - oe)) / oe) : O[Ke + 3] = 255;+ }+ return M.putImageData(N, 0, 0), y;+ }+ /**+ * @internal+ */+ _draw(i) {+ i.save(), this._applyStates(i);+ const d = Math.min(this._currentMeasure.width, this._currentMeasure.height) * 0.5, g = d * 0.2, y = this._currentMeasure.left, M = this._currentMeasure.top;+ (!this._colorWheelCanvas || this._colorWheelCanvas.width != d * 2) && (this._colorWheelCanvas = this._createColorWheelCanvas(d, g)), this._updateSquareProps(), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio, i.fillRect(this._squareLeft, this._squareTop, this._squareSize, this._squareSize)), i.drawImage(this._colorWheelCanvas, y, M), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), this._drawGradientSquare(this._h, this._squareLeft, this._squareTop, this._squareSize, this._squareSize, i);+ let N = this._squareLeft + this._squareSize * this._s, O = this._squareTop + this._squareSize * (1 - this._v);+ this._drawCircle(N, O, d * 0.04, i);+ const F = d - g * 0.5;+ N = y + d + Math.cos((this._h - 180) * Math.PI / 180) * F, O = M + d + Math.sin((this._h - 180) * Math.PI / 180) * F, this._drawCircle(N, O, g * 0.35, i), i.restore();+ }+ _updateValueFromPointer(i, d) {+ if (this._pointerStartedOnWheel) {+ const g = Math.min(this._currentMeasure.width, this._currentMeasure.height) * 0.5, y = g + this._currentMeasure.left, M = g + this._currentMeasure.top;+ this._h = Math.atan2(d - M, i - y) * 180 / Math.PI + 180;+ } else this._pointerStartedOnSquare && (this._updateSquareProps(), this._s = (i - this._squareLeft) / this._squareSize, this._v = 1 - (d - this._squareTop) / this._squareSize, this._s = Math.min(this._s, 1), this._s = Math.max(this._s, an._Epsilon), this._v = Math.min(this._v, 1), this._v = Math.max(this._v, an._Epsilon));+ nr.HSVtoRGBToRef(this._h, this._s, this._v, this._tmpColor), this.value = this._tmpColor;+ }+ _isPointOnSquare(i, d) {+ this._updateSquareProps();+ const g = this._squareLeft, y = this._squareTop, M = this._squareSize;+ return i >= g && i <= g + M && d >= y && d <= y + M;+ }+ _isPointOnWheel(i, d) {+ const g = Math.min(this._currentMeasure.width, this._currentMeasure.height) * 0.5, y = g + this._currentMeasure.left, M = g + this._currentMeasure.top, N = g * 0.2, O = g - N, F = g * g, ne = O * O, $ = i - y, Q = d - M, X = $ * $ + Q * Q;+ return X <= F && X >= ne;+ }+ _onPointerDown(i, d, g, y, M) {+ if (!super._onPointerDown(i, d, g, y, M))+ return !1;+ if (this.isReadOnly)+ return !0;+ this._pointerIsDown = !0, this._pointerStartedOnSquare = !1, this._pointerStartedOnWheel = !1, this._invertTransformMatrix.transformCoordinates(d.x, d.y, this._transformedPosition);+ const N = this._transformedPosition.x, O = this._transformedPosition.y;+ return this._isPointOnSquare(N, O) ? this._pointerStartedOnSquare = !0 : this._isPointOnWheel(N, O) && (this._pointerStartedOnWheel = !0), this._updateValueFromPointer(N, O), this._host._capturingControl[g] = this, this._lastPointerDownId = g, !0;+ }+ _onPointerMove(i, d, g, y) {+ if (g == this._lastPointerDownId) {+ if (!this.isReadOnly) {+ this._invertTransformMatrix.transformCoordinates(d.x, d.y, this._transformedPosition);+ const M = this._transformedPosition.x, N = this._transformedPosition.y;+ this._pointerIsDown && this._updateValueFromPointer(M, N);+ }+ super._onPointerMove(i, d, g, y);+ }+ }+ _onPointerUp(i, d, g, y, M, N) {+ this._pointerIsDown = !1, delete this._host._capturingControl[g], super._onPointerUp(i, d, g, y, M, N);+ }+ _onCanvasBlur() {+ this._forcePointerUp(), super._onCanvasBlur();+ }+ /**+ * This function expands the color picker by creating a color picker dialog with manual+ * color value input and the ability to save colors into an array to be used later in+ * subsequent launches of the dialogue.+ * @param advancedTexture defines the AdvancedDynamicTexture the dialog is assigned to+ * @param options defines size for dialog and options for saved colors. Also accepts last color picked as hex string and saved colors array as hex strings.+ * @param options.pickerWidth+ * @param options.pickerHeight+ * @param options.headerHeight+ * @param options.lastColor+ * @param options.swatchLimit+ * @param options.numSwatchesPerLine+ * @param options.savedColors+ * @returns picked color as a hex string and the saved colors array as hex strings.+ */+ static async ShowPickerDialogAsync(i, d) {+ return await new Promise((g) => {+ d.pickerWidth = d.pickerWidth || "640px", d.pickerHeight = d.pickerHeight || "400px", d.headerHeight = d.headerHeight || "35px", d.lastColor = d.lastColor || "#000000", d.swatchLimit = d.swatchLimit || 20, d.numSwatchesPerLine = d.numSwatchesPerLine || 10;+ const y = d.swatchLimit / d.numSwatchesPerLine, M = parseFloat(d.pickerWidth) / d.numSwatchesPerLine, N = Math.floor(M * 0.25), O = N * (d.numSwatchesPerLine + 1), F = Math.floor((parseFloat(d.pickerWidth) - O) / d.numSwatchesPerLine), ne = F * y + N * (y + 1), $ = (parseInt(d.pickerHeight) + ne + Math.floor(F * 0.25)).toString() + "px", Q = "#c0c0c0", X = "#535353", he = "#414141", Me = "515151", p = "#555555", De = "#454545", Ke = "#404040", oe = nr.FromHexString("#dddddd"), Bt = oe.r + oe.g + oe.b, xe = "#aaaaaa", yt = "#ffffff";+ let at, Re;+ const Ur = ["R", "G", "B"], vt = "#454545", xt = "#f0f0f0";+ let Io, w, qo = !1, tr, Sr, Dt;+ const Yr = new Hi();+ if (Yr.name = "Dialog Container", Yr.width = d.pickerWidth, d.savedColors) {+ Yr.height = $;+ const ot = parseInt(d.pickerHeight) / parseInt($);+ Yr.addRowDefinition(ot, !1), Yr.addRowDefinition(1 - ot, !1);+ } else+ Yr.height = d.pickerHeight, Yr.addRowDefinition(1, !1);+ if (i.addControl(Yr), d.savedColors) {+ w = new Hi(), w.name = "Swatch Drawer", w.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, w.background = X, w.width = d.pickerWidth;+ const ot = d.savedColors.length / d.numSwatchesPerLine;+ let Ht;+ ot == 0 ? Ht = 0 : Ht = ot + 1, w.height = (F * ot + Ht * N).toString() + "px", w.top = Math.floor(F * 0.25).toString() + "px";+ for (let it = 0; it < Math.ceil(d.savedColors.length / d.numSwatchesPerLine) * 2 + 1; it++)+ it % 2 != 0 ? w.addRowDefinition(F, !0) : w.addRowDefinition(N, !0);+ for (let it = 0; it < d.numSwatchesPerLine * 2 + 1; it++)+ it % 2 != 0 ? w.addColumnDefinition(F, !0) : w.addColumnDefinition(N, !0);+ Yr.addControl(w, 1, 0);+ }+ const Zr = new Hi();+ Zr.name = "Picker Panel", Zr.height = d.pickerHeight;+ const hi = parseInt(d.headerHeight) / parseInt(d.pickerHeight), pi = [hi, 1 - hi];+ Zr.addRowDefinition(pi[0], !1), Zr.addRowDefinition(pi[1], !1), Yr.addControl(Zr, 0, 0);+ const ei = new si();+ ei.name = "Dialogue Header Bar", ei.background = "#cccccc", ei.thickness = 0, Zr.addControl(ei, 0, 0);+ const jr = Bs.CreateSimpleButton("closeButton", "a");+ jr.fontFamily = "coreglyphs";+ const Yi = nr.FromHexString(ei.background), yi = new nr(1 - Yi.r, 1 - Yi.g, 1 - Yi.b);+ jr.color = yi.toHexString(), jr.fontSize = Math.floor(parseInt(d.headerHeight) * 0.6), jr.textBlock.textVerticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, jr.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_RIGHT, jr.height = jr.width = d.headerHeight, jr.background = ei.background, jr.thickness = 0, jr.pointerDownAnimation = () => {+ }, jr.pointerUpAnimation = () => {+ jr.background = ei.background;+ }, jr.pointerEnterAnimation = () => {+ jr.color = ei.background, jr.background = "red";+ }, jr.pointerOutAnimation = () => {+ jr.color = yi.toHexString(), jr.background = ei.background;+ }, jr.onPointerClickObservable.add(() => {+ ia(xi.background);+ }), Zr.addControl(jr, 0, 0);+ const Ho = new Hi();+ Ho.name = "Dialogue Body", Ho.background = X;+ const Vr = [0.4375, 0.5625];+ Ho.addRowDefinition(1, !1), Ho.addColumnDefinition(Vr[0], !1), Ho.addColumnDefinition(Vr[1], !1), Zr.addControl(Ho, 1, 0);+ const Wo = new Hi();+ Wo.name = "Picker Grid", Wo.addRowDefinition(0.85, !1), Wo.addRowDefinition(0.15, !1), Ho.addControl(Wo, 0, 0);+ const io = new an();+ io.name = "GUI Color Picker", d.pickerHeight < d.pickerWidth ? io.width = 0.89 : io.height = 0.89, io.value = nr.FromHexString(d.lastColor), io.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_CENTER, io.verticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, io.onPointerDownObservable.add(() => {+ Dt = io.name, Sr = "", gi(!1);+ }), io.onValueChangedObservable.add(function(ot) {+ Dt == io.name && Lo(ot, io.name);+ }), Wo.addControl(io, 0, 0);+ const ft = new Hi();+ ft.name = "Dialogue Right Half", ft.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT;+ const we = [0.514, 0.486];+ ft.addRowDefinition(we[0], !1), ft.addRowDefinition(we[1], !1), Ho.addControl(ft, 1, 1);+ const ke = new Hi();+ ke.name = "Swatches and Buttons";+ const Nt = [0.417, 0.583];+ ke.addRowDefinition(1, !1), ke.addColumnDefinition(Nt[0], !1), ke.addColumnDefinition(Nt[1], !1), ft.addControl(ke, 0, 0);+ const R = new Hi();+ R.name = "New and Current Swatches";+ const rr = [0.04, 0.16, 0.64, 0.16];+ R.addRowDefinition(rr[0], !1), R.addRowDefinition(rr[1], !1), R.addRowDefinition(rr[2], !1), R.addRowDefinition(rr[3], !1), ke.addControl(R, 0, 0);+ const vr = new Hi();+ vr.name = "Active Swatches", vr.width = 0.67, vr.addRowDefinition(0.5, !1), vr.addRowDefinition(0.5, !1), R.addControl(vr, 2, 0);+ const eo = Math.floor(parseInt(d.pickerWidth) * Vr[1] * Nt[0] * 0.11), Tr = Math.floor(parseInt(d.pickerHeight) * pi[1] * we[0] * rr[1] * 0.5);+ let ur;+ d.pickerWidth > d.pickerHeight ? ur = Tr : ur = eo;+ const Er = new zr();+ Er.text = "new", Er.name = "New Color Label", Er.color = Q, Er.fontSize = ur, R.addControl(Er, 1, 0);+ const Ni = new si();+ Ni.name = "New Color Swatch", Ni.background = d.lastColor, Ni.thickness = 0, vr.addControl(Ni, 0, 0);+ const xi = Bs.CreateSimpleButton("currentSwatch", "");+ xi.background = d.lastColor, xi.thickness = 0, xi.onPointerClickObservable.add(() => {+ const ot = nr.FromHexString(xi.background);+ Lo(ot, xi.name), gi(!1);+ }), xi.pointerDownAnimation = () => {+ }, xi.pointerUpAnimation = () => {+ }, xi.pointerEnterAnimation = () => {+ }, xi.pointerOutAnimation = () => {+ }, vr.addControl(xi, 1, 0);+ const Bn = new si();+ Bn.name = "Swatch Outline", Bn.width = 0.67, Bn.thickness = 2, Bn.color = Ke, Bn.isHitTestVisible = !1, R.addControl(Bn, 2, 0);+ const pn = new zr();+ pn.name = "Current Color Label", pn.text = "current", pn.color = Q, pn.fontSize = ur, R.addControl(pn, 3, 0);+ const Ii = new Hi();+ Ii.name = "Button Grid", Ii.height = 0.8;+ const Ia = 1 / 3;+ Ii.addRowDefinition(Ia, !1), Ii.addRowDefinition(Ia, !1), Ii.addRowDefinition(Ia, !1), ke.addControl(Ii, 0, 1);+ const Nn = Math.floor(parseInt(d.pickerWidth) * Vr[1] * Nt[1] * 0.67).toString() + "px", za = Math.floor(parseInt(d.pickerHeight) * pi[1] * we[0] * (parseFloat(Ii.height.toString()) / 100) * Ia * 0.7).toString() + "px";+ parseFloat(Nn) > parseFloat(za) ? at = Math.floor(parseFloat(za) * 0.45) : at = Math.floor(parseFloat(Nn) * 0.11);+ const He = Bs.CreateSimpleButton("butOK", "OK");+ He.width = Nn, He.height = za, He.verticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, He.thickness = 2, He.color = Q, He.fontSize = at, He.background = X, He.onPointerEnterObservable.add(() => {+ He.background = he;+ }), He.onPointerOutObservable.add(() => {+ He.background = X;+ }), He.pointerDownAnimation = () => {+ He.background = Me;+ }, He.pointerUpAnimation = () => {+ He.background = he;+ }, He.onPointerClickObservable.add(() => {+ gi(!1), ia(Ni.background);+ }), Ii.addControl(He, 0, 0);+ const Mo = Bs.CreateSimpleButton("butCancel", "Cancel");+ Mo.width = Nn, Mo.height = za, Mo.verticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, Mo.thickness = 2, Mo.color = Q, Mo.fontSize = at, Mo.background = X, Mo.onPointerEnterObservable.add(() => {+ Mo.background = he;+ }), Mo.onPointerOutObservable.add(() => {+ Mo.background = X;+ }), Mo.pointerDownAnimation = () => {+ Mo.background = Me;+ }, Mo.pointerUpAnimation = () => {+ Mo.background = he;+ }, Mo.onPointerClickObservable.add(() => {+ gi(!1), ia(xi.background);+ }), Ii.addControl(Mo, 1, 0), d.savedColors && (tr = Bs.CreateSimpleButton("butSave", "Save"), tr.width = Nn, tr.height = za, tr.verticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, tr.thickness = 2, tr.fontSize = at, d.savedColors.length < d.swatchLimit ? (tr.color = Q, tr.background = X) : oa(tr, !0), tr.onPointerEnterObservable.add(() => {+ d.savedColors && d.savedColors.length < d.swatchLimit && (tr.background = he);+ }), tr.onPointerOutObservable.add(() => {+ d.savedColors && d.savedColors.length < d.swatchLimit && (tr.background = X);+ }), tr.pointerDownAnimation = () => {+ d.savedColors && d.savedColors.length < d.swatchLimit && (tr.background = Me);+ }, tr.pointerUpAnimation = () => {+ d.savedColors && d.savedColors.length < d.swatchLimit && (tr.background = he);+ }, tr.onPointerClickObservable.add(() => {+ d.savedColors && (d.savedColors.length == 0 && ul(!0), d.savedColors.length < d.swatchLimit && Ta(Ni.background, tr), gi(!1));+ }), d.savedColors.length > 0 && ul(!0), Ii.addControl(tr, 2, 0));+ const Vi = new Hi();+ Vi.name = "Dialog Lower Right", Vi.addRowDefinition(0.02, !1), Vi.addRowDefinition(0.63, !1), Vi.addRowDefinition(0.21, !1), Vi.addRowDefinition(0.14, !1), ft.addControl(Vi, 1, 0);+ const ea = nr.FromHexString(d.lastColor), ti = new Hi();+ ti.name = "RGB Values", ti.width = 0.82, ti.verticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, ti.addRowDefinition(1 / 3, !1), ti.addRowDefinition(1 / 3, !1), ti.addRowDefinition(1 / 3, !1), ti.addColumnDefinition(0.1, !1), ti.addColumnDefinition(0.2, !1), ti.addColumnDefinition(0.7, !1), Vi.addControl(ti, 1, 0);+ for (let ot = 0; ot < Ur.length; ot++) {+ const Ht = new zr();+ Ht.text = Ur[ot], Ht.color = Q, Ht.fontSize = at, ti.addControl(Ht, ot, 0);+ }+ const ko = new bo();+ ko.width = 0.83, ko.height = 0.72, ko.name = "rIntField", ko.fontSize = at, ko.text = (ea.r * 255).toString(), ko.color = xt, ko.background = vt, ko.onFocusObservable.add(() => {+ Dt = ko.name, Sr = ko.text, gi(!1);+ }), ko.onBlurObservable.add(() => {+ ko.text == "" && (ko.text = "0"), Da(ko, "r"), Dt == ko.name && (Dt = "");+ }), ko.onTextChangedObservable.add(() => {+ Dt == ko.name && Da(ko, "r");+ }), ti.addControl(ko, 0, 1);+ const vo = new bo();+ vo.width = 0.83, vo.height = 0.72, vo.name = "gIntField", vo.fontSize = at, vo.text = (ea.g * 255).toString(), vo.color = xt, vo.background = vt, vo.onFocusObservable.add(() => {+ Dt = vo.name, Sr = vo.text, gi(!1);+ }), vo.onBlurObservable.add(() => {+ vo.text == "" && (vo.text = "0"), Da(vo, "g"), Dt == vo.name && (Dt = "");+ }), vo.onTextChangedObservable.add(() => {+ Dt == vo.name && Da(vo, "g");+ }), ti.addControl(vo, 1, 1);+ const co = new bo();+ co.width = 0.83, co.height = 0.72, co.name = "bIntField", co.fontSize = at, co.text = (ea.b * 255).toString(), co.color = xt, co.background = vt, co.onFocusObservable.add(() => {+ Dt = co.name, Sr = co.text, gi(!1);+ }), co.onBlurObservable.add(() => {+ co.text == "" && (co.text = "0"), Da(co, "b"), Dt == co.name && (Dt = "");+ }), co.onTextChangedObservable.add(() => {+ Dt == co.name && Da(co, "b");+ }), ti.addControl(co, 2, 1);+ const uo = new bo();+ uo.width = 0.95, uo.height = 0.72, uo.name = "rDecField", uo.fontSize = at, uo.text = ea.r.toString(), uo.color = xt, uo.background = vt, uo.onFocusObservable.add(() => {+ Dt = uo.name, Sr = uo.text, gi(!1);+ }), uo.onBlurObservable.add(() => {+ (parseFloat(uo.text) == 0 || uo.text == "") && (uo.text = "0", ra(uo, "r")), Dt == uo.name && (Dt = "");+ }), uo.onTextChangedObservable.add(() => {+ Dt == uo.name && ra(uo, "r");+ }), ti.addControl(uo, 0, 2);+ const fo = new bo();+ fo.width = 0.95, fo.height = 0.72, fo.name = "gDecField", fo.fontSize = at, fo.text = ea.g.toString(), fo.color = xt, fo.background = vt, fo.onFocusObservable.add(() => {+ Dt = fo.name, Sr = fo.text, gi(!1);+ }), fo.onBlurObservable.add(() => {+ (parseFloat(fo.text) == 0 || fo.text == "") && (fo.text = "0", ra(fo, "g")), Dt == fo.name && (Dt = "");+ }), fo.onTextChangedObservable.add(() => {+ Dt == fo.name && ra(fo, "g");+ }), ti.addControl(fo, 1, 2);+ const to = new bo();+ to.width = 0.95, to.height = 0.72, to.name = "bDecField", to.fontSize = at, to.text = ea.b.toString(), to.color = xt, to.background = vt, to.onFocusObservable.add(() => {+ Dt = to.name, Sr = to.text, gi(!1);+ }), to.onBlurObservable.add(() => {+ (parseFloat(to.text) == 0 || to.text == "") && (to.text = "0", ra(to, "b")), Dt == to.name && (Dt = "");+ }), to.onTextChangedObservable.add(() => {+ Dt == to.name && ra(to, "b");+ }), ti.addControl(to, 2, 2);+ const ta = new Hi();+ ta.name = "Hex Value", ta.width = 0.82, ta.addRowDefinition(1, !1), ta.addColumnDefinition(0.1, !1), ta.addColumnDefinition(0.9, !1), Vi.addControl(ta, 2, 0);+ const Qi = new zr();+ Qi.text = "#", Qi.color = Q, Qi.fontSize = at, ta.addControl(Qi, 0, 0);+ const lr = new bo();+ lr.width = 0.96, lr.height = 0.72, lr.name = "hexField", lr.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_CENTER, lr.fontSize = at;+ const Ad = d.lastColor.split("#");+ lr.text = Ad[1], lr.color = xt, lr.background = vt, lr.onFocusObservable.add(() => {+ Dt = lr.name, Sr = lr.text, gi(!1);+ }), lr.onBlurObservable.add(() => {+ if (lr.text.length == 3) {+ const ot = lr.text.split("");+ lr.text = ot[0] + ot[0] + ot[1] + ot[1] + ot[2] + ot[2];+ }+ lr.text == "" && (lr.text = "000000", Lo(nr.FromHexString(lr.text), "b")), Dt == lr.name && (Dt = "");+ }), lr.onTextChangedObservable.add(() => {+ let ot = lr.text;+ const Ht = /[^0-9A-F]/i.test(ot);+ if ((lr.text.length > 6 || Ht) && Dt == lr.name)+ lr.text = Sr;+ else {+ if (lr.text.length < 6) {+ const it = 6 - lr.text.length;+ for (let Po = 0; Po < it; Po++)+ ot = "0" + ot;+ }+ if (lr.text.length == 3) {+ const it = lr.text.split("");+ ot = it[0] + it[0] + it[1] + it[1] + it[2] + it[2];+ }+ ot = "#" + ot, Dt == lr.name && (Sr = lr.text, Lo(nr.FromHexString(ot), lr.name));+ }+ }), ta.addControl(lr, 0, 1), d.savedColors && d.savedColors.length > 0 && Ta("", tr);+ function Lo(ot, Ht) {+ Dt = Ht;+ const it = ot.toHexString();+ if (Ni.background = it, ko.name != Dt && (ko.text = Math.floor(ot.r * 255).toString()), vo.name != Dt && (vo.text = Math.floor(ot.g * 255).toString()), co.name != Dt && (co.text = Math.floor(ot.b * 255).toString()), uo.name != Dt && (uo.text = ot.r.toString()), fo.name != Dt && (fo.text = ot.g.toString()), to.name != Dt && (to.text = ot.b.toString()), lr.name != Dt) {+ const Po = it.split("#");+ lr.text = Po[1];+ }+ io.name != Dt && (io.value = ot);+ }+ function Da(ot, Ht) {+ let it = ot.text;+ if (/[^0-9]/g.test(it)) {+ ot.text = Sr;+ return;+ } else+ it != "" && (Math.floor(parseInt(it)) < 0 ? it = "0" : Math.floor(parseInt(it)) > 255 ? it = "255" : isNaN(parseInt(it)) && (it = "0")), Dt == ot.name && (Sr = it);+ if (it != "") {+ it = parseInt(it).toString(), ot.text = it;+ const xr = nr.FromHexString(Ni.background);+ Dt == ot.name && (Ht == "r" ? Lo(new nr(parseInt(it) / 255, xr.g, xr.b), ot.name) : Ht == "g" ? Lo(new nr(xr.r, parseInt(it) / 255, xr.b), ot.name) : Lo(new nr(xr.r, xr.g, parseInt(it) / 255), ot.name));+ }+ }+ function ra(ot, Ht) {+ let it = ot.text;+ if (/[^0-9.]/g.test(it)) {+ ot.text = Sr;+ return;+ } else+ it != "" && it != "." && parseFloat(it) != 0 && (parseFloat(it) < 0 ? it = "0.0" : parseFloat(it) > 1 ? it = "1.0" : isNaN(parseFloat(it)) && (it = "0.0")), Dt == ot.name && (Sr = it);+ it != "" && it != "." && parseFloat(it) != 0 ? (it = parseFloat(it).toString(), ot.text = it) : it = "0.0";+ const xr = nr.FromHexString(Ni.background);+ Dt == ot.name && (Ht == "r" ? Lo(new nr(parseFloat(it), xr.g, xr.b), ot.name) : Ht == "g" ? Lo(new nr(xr.r, parseFloat(it), xr.b), ot.name) : Lo(new nr(xr.r, xr.g, parseFloat(it)), ot.name));+ }+ function dl(ot) {+ d.savedColors && d.savedColors.splice(ot, 1), d.savedColors && d.savedColors.length == 0 && (ul(!1), qo = !1);+ }+ function gc() {+ if (d.savedColors && d.savedColors[Io]) {+ let ot;+ qo ? ot = "b" : ot = "";+ const Ht = Bs.CreateSimpleButton("Swatch_" + Io, ot);+ Ht.fontFamily = "coreglyphs";+ const it = nr.FromHexString(d.savedColors[Io]);+ it.r + it.g + it.b > Bt ? Ht.color = xe : Ht.color = yt, Ht.fontSize = Math.floor(F * 0.7), Ht.textBlock.verticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, Ht.height = Ht.width = F.toString() + "px", Ht.background = d.savedColors[Io], Ht.thickness = 2;+ const xr = Io;+ return Ht.pointerDownAnimation = () => {+ Ht.thickness = 4;+ }, Ht.pointerUpAnimation = () => {+ Ht.thickness = 3;+ }, Ht.pointerEnterAnimation = () => {+ Ht.thickness = 3;+ }, Ht.pointerOutAnimation = () => {+ Ht.thickness = 2;+ }, Ht.onPointerClickObservable.add(() => {+ qo ? (dl(xr), Ta("", tr)) : d.savedColors && Lo(nr.FromHexString(d.savedColors[xr]), Ht.name);+ }), Ht;+ } else+ return null;+ }+ function gi(ot) {+ ot !== void 0 && (qo = ot);+ let Ht;+ if (qo) {+ for (let it = 0; it < w.children.length; it++)+ Ht = w.children[it], Ht.textBlock.text = "b";+ Re !== void 0 && (Re.textBlock.text = "Done");+ } else {+ for (let it = 0; it < w.children.length; it++)+ Ht = w.children[it], Ht.textBlock.text = "";+ Re !== void 0 && (Re.textBlock.text = "Edit");+ }+ }+ function Ta(ot, Ht) {+ if (d.savedColors) {+ ot != "" && d.savedColors.push(ot), Io = 0, w.clearControls();+ const it = Math.ceil(d.savedColors.length / d.numSwatchesPerLine);+ let Po;+ if (it == 0 ? Po = 0 : Po = it + 1, w.rowCount != it + Po) {+ const xr = w.rowCount;+ for (let Ui = 0; Ui < xr; Ui++)+ w.removeRowDefinition(0);+ for (let Ui = 0; Ui < it + Po; Ui++)+ Ui % 2 ? w.addRowDefinition(F, !0) : w.addRowDefinition(N, !0);+ }+ w.height = (F * it + Po * N).toString() + "px";+ for (let xr = 1, Ui = 1; xr < it + Po; xr += 2, Ui++) {+ let In;+ d.savedColors.length > Ui * d.numSwatchesPerLine ? In = d.numSwatchesPerLine : In = d.savedColors.length - (Ui - 1) * d.numSwatchesPerLine;+ const Ea = Math.min(Math.max(In, 0), d.numSwatchesPerLine);+ for (let zn = 0, Ja = 1; zn < Ea; zn++) {+ if (zn > d.numSwatchesPerLine)+ continue;+ const zi = gc();+ if (zi != null)+ w.addControl(zi, xr, Ja), Ja += 2, Io++;+ else+ continue;+ }+ }+ d.savedColors.length >= d.swatchLimit ? oa(Ht, !0) : oa(Ht, !1);+ }+ }+ function ul(ot) {+ ot ? (Re = Bs.CreateSimpleButton("butEdit", "Edit"), Re.width = Nn, Re.height = za, Re.left = Math.floor(parseInt(Nn) * 0.1).toString() + "px", Re.top = (parseFloat(Re.left) * -1).toString() + "px", Re.verticalAlignment = pe.VERTICAL_ALIGNMENT_BOTTOM, Re.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, Re.thickness = 2, Re.color = Q, Re.fontSize = at, Re.background = X, Re.onPointerEnterObservable.add(() => {+ Re.background = he;+ }), Re.onPointerOutObservable.add(() => {+ Re.background = X;+ }), Re.pointerDownAnimation = () => {+ Re.background = Me;+ }, Re.pointerUpAnimation = () => {+ Re.background = he;+ }, Re.onPointerClickObservable.add(() => {+ qo ? qo = !1 : qo = !0, gi();+ }), Wo.addControl(Re, 1, 0)) : Wo.removeControl(Re);+ }+ function oa(ot, Ht) {+ Ht ? (ot.color = p, ot.background = De) : (ot.color = Q, ot.background = X);+ }+ function ia(ot) {+ d.savedColors && d.savedColors.length > 0 ? g({+ savedColors: d.savedColors,+ pickedColor: ot+ }) : g({+ pickedColor: ot+ }), i.removeControl(Yr);+ }+ });+ }+}+an._Epsilon = 1e-6;+q([+ H()+], an.prototype, "value", null);+q([+ H()+], an.prototype, "width", null);+q([+ H()+], an.prototype, "height", null);+q([+ H()+], an.prototype, "size", null);+kr("BABYLON.GUI.ColorPicker", an);+class Lb extends wi {+ /** Gets or sets border thickness */+ get thickness() {+ return this._thickness;+ }+ set thickness(i) {+ this._thickness !== i && (this._thickness = i, this._markAsDirty());+ }+ /** Gets or sets arcing of the ellipse (ratio of the circumference between 0 and 1) */+ get arc() {+ return this._arc;+ }+ set arc(i) {+ this._arc !== i && (this._arc = i, this._markAsDirty());+ }+ /**+ * Creates a new Ellipse+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._thickness = 1, this._arc = 1;+ }+ _getTypeName() {+ return "Ellipse";+ }+ _localDraw(i) {+ i.save(), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), pe.drawEllipse(this._currentMeasure.left + this._currentMeasure.width / 2, this._currentMeasure.top + this._currentMeasure.height / 2, this._currentMeasure.width / 2 - this._thickness / 2, this._currentMeasure.height / 2 - this._thickness / 2, this._arc, i), (this._backgroundGradient || this._background) && (i.fillStyle = this._getBackgroundColor(i), i.fill()), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), this._thickness && (this.color && (i.strokeStyle = this.color), i.lineWidth = this._thickness, i.stroke()), i.restore();+ }+ _additionalProcessing(i, d) {+ super._additionalProcessing(i, d), this._measureForChildren.width -= 2 * this._thickness, this._measureForChildren.height -= 2 * this._thickness, this._measureForChildren.left += this._thickness, this._measureForChildren.top += this._thickness;+ }+ _clipForChildren(i) {+ pe.drawEllipse(this._currentMeasure.left + this._currentMeasure.width / 2, this._currentMeasure.top + this._currentMeasure.height / 2, this._currentMeasure.width / 2, this._currentMeasure.height / 2, this._arc, i), i.clip();+ }+ _renderHighlightSpecific(i) {+ pe.drawEllipse(this._currentMeasure.left + this._currentMeasure.width / 2, this._currentMeasure.top + this._currentMeasure.height / 2, this._currentMeasure.width / 2 - this._highlightLineWidth / 2, this._currentMeasure.height / 2 - this._highlightLineWidth / 2, this._arc, i), i.stroke();+ }+}+q([+ H()+], Lb.prototype, "thickness", null);+q([+ H()+], Lb.prototype, "arc", null);+kr("BABYLON.GUI.Ellipse", Lb);+class nS extends Bs {+ constructor(i) {+ super(i), this.name = i, this._unfocusedColor = this.color;+ }+ /**+ * @internal+ */+ _onPointerDown(i, d, g, y, M) {+ return this.isReadOnly || this.focus(), super._onPointerDown(i, d, g, y, M);+ }+}+kr("BABYLON.GUI.FocusableButton", nS);+class Au extends bo {+ /** Gets or sets a boolean indicating if the control can auto stretch its height to adapt to the text */+ get autoStretchHeight() {+ return this._autoStretchHeight;+ }+ set autoStretchHeight(i) {+ this._autoStretchHeight !== i && (this._autoStretchHeight = i, this._markAsDirty());+ }+ set height(i) {+ this.fixedRatioMasterIsWidth = !1, this._height.toString(this._host) !== i && (this._height.fromString(i) && this._markAsDirty(), this._autoStretchHeight = !1);+ }+ get maxHeight() {+ return this._maxHeight.toString(this._host);+ }+ /** Gets the maximum width allowed by the control in pixels */+ get maxHeightInPixels() {+ return this._maxHeight.getValueInPixel(this._host, this._cachedParentMeasure.height);+ }+ set maxHeight(i) {+ this._maxHeight.toString(this._host) !== i && this._maxHeight.fromString(i) && this._markAsDirty();+ }+ /**+ * Creates a new InputTextArea+ * @param name defines the control name+ * @param text defines the text of the control+ */+ constructor(i, d = "") {+ super(i), this.name = i, this._textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this._textVerticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, this._prevText = this.text, this._lineSpacing = new St(0), this._maxHeight = new St(1, St.UNITMODE_PERCENTAGE, !1), this.onLinesReadyObservable = new qt(), this.text = d, this.isPointerBlocker = !0, this.onLinesReadyObservable.add(() => this._updateCursorPosition()), this._highlightCursorInfo = {+ initialStartIndex: -1,+ initialRelativeStartIndex: -1,+ initialLineIndex: -1+ }, this._cursorInfo = {+ globalStartIndex: 0,+ globalEndIndex: 0,+ relativeEndIndex: 0,+ relativeStartIndex: 0,+ currentLineIndex: 0+ };+ }+ _getTypeName() {+ return "InputTextArea";+ }+ /**+ * Handles the keyboard event+ * @param evt Defines the KeyboardEvent+ */+ processKeyboard(i) {+ this.isReadOnly || (this.alternativeProcessKey(i.code, i.key, i), this.onKeyboardEventProcessedObservable.notifyObservers(i));+ }+ /**+ * Process the last keyboard input+ *+ * @param code The ascii input number+ * @param key The key string representation+ * @param evt The keyboard event emits with input+ * @internal+ */+ alternativeProcessKey(i, d, g) {+ if (!(g && (g.ctrlKey || g.metaKey) && (d === "c" || d === "v" || d === "x"))) {+ switch (i) {+ case "Period":+ g && g.shiftKey && g.preventDefault();+ break;+ case "Backspace":+ !this._isTextHighlightOn && this._cursorInfo.globalStartIndex > 0 && (this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex, this._cursorInfo.globalStartIndex--), this._prevText = this._textWrapper.text, this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex), this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex, g && g.preventDefault(), this._blinkIsEven = !1, this._isTextHighlightOn = !1, this._textHasChanged();+ break;+ case "Delete":+ !this._isTextHighlightOn && this._cursorInfo.globalEndIndex < this.text.length && (this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex + 1), this._prevText = this._textWrapper.text, this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex), this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex, g && g.preventDefault(), this._blinkIsEven = !1, this._isTextHighlightOn = !1, this._textHasChanged();+ break;+ case "NumpadEnter":+ case "Enter":+ this._prevText = this._textWrapper.text, this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, `+`), this._cursorInfo.globalStartIndex++, this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex, this._blinkIsEven = !1, this._isTextHighlightOn = !1, this._textHasChanged();+ return;+ case "End":+ this._cursorInfo.globalStartIndex = this.text.length, this._blinkIsEven = !1, this._isTextHighlightOn = !1, this._markAsDirty();+ return;+ case "Home":+ this._cursorInfo.globalStartIndex = 0, this._blinkIsEven = !1, this._isTextHighlightOn = !1, this._markAsDirty();+ return;+ case "ArrowLeft":+ if (this._markAsDirty(), g && g.shiftKey) {+ (g.ctrlKey || g.metaKey) && (this._cursorInfo.globalStartIndex -= this._cursorInfo.relativeStartIndex, this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex), this._isTextHighlightOn ? this._cursorInfo.globalEndIndex > this._highlightCursorInfo.initialStartIndex ? this._cursorInfo.globalEndIndex-- : this._cursorInfo.globalStartIndex-- : (this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex, this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex, this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex, this._cursorInfo.globalStartIndex--, this._isTextHighlightOn = !0), this._blinkIsEven = !0, g.preventDefault();+ return;+ }+ this._isTextHighlightOn ? this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex : g && (g.ctrlKey || g.metaKey) ? (this._cursorInfo.globalStartIndex -= this._cursorInfo.relativeStartIndex, g.preventDefault()) : this._cursorInfo.globalStartIndex > 0 && this._cursorInfo.globalStartIndex--, this._blinkIsEven = !1, this._isTextHighlightOn = !1;+ return;+ case "ArrowRight":+ if (this._markAsDirty(), g && g.shiftKey) {+ if (g.ctrlKey || g.metaKey) {+ const y = this._lines[this._cursorInfo.currentLineIndex].text.length - this._cursorInfo.relativeEndIndex - 1;+ this._cursorInfo.globalEndIndex += y, this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;+ }+ this._isTextHighlightOn ? this._cursorInfo.globalStartIndex < this._highlightCursorInfo.initialStartIndex ? this._cursorInfo.globalStartIndex++ : this._cursorInfo.globalEndIndex++ : (this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex, this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex, this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex++, this._isTextHighlightOn = !0), this._blinkIsEven = !0, g.preventDefault();+ return;+ }+ if (this._isTextHighlightOn)+ this._cursorInfo.globalStartIndex = this._cursorInfo.globalEndIndex;+ else if (g && (g.ctrlKey || g.metaKey)) {+ const y = this._lines[this._cursorInfo.currentLineIndex].text.length - this._cursorInfo.relativeEndIndex;+ this._cursorInfo.globalStartIndex += y;+ } else this._cursorInfo.globalStartIndex < this.text.length && this._cursorInfo.globalStartIndex++;+ this._blinkIsEven = !1, this._isTextHighlightOn = !1;+ return;+ case "ArrowUp":+ if (this._blinkIsEven = !1, g && (g.shiftKey ? (this._isTextHighlightOn || (this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex, this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex), this._isTextHighlightOn = !0, this._blinkIsEven = !0) : this._isTextHighlightOn = !1, g.preventDefault()), this._cursorInfo.currentLineIndex === 0)+ this._cursorInfo.globalStartIndex = 0;+ else {+ const y = this._lines[this._cursorInfo.currentLineIndex], M = this._lines[this._cursorInfo.currentLineIndex - 1];+ let N, O;+ !this._isTextHighlightOn || this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex ? (N = this._cursorInfo.globalStartIndex, O = this._cursorInfo.relativeStartIndex) : (N = this._cursorInfo.globalEndIndex, O = this._cursorInfo.relativeEndIndex);+ const F = y.text.substring(0, O), ne = this._contextForBreakLines.measureText(F).width;+ let $ = 0, Q = 0;+ N -= O, N -= M.text.length + M.lineEnding.length;+ let X = 0;+ for (; $ < ne && X < M.text.length; )+ N++, X++, Q = Math.abs(ne - $), $ = this._contextForBreakLines.measureText(M.text.substring(0, X)).width;+ Math.abs(ne - $) > Q && X > 0 && N--, this._isTextHighlightOn ? this._cursorInfo.currentLineIndex <= this._highlightCursorInfo.initialLineIndex ? (this._cursorInfo.globalStartIndex = N, this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex, this._cursorInfo.relativeEndIndex = this._highlightCursorInfo.initialRelativeStartIndex) : this._cursorInfo.globalEndIndex = N : this._cursorInfo.globalStartIndex = N;+ }+ this._markAsDirty();+ return;+ case "ArrowDown":+ if (this._blinkIsEven = !1, g && (g.shiftKey ? (this._isTextHighlightOn || (this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex, this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex), this._isTextHighlightOn = !0, this._blinkIsEven = !0) : this._isTextHighlightOn = !1, g.preventDefault()), this._cursorInfo.currentLineIndex === this._lines.length - 1)+ this._cursorInfo.globalStartIndex = this.text.length;+ else {+ const y = this._lines[this._cursorInfo.currentLineIndex], M = this._lines[this._cursorInfo.currentLineIndex + 1];+ let N, O;+ !this._isTextHighlightOn || this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex ? (N = this._cursorInfo.globalStartIndex, O = this._cursorInfo.relativeStartIndex) : (N = this._cursorInfo.globalEndIndex, O = this._cursorInfo.relativeEndIndex);+ const F = y.text.substring(0, O), ne = this._contextForBreakLines.measureText(F).width;+ let $ = 0, Q = 0;+ N += y.text.length - O + y.lineEnding.length;+ let X = 0;+ for (; $ < ne && X < M.text.length; )+ N++, X++, Q = Math.abs(ne - $), $ = this._contextForBreakLines.measureText(M.text.substring(0, X)).width;+ Math.abs(ne - $) > Q && X > 0 && N--, this._isTextHighlightOn ? this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex ? (this._cursorInfo.globalStartIndex = N, this._cursorInfo.globalStartIndex > this._cursorInfo.globalEndIndex && (this._cursorInfo.globalEndIndex += this._cursorInfo.globalStartIndex, this._cursorInfo.globalStartIndex = this._cursorInfo.globalEndIndex - this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex -= this._cursorInfo.globalStartIndex)) : (this._cursorInfo.globalEndIndex = N, this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex) : this._cursorInfo.globalStartIndex = N;+ }+ this._markAsDirty();+ return;+ }+ if (d === "a" && g && (g.ctrlKey || g.metaKey)) {+ this.selectAllText(), g.preventDefault();+ return;+ }+ d?.length === 1 && (g?.preventDefault(), this._currentKey = d, this.onBeforeKeyAddObservable.notifyObservers(this), d = this._currentKey, this._addKey && (this._isTextHighlightOn = !1, this._blinkIsEven = !1, this._prevText = this._textWrapper.text, this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, d), this._cursorInfo.globalStartIndex += d.length, this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex, this._textHasChanged()));+ }+ }+ _parseLineWordWrap(i = "", d, g) {+ const y = [], M = i.split(" ");+ let N = 0;+ for (let O = 0; O < M.length; O++) {+ const F = O > 0 ? i + " " + M[O] : M[0], $ = g.measureText(F).width;+ if ($ > d) {+ O > 0 && (N = g.measureText(i).width, y.push({ text: i, width: N, lineEnding: " " })), i = M[O];+ let Q = "";+ i.split("").map((X) => {+ g.measureText(Q + X).width > d && (y.push({ text: Q, width: g.measureText(Q).width, lineEnding: "" }), Q = ""), Q += X;+ }), i = Q, N = g.measureText(i).width;+ } else+ N = $, i = F;+ }+ return y.push({ text: i, width: N, lineEnding: " " }), y;+ }+ _breakLines(i, d) {+ const g = [], y = (this.text || this.placeholderText).split(`+`);+ if (this.clipContent)+ for (const M of y)+ g.push(...this._parseLineWordWrap(M, i, d));+ else+ for (const M of y)+ g.push(this._parseLine(M, d));+ return g[g.length - 1].lineEnding = `+`, g;+ }+ _parseLine(i = "", d) {+ return { text: i, width: d.measureText(i).width, lineEnding: " " };+ }+ /**+ * Processing of child right before the parent measurement update+ *+ * @param parentMeasure The parent measure+ * @param context The rendering canvas+ * @internal+ */+ _preMeasure(i, d) {+ (!this._fontOffset || this._wasDirty) && (this._fontOffset = pe._GetFontOffset(d.font, this._host.getScene()?.getEngine()));+ let g = this._beforeRenderText(this._textWrapper).text;+ !this.text && this._placeholderText && (g = this._placeholderText), this._textWidth = d.measureText(g).width;+ const y = this._margin.getValueInPixel(this._host, i.width) * 2;+ if (this._autoStretchWidth) {+ const O = g.split(`+`).reduce((ne, $) => {+ const Q = d.measureText($).width, X = d.measureText(ne).width;+ return Q > X ? $ : ne;+ }, ""), F = d.measureText(O).width;+ this.width = Math.min(this._maxWidth.getValueInPixel(this._host, i.width), F + y) + "px", this.autoStretchWidth = !0;+ }+ if (this._availableWidth = this._width.getValueInPixel(this._host, i.width) - y, this._lines = this._breakLines(this._availableWidth, d), this._contextForBreakLines = d, this._autoStretchHeight) {+ const O = this._lines.length * this._fontOffset.height + this._margin.getValueInPixel(this._host, i.height) * 2;+ this.height = Math.min(this._maxHeight.getValueInPixel(this._host, i.height), O) + "px", this._autoStretchHeight = !0;+ }+ const M = this._margin.getValueInPixel(this._host, i.height) * 2;+ if (this._availableHeight = this._height.getValueInPixel(this._host, i.height) - M, this._isFocused) {+ this._cursorInfo.currentLineIndex = 0;+ let N = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length, O = 0;+ for (; O + N <= this._cursorInfo.globalStartIndex; )+ O += N, this._cursorInfo.currentLineIndex < this._lines.length - 1 && (this._cursorInfo.currentLineIndex++, N = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length);+ }+ }+ _textHasChanged() {+ !this._prevText && this._textWrapper.text && this.placeholderText && (this._cursorInfo.currentLineIndex = 0, this._cursorInfo.globalStartIndex = 1, this._cursorInfo.globalEndIndex = 1, this._cursorInfo.relativeStartIndex = 1, this._cursorInfo.relativeEndIndex = 1), super._textHasChanged();+ }+ _computeScroll() {+ if (this._clipTextLeft = this._currentMeasure.left + this._margin.getValueInPixel(this._host, this._cachedParentMeasure.width), this._clipTextTop = this._currentMeasure.top + this._margin.getValueInPixel(this._host, this._cachedParentMeasure.height), this._isFocused && this._lines[this._cursorInfo.currentLineIndex].width > this._availableWidth) {+ const i = this._clipTextLeft - this._lines[this._cursorInfo.currentLineIndex].width + this._availableWidth;+ this._scrollLeft || (this._scrollLeft = i);+ } else+ this._scrollLeft = this._clipTextLeft;+ if (this._isFocused) {+ const i = (this._cursorInfo.currentLineIndex + 1) * this._fontOffset.height, d = this._clipTextTop - i;+ this._scrollTop || (this._scrollTop = d);+ } else+ this._scrollTop = this._clipTextTop;+ }+ /**+ * Processing of child after the parent measurement update+ *+ * @internal+ */+ _additionalProcessing() {+ this.highlightedText = "", this.onLinesReadyObservable.notifyObservers(this);+ }+ _drawText(i, d, g, y) {+ const M = this._currentMeasure.width;+ let N = this._scrollLeft;+ switch (this._textHorizontalAlignment) {+ case pe.HORIZONTAL_ALIGNMENT_LEFT:+ N += 0;+ break;+ case pe.HORIZONTAL_ALIGNMENT_RIGHT:+ N += M - d;+ break;+ case pe.HORIZONTAL_ALIGNMENT_CENTER:+ N += (M - d) / 2;+ break;+ }+ (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (y.shadowColor = this.shadowColor, y.shadowBlur = this.shadowBlur, y.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, y.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), this.outlineWidth && y.strokeText(i, this._currentMeasure.left + N, g), y.fillText(i, N, g);+ }+ /**+ * Copy the text in the clipboard+ *+ * @param ev The clipboard event+ * @internal+ */+ _onCopyText(i) {+ this._isTextHighlightOn = !1;+ try {+ i.clipboardData && i.clipboardData.setData("text/plain", this._highlightedText);+ } catch {+ }+ this._host.clipboardData = this._highlightedText;+ }+ /**+ * Cut the text and copy it in the clipboard+ *+ * @param ev The clipboard event+ * @internal+ */+ _onCutText(i) {+ if (this._highlightedText) {+ try {+ i.clipboardData && i.clipboardData.setData("text/plain", this._highlightedText);+ } catch {+ }+ this._host.clipboardData = this._highlightedText, this._prevText = this._textWrapper.text, this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex), this._textHasChanged();+ }+ }+ /**+ * Paste the copied text from the clipboard+ *+ * @param ev The clipboard event+ * @internal+ */+ _onPasteText(i) {+ let d;+ i.clipboardData && i.clipboardData.types.indexOf("text/plain") !== -1 ? d = i.clipboardData.getData("text/plain") : d = this._host.clipboardData, this._isTextHighlightOn = !1, this._prevText = this._textWrapper.text, this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, d);+ const g = d.length - (this._cursorInfo.globalEndIndex - this._cursorInfo.globalStartIndex);+ this._cursorInfo.globalStartIndex += g, this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex, this._clickedCoordinateX = null, this._clickedCoordinateY = null, super._textHasChanged();+ }+ _draw(i) {+ this._computeScroll(), this._scrollLeft = this._scrollLeft ?? 0, this._scrollTop = this._scrollTop ?? 0, i.save(), this._applyStates(i), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), this._isFocused ? this._focusedBackground && (i.fillStyle = this._isEnabled ? this._focusedBackground : this._disabledColor, i.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height)) : this._background && (i.fillStyle = this._isEnabled ? this._background : this._disabledColor, i.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height)), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), this.color && (i.fillStyle = this.color);+ const d = this._currentMeasure.height, g = this._currentMeasure.width;+ let y = 0;+ switch (this._textVerticalAlignment) {+ case pe.VERTICAL_ALIGNMENT_TOP:+ y = this._fontOffset.ascent;+ break;+ case pe.VERTICAL_ALIGNMENT_BOTTOM:+ y = d - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;+ break;+ case pe.VERTICAL_ALIGNMENT_CENTER:+ y = this._fontOffset.ascent + (d - this._fontOffset.height * this._lines.length) / 2;+ break;+ }+ i.save(), i.beginPath(), i.fillStyle = this.fontStyle, !this._textWrapper.text && this.placeholderText && (i.fillStyle = this._placeholderColor), i.rect(this._clipTextLeft, this._clipTextTop, this._availableWidth + 2, this._availableHeight + 2), i.clip(), y += this._scrollTop;+ for (let M = 0; M < this._lines.length; M++) {+ const N = this._lines[M];+ M !== 0 && this._lineSpacing.internalValue !== 0 && (this._lineSpacing.isPixel ? y += this._lineSpacing.getValue(this._host) : y = y + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height)), this._drawText(N.text, N.width, y, i), y += this._fontOffset.height;+ }+ if (i.restore(), this._isFocused) {+ if (!this._blinkIsEven || this._isTextHighlightOn) {+ let M = this._scrollLeft + i.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substring(0, this._cursorInfo.relativeStartIndex)).width;+ M < this._clipTextLeft ? (this._scrollLeft += this._clipTextLeft - M, M = this._clipTextLeft, this._markAsDirty()) : M > this._clipTextLeft + this._availableWidth && (this._scrollLeft += this._clipTextLeft + this._availableWidth - M, M = this._clipTextLeft + this._availableWidth, this._markAsDirty());+ let N = this._scrollTop + this._cursorInfo.currentLineIndex * this._fontOffset.height;+ N < this._clipTextTop ? (this._scrollTop += this._clipTextTop - N, N = this._clipTextTop, this._markAsDirty()) : N + this._fontOffset.height > this._clipTextTop + this._availableHeight && this._availableHeight > this._fontOffset.height && (this._scrollTop += this._clipTextTop + this._availableHeight - N - this._fontOffset.height, N = this._clipTextTop + this._availableHeight - this._fontOffset.height, this._markAsDirty()), this._isTextHighlightOn || i.fillRect(M, N, 2, this._fontOffset.height);+ }+ if (this._resetBlinking(), this._isTextHighlightOn) {+ clearTimeout(this._blinkTimeout), this._highlightedText = this.text.substring(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex), i.globalAlpha = this._highlighterOpacity, i.fillStyle = this._textHighlightColor;+ const M = Math.min(this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialLineIndex), N = Math.max(this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialLineIndex);+ let O = this._scrollTop + M * this._fontOffset.height;+ for (let F = M; F <= N; F++) {+ const ne = this._lines[F];+ let $ = this._scrollLeft;+ switch (this._textHorizontalAlignment) {+ case pe.HORIZONTAL_ALIGNMENT_LEFT:+ $ += 0;+ break;+ case pe.HORIZONTAL_ALIGNMENT_RIGHT:+ $ += g - ne.width;+ break;+ case pe.HORIZONTAL_ALIGNMENT_CENTER:+ $ += (g - ne.width) / 2;+ break;+ }+ const Q = F === M ? this._cursorInfo.relativeStartIndex : 0, X = F === N ? this._cursorInfo.relativeEndIndex : ne.text.length, he = i.measureText(ne.text.substring(0, Q)).width, Me = ne.text.substring(Q, X), p = i.measureText(Me).width;+ i.fillRect($ + he, O, p, this._fontOffset.height), O += this._fontOffset.height;+ }+ this._cursorInfo.globalEndIndex === this._cursorInfo.globalStartIndex && this._resetBlinking();+ }+ }+ i.restore(), this._thickness && (this._isFocused ? this.focusedColor && (i.strokeStyle = this.focusedColor) : this.color && (i.strokeStyle = this.color), i.lineWidth = this._thickness, i.strokeRect(this._currentMeasure.left + this._thickness / 2, this._currentMeasure.top + this._thickness / 2, this._currentMeasure.width - this._thickness, this._currentMeasure.height - this._thickness));+ }+ _resetBlinking() {+ clearTimeout(this._blinkTimeout), this._blinkTimeout = setTimeout(() => {+ this._blinkIsEven = !this._blinkIsEven, this._markAsDirty();+ }, 500);+ }+ _onPointerDown(i, d, g, y, M) {+ return super._onPointerDown(i, d, g, y, M) ? this.isReadOnly ? !0 : (this._clickedCoordinateX = d.x, this._clickedCoordinateY = d.y, this._isTextHighlightOn = !1, this._highlightedText = "", this._isPointerDown = !0, this._host._capturingControl[g] = this, this._host.focusedControl === this ? (clearTimeout(this._blinkTimeout), this._markAsDirty(), !0) : this._isEnabled ? (this._host.focusedControl = this, !0) : !1) : !1;+ }+ // for textselection+ _onPointerMove(i, d, g, y) {+ y.event.movementX === 0 && y.event.movementY === 0 || (this._host.focusedControl === this && this._isPointerDown && !this.isReadOnly && (this._clickedCoordinateX = d.x, this._clickedCoordinateY = d.y, this._isTextHighlightOn || (this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex, this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex, this._isTextHighlightOn = !0), this._markAsDirty()), super._onPointerMove(i, d, g, y));+ }+ /**+ * Apply the correct position of cursor according to current modification+ */+ _updateCursorPosition() {+ if (this._isFocused)+ if (!this._textWrapper.text && this.placeholderText)+ this._cursorInfo.currentLineIndex = 0, this._cursorInfo.globalStartIndex = 0, this._cursorInfo.globalEndIndex = 0, this._cursorInfo.relativeStartIndex = 0, this._cursorInfo.relativeEndIndex = 0;+ else if (this._clickedCoordinateX && this._clickedCoordinateY) {+ this._isTextHighlightOn || (this._cursorInfo = {+ globalStartIndex: 0,+ globalEndIndex: 0,+ relativeStartIndex: 0,+ relativeEndIndex: 0,+ currentLineIndex: 0+ });+ let i = 0, d = 0;+ const g = this._clickedCoordinateY - this._scrollTop, y = Math.floor(g / this._fontOffset.height);+ this._cursorInfo.currentLineIndex = Math.min(Math.max(y, 0), this._lines.length - 1);+ let M = 0;+ const N = this._clickedCoordinateX - (this._scrollLeft ?? 0);+ let O = 0;+ for (let F = 0; F < this._cursorInfo.currentLineIndex; F++) {+ const ne = this._lines[F];+ i += ne.text.length + ne.lineEnding.length;+ }+ for (; M < N && this._lines[this._cursorInfo.currentLineIndex].text.length > d; )+ d++, O = Math.abs(N - M), M = this._contextForBreakLines.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substring(0, d)).width;+ Math.abs(N - M) > O && d > 0 && d--, i += d, this._isTextHighlightOn ? i < this._highlightCursorInfo.initialStartIndex ? (this._cursorInfo.globalStartIndex = i, this._cursorInfo.relativeStartIndex = d, this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex, this._cursorInfo.relativeEndIndex = this._highlightCursorInfo.initialRelativeStartIndex) : (this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex, this._cursorInfo.relativeStartIndex = this._highlightCursorInfo.initialRelativeStartIndex, this._cursorInfo.globalEndIndex = i, this._cursorInfo.relativeEndIndex = d) : (this._cursorInfo.globalStartIndex = i, this._cursorInfo.relativeStartIndex = d, this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex, this._cursorInfo.relativeEndIndex = this._cursorInfo.relativeStartIndex), this._blinkIsEven = this._isTextHighlightOn, this._clickedCoordinateX = null, this._clickedCoordinateY = null;+ } else {+ this._cursorInfo.relativeStartIndex = 0, this._cursorInfo.currentLineIndex = 0;+ let i = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length, d = 0;+ for (; d + i <= this._cursorInfo.globalStartIndex; )+ d += i, this._cursorInfo.currentLineIndex < this._lines.length - 1 && (this._cursorInfo.currentLineIndex++, i = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length);+ if (this._cursorInfo.relativeStartIndex = this._cursorInfo.globalStartIndex - d, !this._isTextHighlightOn)+ this._cursorInfo.relativeEndIndex = this._cursorInfo.relativeStartIndex, this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;+ else if (this._highlightCursorInfo.initialStartIndex !== -1 && this._cursorInfo.globalStartIndex >= this._highlightCursorInfo.initialStartIndex) {+ for (; d + i <= this._cursorInfo.globalEndIndex; )+ d += i, this._cursorInfo.currentLineIndex < this._lines.length - 1 && (this._cursorInfo.currentLineIndex++, i = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length);+ this._cursorInfo.relativeEndIndex = this._cursorInfo.globalEndIndex - d;+ }+ }+ }+ /**+ * Update all values of cursor information based on cursorIndex value+ *+ * @param offset The index to take care of+ * @internal+ */+ // eslint-disable-next-line @typescript-eslint/no-unused-vars+ _updateValueFromCursorIndex(i) {+ }+ /**+ * Select the word immediatly under the cursor on double click+ *+ * @param _evt Pointer informations of double click+ * @internal+ */+ _processDblClick(i) {+ let d, g;+ do+ d = this._cursorInfo.globalStartIndex > 0 && this._textWrapper.isWord(this._cursorInfo.globalStartIndex - 1) ? --this._cursorInfo.globalStartIndex : 0, g = this._cursorInfo.globalEndIndex < this._textWrapper.length && this._textWrapper.isWord(this._cursorInfo.globalEndIndex) ? ++this._cursorInfo.globalEndIndex : 0;+ while (d || g);+ this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex, this.onTextHighlightObservable.notifyObservers(this), this._isTextHighlightOn = !0, this._blinkIsEven = !0, this._markAsDirty();+ }+ /** @internal */+ selectAllText() {+ this._isTextHighlightOn = !0, this._blinkIsEven = !0, this._highlightCursorInfo = {+ initialStartIndex: 0,+ initialRelativeStartIndex: 0,+ initialLineIndex: 0+ }, this._cursorInfo = {+ globalStartIndex: 0,+ globalEndIndex: this._textWrapper.length,+ relativeEndIndex: this._lines[this._lines.length - 1].text.length,+ relativeStartIndex: 0,+ currentLineIndex: this._lines.length - 1+ }, this._markAsDirty();+ }+ dispose() {+ super.dispose(), this.onLinesReadyObservable.clear();+ }+}+q([+ H()+], Au.prototype, "autoStretchHeight", null);+q([+ H()+], Au.prototype, "maxHeight", null);+kr("BABYLON.GUI.InputTextArea", Au);+class aS extends bo {+ _getTypeName() {+ return "InputPassword";+ }+ _beforeRenderText(i) {+ const d = new Ab();+ let g = "";+ for (let y = 0; y < i.length; y++)+ g += "•";+ return d.text = g, d;+ }+}+kr("BABYLON.GUI.InputPassword", aS);+class ll extends pe {+ /** Gets or sets the dash pattern */+ get dash() {+ return this._dash;+ }+ set dash(i) {+ this._dash !== i && (this._dash = i, this._markAsDirty());+ }+ /** Gets or sets the control connected with the line end */+ get connectedControl() {+ return this._connectedControl;+ }+ set connectedControl(i) {+ this._connectedControl === i || i instanceof ll && i._connectedControl === this || (this._connectedControlDirtyObserver && this._connectedControl && (this._connectedControl.onDirtyObservable.remove(this._connectedControlDirtyObserver), this._connectedControlDirtyObserver = null), i && (this._connectedControlDirtyObserver = i.onDirtyObservable.add(() => this._markAsDirty())), this._connectedControl = i, this._markAsDirty());+ }+ /** Gets or sets start coordinates on X axis */+ get x1() {+ return this._x1.toString(this._host);+ }+ set x1(i) {+ this._x1.toString(this._host) !== i && this._x1.fromString(i) && this._markAsDirty();+ }+ /** Gets or sets start coordinates on Y axis */+ get y1() {+ return this._y1.toString(this._host);+ }+ set y1(i) {+ this._y1.toString(this._host) !== i && this._y1.fromString(i) && this._markAsDirty();+ }+ /** Gets or sets end coordinates on X axis */+ get x2() {+ return this._x2.toString(this._host);+ }+ set x2(i) {+ this._x2.toString(this._host) !== i && this._x2.fromString(i) && this._markAsDirty();+ }+ /** Gets or sets end coordinates on Y axis */+ get y2() {+ return this._y2.toString(this._host);+ }+ set y2(i) {+ this._y2.toString(this._host) !== i && this._y2.fromString(i) && this._markAsDirty();+ }+ /** Gets or sets line width */+ get lineWidth() {+ return this._lineWidth;+ }+ set lineWidth(i) {+ this._lineWidth !== i && (this._lineWidth = i, this._markAsDirty());+ }+ /** Gets or sets horizontal alignment */+ set horizontalAlignment(i) {+ }+ /** Gets or sets vertical alignment */+ set verticalAlignment(i) {+ }+ /** @internal */+ get _effectiveX2() {+ return (this._connectedControl ? this._connectedControl.centerX : 0) + this._x2.getValue(this._host);+ }+ /** @internal */+ get _effectiveY2() {+ return (this._connectedControl ? this._connectedControl.centerY : 0) + this._y2.getValue(this._host);+ }+ /**+ * Creates a new Line+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._lineWidth = 1, this._x1 = new St(0), this._y1 = new St(0), this._x2 = new St(0), this._y2 = new St(0), this._dash = new Array(), this._automaticSize = !0, this.isHitTestVisible = !1, this._horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this._verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP;+ }+ _getTypeName() {+ return "Line";+ }+ _draw(i) {+ i.save(), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), this._applyStates(i), i.strokeStyle = this._getColor(i), i.lineWidth = this._lineWidth, i.setLineDash(this._dash), i.beginPath(), i.moveTo(this._cachedParentMeasure.left + this._x1.getValue(this._host), this._cachedParentMeasure.top + this._y1.getValue(this._host)), i.lineTo(this._cachedParentMeasure.left + this._effectiveX2, this._cachedParentMeasure.top + this._effectiveY2), i.stroke(), i.restore();+ }+ _measure() {+ this._currentMeasure.width = Math.abs(this._x1.getValue(this._host) - this._effectiveX2) + this._lineWidth, this._currentMeasure.height = Math.abs(this._y1.getValue(this._host) - this._effectiveY2) + this._lineWidth;+ }+ _layout(i, d) {+ return this._connectedControl && this._connectedControl._layout(i, d), super._layout(i, d);+ }+ _computeAlignment(i) {+ this._currentMeasure.left = i.left + Math.min(this._x1.getValue(this._host), this._effectiveX2) - this._lineWidth / 2, this._currentMeasure.top = i.top + Math.min(this._y1.getValue(this._host), this._effectiveY2) - this._lineWidth / 2;+ }+ /**+ * Move one end of the line given 3D cartesian coordinates.+ * @param position Targeted world position+ * @param scene Scene+ * @param end (opt) Set to true to assign x2 and y2 coordinates of the line. Default assign to x1 and y1.+ */+ moveToVector3(i, d, g = !1) {+ if (!this._host || this.parent !== this._host._rootContainer) {+ Lr.Error("Cannot move a control to a vector3 if the control is not at root level");+ return;+ }+ const y = this._host._getGlobalViewport(), M = Se.Project(i, Oh.IdentityReadOnly, d.getTransformMatrix(), y);+ if (this._moveToProjectedPosition(M, g), M.z < 0 || M.z > 1) {+ this.notRenderable = !0;+ return;+ }+ this.notRenderable = !1;+ }+ /**+ * Move one end of the line to a position in screen absolute space.+ * @param projectedPosition Position in screen absolute space (X, Y)+ * @param end (opt) Set to true to assign x2 and y2 coordinates of the line. Default assign to x1 and y1.+ */+ _moveToProjectedPosition(i, d = !1) {+ const g = i.x + this._linkOffsetX.getValue(this._host) + "px", y = i.y + this._linkOffsetY.getValue(this._host) + "px";+ d ? (this.x2 = g, this.y2 = y, this._x2.ignoreAdaptiveScaling = !0, this._y2.ignoreAdaptiveScaling = !0) : (this.x1 = g, this.y1 = y, this._x1.ignoreAdaptiveScaling = !0, this._y1.ignoreAdaptiveScaling = !0);+ }+}+q([+ H()+], ll.prototype, "dash", null);+q([+ H()+], ll.prototype, "x1", null);+q([+ H()+], ll.prototype, "y1", null);+q([+ H()+], ll.prototype, "x2", null);+q([+ H()+], ll.prototype, "y2", null);+q([+ H()+], ll.prototype, "lineWidth", null);+kr("BABYLON.GUI.Line", ll);+class nw {+ /**+ * Creates a new MultiLinePoint+ * @param multiLine defines the source MultiLine object+ */+ constructor(i) {+ this._multiLine = i, this._x = new St(0), this._y = new St(0), this._point = new Se(0, 0, 0);+ }+ /** Gets or sets x coordinate */+ get x() {+ return this._x.toString(this._multiLine._host);+ }+ set x(i) {+ this._x.toString(this._multiLine._host) !== i && this._x.fromString(i) && this._multiLine._markAsDirty();+ }+ /** Gets or sets y coordinate */+ get y() {+ return this._y.toString(this._multiLine._host);+ }+ set y(i) {+ this._y.toString(this._multiLine._host) !== i && this._y.fromString(i) && this._multiLine._markAsDirty();+ }+ /** Gets or sets the control associated with this point */+ get control() {+ return this._control;+ }+ set control(i) {+ this._control !== i && (this._control && this._controlObserver && (this._control.onDirtyObservable.remove(this._controlObserver), this._controlObserver = null), this._control = i, this._control && (this._controlObserver = this._control.onDirtyObservable.add(this._multiLine.onPointUpdate)), this._multiLine._markAsDirty());+ }+ /** Gets or sets the mesh associated with this point */+ get mesh() {+ return this._mesh;+ }+ set mesh(i) {+ this._mesh !== i && (this._mesh && this._meshObserver && this._mesh.getScene().onAfterCameraRenderObservable.remove(this._meshObserver), this._mesh = i, this._mesh && (this._meshObserver = this._mesh.getScene().onAfterCameraRenderObservable.add(this._multiLine.onPointUpdate)), this._multiLine._markAsDirty());+ }+ /** Resets links */+ resetLinks() {+ this.control = null, this.mesh = null;+ }+ /**+ * Gets a translation vector with Z component+ * @returns the translation vector+ */+ translate() {+ return this._point = this._translatePoint(), this._point;+ }+ _translatePoint() {+ if (this._mesh != null)+ return this._multiLine._host.getProjectedPositionWithZ(this._mesh.getBoundingInfo().boundingSphere.center, this._mesh.getWorldMatrix());+ if (this._control != null)+ return new Se(this._control.centerX, this._control.centerY, 1 - hn);+ {+ const i = this._multiLine._host, d = this._x.getValueInPixel(i, Number(i._canvas.width)), g = this._y.getValueInPixel(i, Number(i._canvas.height));+ return new Se(d, g, 1 - hn);+ }+ }+ /** Release associated resources */+ dispose() {+ this.resetLinks();+ }+}+class cw extends pe {+ /**+ * Creates a new MultiLine+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._lineWidth = 1, this.onPointUpdate = () => {+ this._markAsDirty();+ }, this._automaticSize = !0, this.isHitTestVisible = !1, this._horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this._verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, this._dash = [], this._points = [];+ }+ /** Gets or sets dash pattern */+ get dash() {+ return this._dash;+ }+ set dash(i) {+ this._dash !== i && (this._dash = i, this._markAsDirty());+ }+ /**+ * Gets point stored at specified index+ * @param index defines the index to look for+ * @returns the requested point if found+ */+ getAt(i) {+ return this._points[i] || (this._points[i] = new nw(this)), this._points[i];+ }+ /**+ * Adds new points to the point collection+ * @param items defines the list of items (mesh, control or 2d coordinates) to add+ * @returns the list of created MultiLinePoint+ */+ add(...i) {+ return i.map((d) => this.push(d));+ }+ /**+ * Adds a new point to the point collection+ * @param item defines the item (mesh, control or 2d coordinates) to add+ * @returns the created MultiLinePoint+ */+ push(i) {+ const d = this.getAt(this._points.length);+ return i == null || (i instanceof $4 ? d.mesh = i : i instanceof pe ? d.control = i : i.x != null && i.y != null && (d.x = i.x, d.y = i.y)), d;+ }+ /**+ * Remove a specific value or point from the active point collection+ * @param value defines the value or point to remove+ */+ remove(i) {+ let d;+ if (i instanceof nw) {+ if (d = this._points.indexOf(i), d === -1)+ return;+ } else+ d = i;+ const g = this._points[d];+ g && (g.dispose(), this._points.splice(d, 1));+ }+ /**+ * Resets this object to initial state (no point)+ */+ reset() {+ for (; this._points.length > 0; )+ this.remove(this._points.length - 1);+ }+ /**+ * Resets all links+ */+ resetLinks() {+ for (const i of this._points)+ i?.resetLinks();+ }+ /** Gets or sets line width */+ get lineWidth() {+ return this._lineWidth;+ }+ set lineWidth(i) {+ this._lineWidth !== i && (this._lineWidth = i, this._markAsDirty());+ }+ set horizontalAlignment(i) {+ }+ set verticalAlignment(i) {+ }+ _getTypeName() {+ return "MultiLine";+ }+ _draw(i) {+ i.save(), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), this._applyStates(i), i.strokeStyle = this.color, i.lineWidth = this._lineWidth, i.setLineDash(this._dash), i.beginPath();+ let d = !0, g;+ for (const y of this._points)+ y && (d ? (i.moveTo(y._point.x, y._point.y), d = !1) : y._point.z < 1 && g.z < 1 ? i.lineTo(y._point.x, y._point.y) : i.moveTo(y._point.x, y._point.y), g = y._point);+ i.stroke(), i.restore();+ }+ _additionalProcessing() {+ this._minX = null, this._minY = null, this._maxX = null, this._maxY = null;+ for (const i of this._points)+ i && (i.translate(), (this._minX == null || i._point.x < this._minX) && (this._minX = i._point.x), (this._minY == null || i._point.y < this._minY) && (this._minY = i._point.y), (this._maxX == null || i._point.x > this._maxX) && (this._maxX = i._point.x), (this._maxY == null || i._point.y > this._maxY) && (this._maxY = i._point.y));+ this._minX == null && (this._minX = 0), this._minY == null && (this._minY = 0), this._maxX == null && (this._maxX = 0), this._maxY == null && (this._maxY = 0);+ }+ _measure() {+ this._minX == null || this._maxX == null || this._minY == null || this._maxY == null || (this._currentMeasure.width = Math.abs(this._maxX - this._minX) + this._lineWidth, this._currentMeasure.height = Math.abs(this._maxY - this._minY) + this._lineWidth);+ }+ _computeAlignment() {+ this._minX == null || this._minY == null || (this._currentMeasure.left = this._minX - this._lineWidth / 2, this._currentMeasure.top = this._minY - this._lineWidth / 2);+ }+ dispose() {+ this.reset(), super.dispose();+ }+}+q([+ H()+], cw.prototype, "dash", null);+kr("BABYLON.GUI.MultiLine", cw);+class cl extends pe {+ /** Gets or sets border thickness */+ get thickness() {+ return this._thickness;+ }+ set thickness(i) {+ this._thickness !== i && (this._thickness = i, this._markAsDirty());+ }+ /** Gets or sets a value indicating the ratio between overall size and check size */+ get checkSizeRatio() {+ return this._checkSizeRatio;+ }+ set checkSizeRatio(i) {+ i = Math.max(Math.min(1, i), 0), this._checkSizeRatio !== i && (this._checkSizeRatio = i, this._markAsDirty());+ }+ /** Gets or sets background color */+ get background() {+ return this._background;+ }+ set background(i) {+ this._background !== i && (this._background = i, this._markAsDirty());+ }+ /** Gets or sets a boolean indicating if the checkbox is checked or not */+ get isChecked() {+ return this._isChecked;+ }+ set isChecked(i) {+ this._isChecked !== i && (this._isChecked = i, this._markAsDirty(), this.onIsCheckedChangedObservable.notifyObservers(i), this._isChecked && this._host && this._host.executeOnAllControls((d) => {+ if (d === this || d.group === void 0)+ return;+ const g = d;+ g.group === this.group && (g.isChecked = !1);+ }));+ }+ /**+ * Creates a new RadioButton+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._isChecked = !1, this._background = "black", this._checkSizeRatio = 0.8, this._thickness = 1, this.group = "", this.onIsCheckedChangedObservable = new qt(), this.isPointerBlocker = !0;+ }+ _getTypeName() {+ return "RadioButton";+ }+ _draw(i) {+ i.save(), this._applyStates(i);+ const d = this._currentMeasure.width - this._thickness, g = this._currentMeasure.height - this._thickness;+ if ((this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), pe.drawEllipse(this._currentMeasure.left + this._currentMeasure.width / 2, this._currentMeasure.top + this._currentMeasure.height / 2, this._currentMeasure.width / 2 - this._thickness / 2, this._currentMeasure.height / 2 - this._thickness / 2, 1, i), i.fillStyle = this._isEnabled ? this._background : this._disabledColor, i.fill(), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), i.strokeStyle = this.color, i.lineWidth = this._thickness, i.stroke(), this._isChecked) {+ i.fillStyle = this._isEnabled ? this.color : this._disabledColor;+ const y = d * this._checkSizeRatio, M = g * this._checkSizeRatio;+ pe.drawEllipse(this._currentMeasure.left + this._currentMeasure.width / 2, this._currentMeasure.top + this._currentMeasure.height / 2, y / 2 - this._thickness / 2, M / 2 - this._thickness / 2, 1, i), i.fill();+ }+ i.restore();+ }+ // Events+ _onPointerDown(i, d, g, y, M) {+ return super._onPointerDown(i, d, g, y, M) ? (this.isReadOnly || this.isChecked || (this.isChecked = !0), !0) : !1;+ }+ /**+ * Utility function to easily create a radio button with a header+ * @param title defines the label to use for the header+ * @param group defines the group to use for the radio button+ * @param isChecked defines the initial state of the radio button+ * @param onValueChanged defines the callback to call when value changes+ * @returns a StackPanel containing the radio button and a textBlock+ */+ static AddRadioButtonWithHeader(i, d, g, y) {+ const M = new Gi();+ M.isVertical = !1, M.height = "30px";+ const N = new cl();+ N.width = "20px", N.height = "20px", N.isChecked = g, N.color = "green", N.group = d, N.onIsCheckedChangedObservable.add((F) => y(N, F)), M.addControl(N);+ const O = new zr();+ return O.text = i, O.width = "180px", O.paddingLeft = "5px", O.textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, O.color = "white", M.addControl(O), M;+ }+}+q([+ H()+], cl.prototype, "thickness", null);+q([+ H()+], cl.prototype, "group", void 0);+q([+ H()+], cl.prototype, "checkSizeRatio", null);+q([+ H()+], cl.prototype, "background", null);+q([+ H()+], cl.prototype, "isChecked", null);+kr("BABYLON.GUI.RadioButton", cl);+class $n extends pe {+ /** Gets or sets a boolean indicating if the thumb must be rendered */+ get displayThumb() {+ return this._displayThumb;+ }+ set displayThumb(i) {+ this._displayThumb !== i && (this._displayThumb = i, this._markAsDirty());+ }+ /** Gets or sets a step to apply to values (0 by default) */+ get step() {+ return this._step;+ }+ set step(i) {+ this._step !== i && (this._step = i, this._markAsDirty());+ }+ /** Gets or sets main bar offset (ie. the margin applied to the value bar) */+ get barOffset() {+ return this._barOffset.toString(this._host);+ }+ /** Gets main bar offset in pixels*/+ get barOffsetInPixels() {+ return this._barOffset.getValueInPixel(this._host, this._cachedParentMeasure.width);+ }+ set barOffset(i) {+ this._barOffset.toString(this._host) !== i && this._barOffset.fromString(i) && this._markAsDirty();+ }+ /** Gets or sets thumb width */+ get thumbWidth() {+ return this._thumbWidth.toString(this._host);+ }+ /** Gets thumb width in pixels */+ get thumbWidthInPixels() {+ return this._thumbWidth.getValueInPixel(this._host, this._cachedParentMeasure.width);+ }+ set thumbWidth(i) {+ this._thumbWidth.toString(this._host) !== i && this._thumbWidth.fromString(i) && this._markAsDirty();+ }+ /** Gets or sets minimum value */+ get minimum() {+ return this._minimum;+ }+ set minimum(i) {+ this._minimum !== i && (this._minimum = i, this._markAsDirty(), this.value = Math.max(Math.min(this.value, this._maximum), this._minimum));+ }+ /** Gets or sets maximum value */+ get maximum() {+ return this._maximum;+ }+ set maximum(i) {+ this._maximum !== i && (this._maximum = i, this._markAsDirty(), this.value = Math.max(Math.min(this.value, this._maximum), this._minimum));+ }+ /** Gets or sets current value */+ get value() {+ return this._value;+ }+ set value(i) {+ i = Math.max(Math.min(i, this._maximum), this._minimum), this._value !== i && (this._value = i, this._markAsDirty(), this.onValueChangedObservable.notifyObservers(this._value, void 0, this, this));+ }+ /**Gets or sets a boolean indicating if the slider should be vertical or horizontal */+ get isVertical() {+ return this._isVertical;+ }+ set isVertical(i) {+ this._isVertical !== i && (this._isVertical = i, this._markAsDirty());+ }+ /** Gets or sets a value indicating if the thumb can go over main bar extends */+ get isThumbClamped() {+ return this._isThumbClamped;+ }+ set isThumbClamped(i) {+ this._isThumbClamped !== i && (this._isThumbClamped = i, this._markAsDirty());+ }+ /**+ * Creates a new BaseSlider+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._thumbWidth = new St(20, St.UNITMODE_PIXEL, !1), this._minimum = 0, this._maximum = 100, this._value = 50, this._isVertical = !1, this._barOffset = new St(5, St.UNITMODE_PIXEL, !1), this._isThumbClamped = !1, this._displayThumb = !0, this._step = 0, this._lastPointerDownId = -1, this._effectiveBarOffset = 0, this.onValueChangedObservable = new qt(), this._pointerIsDown = !1, this.isPointerBlocker = !0;+ }+ _getTypeName() {+ return "BaseSlider";+ }+ _getThumbPosition() {+ return this.isVertical ? (this.maximum - this.value) / (this.maximum - this.minimum) * this._backgroundBoxLength : (this.value - this.minimum) / (this.maximum - this.minimum) * this._backgroundBoxLength;+ }+ _getThumbThickness(i) {+ let d = 0;+ switch (i) {+ case "circle":+ this._thumbWidth.isPixel ? d = Math.max(this._thumbWidth.getValue(this._host), this._backgroundBoxThickness) : d = this._backgroundBoxThickness * this._thumbWidth.getValue(this._host);+ break;+ case "rectangle":+ this._thumbWidth.isPixel ? d = Math.min(this._thumbWidth.getValue(this._host), this._backgroundBoxThickness) : d = this._backgroundBoxThickness * this._thumbWidth.getValue(this._host);+ }+ return d;+ }+ _prepareRenderingData(i) {+ if (this._effectiveBarOffset = 0, this._renderLeft = this._currentMeasure.left, this._renderTop = this._currentMeasure.top, this._renderWidth = this._currentMeasure.width, this._renderHeight = this._currentMeasure.height, this._backgroundBoxLength = Math.max(this._currentMeasure.width, this._currentMeasure.height), this._backgroundBoxThickness = Math.min(this._currentMeasure.width, this._currentMeasure.height), this._effectiveThumbThickness = this._getThumbThickness(i), this.displayThumb && (this._backgroundBoxLength -= this._effectiveThumbThickness), this.isVertical && this._currentMeasure.height < this._currentMeasure.width) {+ zh.Error("Height should be greater than width");+ return;+ }+ this._barOffset.isPixel ? this._effectiveBarOffset = Math.min(this._barOffset.getValue(this._host), this._backgroundBoxThickness) : this._effectiveBarOffset = this._backgroundBoxThickness * this._barOffset.getValue(this._host), this._backgroundBoxThickness -= this._effectiveBarOffset * 2, this.isVertical ? (this._renderLeft += this._effectiveBarOffset, !this.isThumbClamped && this.displayThumb && (this._renderTop += this._effectiveThumbThickness / 2), this._renderHeight = this._backgroundBoxLength, this._renderWidth = this._backgroundBoxThickness) : (this._renderTop += this._effectiveBarOffset, !this.isThumbClamped && this.displayThumb && (this._renderLeft += this._effectiveThumbThickness / 2), this._renderHeight = this._backgroundBoxThickness, this._renderWidth = this._backgroundBoxLength);+ }+ /**+ * @internal+ */+ _updateValueFromPointer(i, d) {+ this._invertTransformMatrix.transformCoordinates(i, d, this._transformedPosition), i = this._transformedPosition.x, d = this._transformedPosition.y;+ let g;+ this._isVertical ? g = this._minimum + (1 - (d - this._currentMeasure.top) / this._currentMeasure.height) * (this._maximum - this._minimum) : g = this._minimum + (i - this._currentMeasure.left) / this._currentMeasure.width * (this._maximum - this._minimum), this.value = this._step ? Math.round(g / this._step) * this._step : g;+ }+ _onPointerDown(i, d, g, y, M) {+ return super._onPointerDown(i, d, g, y, M) ? (this.isReadOnly || (this._pointerIsDown = !0, this._updateValueFromPointer(d.x, d.y), this._host._capturingControl[g] = this, this._lastPointerDownId = g), !0) : !1;+ }+ _onPointerMove(i, d, g, y) {+ g == this._lastPointerDownId && (this._pointerIsDown && !this.isReadOnly && this._updateValueFromPointer(d.x, d.y), super._onPointerMove(i, d, g, y));+ }+ _onPointerUp(i, d, g, y, M) {+ this._pointerIsDown = !1, delete this._host._capturingControl[g], super._onPointerUp(i, d, g, y, M);+ }+ _onCanvasBlur() {+ this._forcePointerUp(), super._onCanvasBlur();+ }+}+q([+ H()+], $n.prototype, "displayThumb", null);+q([+ H()+], $n.prototype, "step", null);+q([+ H()+], $n.prototype, "barOffset", null);+q([+ H()+], $n.prototype, "thumbWidth", null);+q([+ H()+], $n.prototype, "minimum", null);+q([+ H()+], $n.prototype, "maximum", null);+q([+ H()+], $n.prototype, "value", null);+q([+ H()+], $n.prototype, "isVertical", null);+q([+ H()+], $n.prototype, "isThumbClamped", null);+class xd extends $n {+ /** Gets or sets a boolean indicating if the value bar must be rendered */+ get displayValueBar() {+ return this._displayValueBar;+ }+ set displayValueBar(i) {+ this._displayValueBar !== i && (this._displayValueBar = i, this._markAsDirty());+ }+ /** Gets or sets border color */+ get borderColor() {+ return this._borderColor;+ }+ set borderColor(i) {+ this._borderColor !== i && (this._borderColor = i, this._markAsDirty());+ }+ /** Gets or sets background color */+ get background() {+ return this._background;+ }+ set background(i) {+ this._background !== i && (this._background = i, this._markAsDirty());+ }+ /** Gets or sets background gradient */+ get backgroundGradient() {+ return this._backgroundGradient;+ }+ set backgroundGradient(i) {+ this._backgroundGradient !== i && (this._backgroundGradient = i, this._markAsDirty());+ }+ /** Gets or sets thumb's color */+ get thumbColor() {+ return this._thumbColor;+ }+ set thumbColor(i) {+ this._thumbColor !== i && (this._thumbColor = i, this._markAsDirty());+ }+ /** Gets or sets a boolean indicating if the thumb should be round or square */+ get isThumbCircle() {+ return this._isThumbCircle;+ }+ set isThumbCircle(i) {+ this._isThumbCircle !== i && (this._isThumbCircle = i, this._markAsDirty());+ }+ /**+ * Creates a new Slider+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._background = "black", this._borderColor = "white", this._thumbColor = "", this._isThumbCircle = !1, this._displayValueBar = !0, this._backgroundGradient = null;+ }+ _getTypeName() {+ return "Slider";+ }+ _getBackgroundColor(i) {+ return this._backgroundGradient ? this._backgroundGradient.getCanvasGradient(i) : this._background;+ }+ _draw(i) {+ i.save(), this._applyStates(i), this._prepareRenderingData(this.isThumbCircle ? "circle" : "rectangle");+ let d = this._renderLeft, g = this._renderTop;+ const y = this._renderWidth, M = this._renderHeight;+ let N;+ this.isThumbClamped && this.isThumbCircle ? (this.isVertical ? g += this._effectiveThumbThickness / 2 : d += this._effectiveThumbThickness / 2, N = this._backgroundBoxThickness / 2) : N = (this._effectiveThumbThickness - this._effectiveBarOffset) / 2, N = Math.max(0, N), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio);+ const O = this._getThumbPosition();+ i.fillStyle = this._getBackgroundColor(i), this.isVertical ? this.isThumbClamped ? this.isThumbCircle ? (i.beginPath(), i.arc(d + this._backgroundBoxThickness / 2, g, N, Math.PI, 2 * Math.PI), i.fill(), i.fillRect(d, g, y, M)) : i.fillRect(d, g, y, M + this._effectiveThumbThickness) : i.fillRect(d, g, y, M) : this.isThumbClamped ? this.isThumbCircle ? (i.beginPath(), i.arc(d + this._backgroundBoxLength, g + this._backgroundBoxThickness / 2, N, 0, 2 * Math.PI), i.fill(), i.fillRect(d, g, y, M)) : i.fillRect(d, g, y + this._effectiveThumbThickness, M) : i.fillRect(d, g, y, M), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), i.fillStyle = this._getColor(i), this._displayValueBar && (this.isVertical ? this.isThumbClamped ? this.isThumbCircle ? (i.beginPath(), i.arc(d + this._backgroundBoxThickness / 2, g + this._backgroundBoxLength, N, 0, 2 * Math.PI), i.fill(), i.fillRect(d, g + O, y, M - O)) : i.fillRect(d, g + O, y, M - O + this._effectiveThumbThickness) : i.fillRect(d, g + O, y, M - O) : (this.isThumbClamped && this.isThumbCircle && (i.beginPath(), i.arc(d, g + this._backgroundBoxThickness / 2, N, 0, 2 * Math.PI), i.fill()), i.fillRect(d, g, O, M))), i.fillStyle = this._thumbColor || this._getColor(i), this.displayThumb && ((this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowColor = this.shadowColor, i.shadowBlur = this.shadowBlur, i.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio, i.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio), this._isThumbCircle ? (i.beginPath(), this.isVertical ? i.arc(d + this._backgroundBoxThickness / 2, g + O, N, 0, 2 * Math.PI) : i.arc(d + O, g + this._backgroundBoxThickness / 2, N, 0, 2 * Math.PI), i.fill(), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), i.strokeStyle = this._borderColor, i.stroke()) : (this.isVertical ? i.fillRect(d - this._effectiveBarOffset, this._currentMeasure.top + O, this._currentMeasure.width, this._effectiveThumbThickness) : i.fillRect(this._currentMeasure.left + O, this._currentMeasure.top, this._effectiveThumbThickness, this._currentMeasure.height), (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) && (i.shadowBlur = 0, i.shadowOffsetX = 0, i.shadowOffsetY = 0), i.strokeStyle = this._borderColor, this.isVertical ? i.strokeRect(d - this._effectiveBarOffset, this._currentMeasure.top + O, this._currentMeasure.width, this._effectiveThumbThickness) : i.strokeRect(this._currentMeasure.left + O, this._currentMeasure.top, this._effectiveThumbThickness, this._currentMeasure.height))), i.restore();+ }+ serialize(i) {+ super.serialize(i), this.backgroundGradient && (i.backgroundGradient = {}, this.backgroundGradient.serialize(i.backgroundGradient));+ }+ /** @internal */+ _parseFromContent(i, d) {+ if (super._parseFromContent(i, d), i.backgroundGradient) {+ const g = Lr.Instantiate("BABYLON.GUI." + i.backgroundGradient.className);+ this.backgroundGradient = new g(), this.backgroundGradient.parse(i.backgroundGradient);+ }+ }+}+q([+ H()+], xd.prototype, "displayValueBar", null);+q([+ H()+], xd.prototype, "borderColor", null);+q([+ H()+], xd.prototype, "background", null);+q([+ H()+], xd.prototype, "thumbColor", null);+q([+ H()+], xd.prototype, "isThumbCircle", null);+kr("BABYLON.GUI.Slider", xd);+class Sb {+ /**+ * Creates a new SelectorGroup+ * @param name of group, used as a group heading+ */+ constructor(i) {+ this.name = i, this._groupPanel = new Gi(), this._selectors = [], this._groupPanel.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, this._groupPanel.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this._groupHeader = this._addGroupHeader(i);+ }+ /** Gets the groupPanel of the SelectorGroup */+ get groupPanel() {+ return this._groupPanel;+ }+ /** Gets the selectors array */+ get selectors() {+ return this._selectors;+ }+ /** Gets and sets the group header */+ get header() {+ return this._groupHeader.text;+ }+ set header(i) {+ this._groupHeader.text !== "label" && (this._groupHeader.text = i);+ }+ /**+ * @internal+ */+ _addGroupHeader(i) {+ const d = new zr("groupHead", i);+ return d.width = 0.9, d.height = "30px", d.textWrapping = !0, d.color = "black", d.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, d.textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, d.left = "2px", this._groupPanel.addControl(d), d;+ }+ /**+ * @internal+ */+ _getSelector(i) {+ if (!(i < 0 || i >= this._selectors.length))+ return this._selectors[i];+ }+ /** Removes the selector at the given position+ * @param selectorNb the position of the selector within the group+ */+ removeSelector(i) {+ i < 0 || i >= this._selectors.length || (this._groupPanel.removeControl(this._selectors[i]), this._selectors.splice(i, 1));+ }+}+class H9 extends Sb {+ /** Adds a checkbox as a control+ * @param text is the label for the selector+ * @param func is the function called when the Selector is checked+ * @param checked is true when Selector is checked+ */+ // eslint-disable-next-line @typescript-eslint/no-unused-vars+ addCheckbox(i, d = (y) => {+ }, g = !1) {+ g = g || !1;+ const y = new pc();+ y.width = "20px", y.height = "20px", y.color = "#364249", y.background = "#CCCCCC", y.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, y.onIsCheckedChangedObservable.add(function(N) {+ d(N);+ });+ const M = pe.AddHeader(y, i, "200px", { isHorizontal: !0, controlFirst: !0 });+ M.height = "30px", M.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, M.left = "4px", this.groupPanel.addControl(M), this.selectors.push(M), y.isChecked = g, this.groupPanel.parent && this.groupPanel.parent.parent && (y.color = this.groupPanel.parent.parent.buttonColor, y.background = this.groupPanel.parent.parent.buttonBackground);+ }+ /**+ * @internal+ */+ _setSelectorLabel(i, d) {+ this.selectors[i].children[1].text = d;+ }+ /**+ * @internal+ */+ _setSelectorLabelColor(i, d) {+ this.selectors[i].children[1].color = d;+ }+ /**+ * @internal+ */+ _setSelectorButtonColor(i, d) {+ this.selectors[i].children[0].color = d;+ }+ /**+ * @internal+ */+ _setSelectorButtonBackground(i, d) {+ this.selectors[i].children[0].background = d;+ }+}+class W9 extends Sb {+ constructor() {+ super(...arguments), this._selectNb = 0;+ }+ /** Adds a radio button as a control+ * @param label is the label for the selector+ * @param func is the function called when the Selector is checked+ * @param checked is true when Selector is checked+ */+ // eslint-disable-next-line @typescript-eslint/no-unused-vars+ addRadio(i, d = (y) => {+ }, g = !1) {+ const y = this._selectNb++, M = new cl();+ M.name = i, M.width = "20px", M.height = "20px", M.color = "#364249", M.background = "#CCCCCC", M.group = this.name, M.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, M.onIsCheckedChangedObservable.add(function(O) {+ O && d(y);+ });+ const N = pe.AddHeader(M, i, "200px", { isHorizontal: !0, controlFirst: !0 });+ N.height = "30px", N.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, N.left = "4px", this.groupPanel.addControl(N), this.selectors.push(N), M.isChecked = g, this.groupPanel.parent && this.groupPanel.parent.parent && (M.color = this.groupPanel.parent.parent.buttonColor, M.background = this.groupPanel.parent.parent.buttonBackground);+ }+ /**+ * @internal+ */+ _setSelectorLabel(i, d) {+ this.selectors[i].children[1].text = d;+ }+ /**+ * @internal+ */+ _setSelectorLabelColor(i, d) {+ this.selectors[i].children[1].color = d;+ }+ /**+ * @internal+ */+ _setSelectorButtonColor(i, d) {+ this.selectors[i].children[0].color = d;+ }+ /**+ * @internal+ */+ _setSelectorButtonBackground(i, d) {+ this.selectors[i].children[0].background = d;+ }+}+class G9 extends Sb {+ /**+ * Adds a slider to the SelectorGroup+ * @param label is the label for the SliderBar+ * @param func is the function called when the Slider moves+ * @param unit is a string describing the units used, eg degrees or metres+ * @param min is the minimum value for the Slider+ * @param max is the maximum value for the Slider+ * @param value is the start value for the Slider between min and max+ * @param onValueChange is the function used to format the value displayed, eg radians to degrees+ */+ addSlider(i, d = (F) => {+ }, g = "Units", y = 0, M = 0, N = 0, O = (F) => F | 0) {+ const F = new xd();+ F.name = g, F.value = N, F.minimum = y, F.maximum = M, F.width = 0.9, F.height = "20px", F.color = "#364249", F.background = "#CCCCCC", F.borderColor = "black", F.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, F.left = "4px", F.paddingBottom = "4px", F.onValueChangedObservable.add(function($) {+ F.parent.children[0].text = F.parent.children[0].name + ": " + O($) + " " + F.name, d($);+ });+ const ne = pe.AddHeader(F, i + ": " + O(N) + " " + g, "30px", { isHorizontal: !1, controlFirst: !1 });+ ne.height = "60px", ne.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, ne.left = "4px", ne.children[0].name = i, this.groupPanel.addControl(ne), this.selectors.push(ne), this.groupPanel.parent && this.groupPanel.parent.parent && (F.color = this.groupPanel.parent.parent.buttonColor, F.background = this.groupPanel.parent.parent.buttonBackground);+ }+ /**+ * @internal+ */+ _setSelectorLabel(i, d) {+ this.selectors[i].children[0].name = d, this.selectors[i].children[0].text = d + ": " + this.selectors[i].children[1].value + " " + this.selectors[i].children[1].name;+ }+ /**+ * @internal+ */+ _setSelectorLabelColor(i, d) {+ this.selectors[i].children[0].color = d;+ }+ /**+ * @internal+ */+ _setSelectorButtonColor(i, d) {+ this.selectors[i].children[1].color = d;+ }+ /**+ * @internal+ */+ _setSelectorButtonBackground(i, d) {+ this.selectors[i].children[1].background = d;+ }+}+class Y9 extends si {+ /**+ * Creates a new SelectionPanel+ * @param name of SelectionPanel+ * @param groups is an array of SelectionGroups+ */+ constructor(i, d = []) {+ if (super(i), this.name = i, this.groups = d, this._buttonColor = "#364249", this._buttonBackground = "#CCCCCC", this._headerColor = "black", this._barColor = "white", this._barHeight = "2px", this._spacerHeight = "20px", this._bars = [], this._groups = d, this.thickness = 2, this._panel = new Gi(), this._panel.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, this._panel.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this._panel.top = 5, this._panel.left = 5, this._panel.width = 0.95, d.length > 0) {+ for (let g = 0; g < d.length - 1; g++)+ this._panel.addControl(d[g].groupPanel), this._addSpacer();+ this._panel.addControl(d[d.length - 1].groupPanel);+ }+ this.addControl(this._panel);+ }+ _getTypeName() {+ return "SelectionPanel";+ }+ /** Gets the (stack) panel of the SelectionPanel */+ get panel() {+ return this._panel;+ }+ /** Gets or sets the headerColor */+ get headerColor() {+ return this._headerColor;+ }+ set headerColor(i) {+ this._headerColor !== i && (this._headerColor = i, this._setHeaderColor());+ }+ _setHeaderColor() {+ for (let i = 0; i < this._groups.length; i++)+ this._groups[i].groupPanel.children[0].color = this._headerColor;+ }+ /** Gets or sets the button color */+ get buttonColor() {+ return this._buttonColor;+ }+ set buttonColor(i) {+ this._buttonColor !== i && (this._buttonColor = i, this._setbuttonColor());+ }+ _setbuttonColor() {+ for (let i = 0; i < this._groups.length; i++)+ for (let d = 0; d < this._groups[i].selectors.length; d++)+ this._groups[i]._setSelectorButtonColor(d, this._buttonColor);+ }+ /** Gets or sets the label color */+ get labelColor() {+ return this._labelColor;+ }+ set labelColor(i) {+ this._labelColor !== i && (this._labelColor = i, this._setLabelColor());+ }+ _setLabelColor() {+ for (let i = 0; i < this._groups.length; i++)+ for (let d = 0; d < this._groups[i].selectors.length; d++)+ this._groups[i]._setSelectorLabelColor(d, this._labelColor);+ }+ /** Gets or sets the button background */+ get buttonBackground() {+ return this._buttonBackground;+ }+ set buttonBackground(i) {+ this._buttonBackground !== i && (this._buttonBackground = i, this._setButtonBackground());+ }+ _setButtonBackground() {+ for (let i = 0; i < this._groups.length; i++)+ for (let d = 0; d < this._groups[i].selectors.length; d++)+ this._groups[i]._setSelectorButtonBackground(d, this._buttonBackground);+ }+ /** Gets or sets the color of separator bar */+ get barColor() {+ return this._barColor;+ }+ set barColor(i) {+ this._barColor !== i && (this._barColor = i, this._setBarColor());+ }+ _setBarColor() {+ for (let i = 0; i < this._bars.length; i++)+ this._bars[i].children[0].background = this._barColor;+ }+ /** Gets or sets the height of separator bar */+ get barHeight() {+ return this._barHeight;+ }+ set barHeight(i) {+ this._barHeight !== i && (this._barHeight = i, this._setBarHeight());+ }+ _setBarHeight() {+ for (let i = 0; i < this._bars.length; i++)+ this._bars[i].children[0].height = this._barHeight;+ }+ /** Gets or sets the height of spacers*/+ get spacerHeight() {+ return this._spacerHeight;+ }+ set spacerHeight(i) {+ this._spacerHeight !== i && (this._spacerHeight = i, this._setSpacerHeight());+ }+ _setSpacerHeight() {+ for (let i = 0; i < this._bars.length; i++)+ this._bars[i].height = this._spacerHeight;+ }+ /** Adds a bar between groups */+ _addSpacer() {+ const i = new wi();+ i.width = 1, i.height = this._spacerHeight, i.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT;+ const d = new si();+ d.width = 1, d.height = this._barHeight, d.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, d.verticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, d.background = this._barColor, d.color = "transparent", i.addControl(d), this._panel.addControl(i), this._bars.push(i);+ }+ /** Add a group to the selection panel+ * @param group is the selector group to add+ */+ addGroup(i) {+ this._groups.length > 0 && this._addSpacer(), this._panel.addControl(i.groupPanel), this._groups.push(i), i.groupPanel.children[0].color = this._headerColor;+ for (let d = 0; d < i.selectors.length; d++)+ i._setSelectorButtonColor(d, this._buttonColor), i._setSelectorButtonBackground(d, this._buttonBackground);+ }+ /** Remove the group from the given position+ * @param groupNb is the position of the group in the list+ */+ removeGroup(i) {+ if (i < 0 || i >= this._groups.length)+ return;+ const d = this._groups[i];+ this._panel.removeControl(d.groupPanel), this._groups.splice(i, 1), i < this._bars.length && (this._panel.removeControl(this._bars[i]), this._bars.splice(i, 1));+ }+ /** Change a group header label+ * @param label is the new group header label+ * @param groupNb is the number of the group to relabel+ * */+ setHeaderName(i, d) {+ if (d < 0 || d >= this._groups.length)+ return;+ const g = this._groups[d];+ g.groupPanel.children[0].text = i;+ }+ /** Change selector label to the one given+ * @param label is the new selector label+ * @param groupNb is the number of the groupcontaining the selector+ * @param selectorNb is the number of the selector within a group to relabel+ * */+ relabel(i, d, g) {+ if (d < 0 || d >= this._groups.length)+ return;+ const y = this._groups[d];+ g < 0 || g >= y.selectors.length || y._setSelectorLabel(g, i);+ }+ /** For a given group position remove the selector at the given position+ * @param groupNb is the number of the group to remove the selector from+ * @param selectorNb is the number of the selector within the group+ */+ removeFromGroupSelector(i, d) {+ if (i < 0 || i >= this._groups.length)+ return;+ const g = this._groups[i];+ d < 0 || d >= g.selectors.length || g.removeSelector(d);+ }+ /** For a given group position of correct type add a checkbox button+ * @param groupNb is the number of the group to remove the selector from+ * @param label is the label for the selector+ * @param func is the function called when the Selector is checked+ * @param checked is true when Selector is checked+ */+ addToGroupCheckbox(i, d, g = () => {+ }, y = !1) {+ if (i < 0 || i >= this._groups.length)+ return;+ this._groups[i].addCheckbox(d, g, y);+ }+ /** For a given group position of correct type add a radio button+ * @param groupNb is the number of the group to remove the selector from+ * @param label is the label for the selector+ * @param func is the function called when the Selector is checked+ * @param checked is true when Selector is checked+ */+ addToGroupRadio(i, d, g = () => {+ }, y = !1) {+ if (i < 0 || i >= this._groups.length)+ return;+ this._groups[i].addRadio(d, g, y);+ }+ /**+ * For a given slider group add a slider+ * @param groupNb is the number of the group to add the slider to+ * @param label is the label for the Slider+ * @param func is the function called when the Slider moves+ * @param unit is a string describing the units used, eg degrees or metres+ * @param min is the minimum value for the Slider+ * @param max is the maximum value for the Slider+ * @param value is the start value for the Slider between min and max+ * @param onVal is the function used to format the value displayed, eg radians to degrees+ */+ addToGroupSlider(i, d, g = () => {+ }, y = "Units", M = 0, N = 0, O = 0, F = (ne) => ne | 0) {+ if (i < 0 || i >= this._groups.length)+ return;+ this._groups[i].addSlider(d, g, y, M, N, O, F);+ }+}+class V9 extends wi {+ get freezeControls() {+ return this._freezeControls;+ }+ set freezeControls(i) {+ if (this._freezeControls === i)+ return;+ i || this._restoreMeasures(), this._freezeControls = !1;+ const d = this.host.getSize(), g = d.width, y = d.height, M = this.host.getContext(), N = new Ko(0, 0, g, y);+ this.host._numLayoutCalls = 0, this.host._rootContainer._layout(N, M), i && (this._updateMeasures(), this._useBuckets() && this._makeBuckets()), this._freezeControls = i, this.host.markAsDirty();+ }+ get bucketWidth() {+ return this._bucketWidth;+ }+ get bucketHeight() {+ return this._bucketHeight;+ }+ setBucketSizes(i, d) {+ this._bucketWidth = i, this._bucketHeight = d, this._useBuckets() ? this._freezeControls && this._makeBuckets() : this._buckets = {};+ }+ _useBuckets() {+ return this._bucketWidth > 0 && this._bucketHeight > 0;+ }+ _makeBuckets() {+ this._buckets = {}, this._bucketLen = Math.ceil(this.widthInPixels / this._bucketWidth), this._dispatchInBuckets(this._children), this._oldLeft = null, this._oldTop = null;+ }+ _dispatchInBuckets(i) {+ for (let d = 0; d < i.length; ++d) {+ const g = i[d], y = Math.max(0, Math.floor((g._customData._origLeft - this._customData.origLeft) / this._bucketWidth)), M = Math.floor((g._customData._origLeft - this._customData.origLeft + g._currentMeasure.width - 1) / this._bucketWidth), N = Math.floor((g._customData._origTop - this._customData.origTop + g._currentMeasure.height - 1) / this._bucketHeight);+ let O = Math.max(0, Math.floor((g._customData._origTop - this._customData.origTop) / this._bucketHeight));+ for (; O <= N; ) {+ for (let F = y; F <= M; ++F) {+ const ne = O * this._bucketLen + F;+ let $ = this._buckets[ne];+ $ || ($ = [], this._buckets[ne] = $), $.push(g);+ }+ O++;+ }+ g instanceof wi && g._children.length > 0 && this._dispatchInBuckets(g._children);+ }+ }+ // reset left and top measures for the window and all its children+ _updateMeasures() {+ const i = this.leftInPixels | 0, d = this.topInPixels | 0;+ this._measureForChildren.left -= i, this._measureForChildren.top -= d, this._currentMeasure.left -= i, this._currentMeasure.top -= d, this._customData.origLeftForChildren = this._measureForChildren.left, this._customData.origTopForChildren = this._measureForChildren.top, this._customData.origLeft = this._currentMeasure.left, this._customData.origTop = this._currentMeasure.top, this._updateChildrenMeasures(this._children, i, d);+ }+ _updateChildrenMeasures(i, d, g) {+ for (let y = 0; y < i.length; ++y) {+ const M = i[y];+ M._currentMeasure.left -= d, M._currentMeasure.top -= g, M._customData._origLeft = M._currentMeasure.left, M._customData._origTop = M._currentMeasure.top, M instanceof wi && M._children.length > 0 && this._updateChildrenMeasures(M._children, d, g);+ }+ }+ _restoreMeasures() {+ const i = this.leftInPixels | 0, d = this.topInPixels | 0;+ this._measureForChildren.left = this._customData.origLeftForChildren + i, this._measureForChildren.top = this._customData.origTopForChildren + d, this._currentMeasure.left = this._customData.origLeft + i, this._currentMeasure.top = this._customData.origTop + d;+ }+ /**+ * Creates a new ScrollViewerWindow+ * @param name of ScrollViewerWindow+ */+ constructor(i) {+ super(i), this._freezeControls = !1, this._bucketWidth = 0, this._bucketHeight = 0, this._buckets = {};+ }+ _getTypeName() {+ return "ScrollViewerWindow";+ }+ /**+ * @internal+ */+ _additionalProcessing(i, d) {+ super._additionalProcessing(i, d), this._parentMeasure = i, this._measureForChildren.left = this._currentMeasure.left, this._measureForChildren.top = this._currentMeasure.top, this._measureForChildren.width = i.width, this._measureForChildren.height = i.height;+ }+ /**+ * @internal+ */+ _layout(i, d) {+ return this._freezeControls ? (this.invalidateRect(), !1) : super._layout(i, d);+ }+ _scrollChildren(i, d, g) {+ for (let y = 0; y < i.length; ++y) {+ const M = i[y];+ M._currentMeasure.left = M._customData._origLeft + d, M._currentMeasure.top = M._customData._origTop + g, M._isClipped = !1, M instanceof wi && M._children.length > 0 && this._scrollChildren(M._children, d, g);+ }+ }+ _scrollChildrenWithBuckets(i, d, g, y) {+ const M = Math.max(0, Math.floor(-i / this._bucketWidth)), N = Math.floor((-i + this._parentMeasure.width - 1) / this._bucketWidth), O = Math.floor((-d + this._parentMeasure.height - 1) / this._bucketHeight);+ let F = Math.max(0, Math.floor(-d / this._bucketHeight));+ for (; F <= O; ) {+ for (let ne = M; ne <= N; ++ne) {+ const $ = F * this._bucketLen + ne, Q = this._buckets[$];+ if (Q)+ for (let X = 0; X < Q.length; ++X) {+ const he = Q[X];+ he._currentMeasure.left = he._customData._origLeft + g, he._currentMeasure.top = he._customData._origTop + y, he._isClipped = !1;+ }+ }+ F++;+ }+ }+ /**+ * @internal+ */+ _draw(i, d) {+ if (!this._freezeControls) {+ super._draw(i, d);+ return;+ }+ this._localDraw(i), this.clipChildren && this._clipForChildren(i);+ const g = this.leftInPixels | 0, y = this.topInPixels | 0;+ this._useBuckets() ? this._oldLeft !== null && this._oldTop !== null ? (this._scrollChildrenWithBuckets(this._oldLeft, this._oldTop, g, y), this._scrollChildrenWithBuckets(g, y, g, y)) : this._scrollChildren(this._children, g, y) : this._scrollChildren(this._children, g, y), this._oldLeft = g, this._oldTop = y;+ for (const M of this._children)+ M._intersectsRect(this._parentMeasure) && M._render(i, this._parentMeasure);+ }+ _postMeasure() {+ if (this._freezeControls) {+ super._postMeasure();+ return;+ }+ let i = this.parentClientWidth, d = this.parentClientHeight;+ for (const g of this.children)+ !g.isVisible || g.notRenderable || (g.horizontalAlignment === pe.HORIZONTAL_ALIGNMENT_CENTER && g._offsetLeft(this._currentMeasure.left - g._currentMeasure.left), g.verticalAlignment === pe.VERTICAL_ALIGNMENT_CENTER && g._offsetTop(this._currentMeasure.top - g._currentMeasure.top), i = Math.max(i, g._currentMeasure.left - this._currentMeasure.left + g._currentMeasure.width + g.paddingRightInPixels), d = Math.max(d, g._currentMeasure.top - this._currentMeasure.top + g._currentMeasure.height + g.paddingBottomInPixels));+ this._currentMeasure.width !== i && (this._width.updateInPlace(i, St.UNITMODE_PIXEL), this._currentMeasure.width = i, this._rebuildLayout = !0, this._isDirty = !0), this._currentMeasure.height !== d && (this._height.updateInPlace(d, St.UNITMODE_PIXEL), this._currentMeasure.height = d, this._rebuildLayout = !0, this._isDirty = !0), super._postMeasure();+ }+}+class Cu extends $n {+ /** Gets or sets border color */+ get borderColor() {+ return this._borderColor;+ }+ set borderColor(i) {+ this._borderColor !== i && (this._borderColor = i, this._markAsDirty());+ }+ /** Gets or sets background color */+ get background() {+ return this._background;+ }+ set background(i) {+ this._background !== i && (this._background = i, this._markAsDirty());+ }+ /** Gets or sets background gradient. Takes precedence over gradient. */+ get backgroundGradient() {+ return this._backgroundGradient;+ }+ set backgroundGradient(i) {+ this._backgroundGradient !== i && (this._backgroundGradient = i, this._markAsDirty());+ }+ /** Inverts the scrolling direction (default: false) */+ get invertScrollDirection() {+ return this._invertScrollDirection;+ }+ set invertScrollDirection(i) {+ this._invertScrollDirection = i;+ }+ /**+ * Creates a new Slider+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._background = "black", this._borderColor = "white", this._tempMeasure = new Ko(0, 0, 0, 0), this._invertScrollDirection = !1, this._backgroundGradient = null;+ }+ _getTypeName() {+ return "Scrollbar";+ }+ _getThumbThickness() {+ let i;+ return this._thumbWidth.isPixel ? i = this._thumbWidth.getValue(this._host) : i = this._backgroundBoxThickness * this._thumbWidth.getValue(this._host), i;+ }+ _getBackgroundColor(i) {+ return this._backgroundGradient ? this._backgroundGradient.getCanvasGradient(i) : this._background;+ }+ _draw(i) {+ i.save(), this._applyStates(i), this._prepareRenderingData("rectangle");+ const d = this._renderLeft, g = this._getThumbPosition();+ i.fillStyle = this._getBackgroundColor(i), i.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height), i.fillStyle = this._getColor(i), this.isVertical ? (this._tempMeasure.left = d - this._effectiveBarOffset, this._tempMeasure.top = this._currentMeasure.top + g, this._tempMeasure.width = this._currentMeasure.width, this._tempMeasure.height = this._effectiveThumbThickness) : (this._tempMeasure.left = this._currentMeasure.left + g, this._tempMeasure.top = this._currentMeasure.top, this._tempMeasure.width = this._effectiveThumbThickness, this._tempMeasure.height = this._currentMeasure.height), i.fillRect(this._tempMeasure.left, this._tempMeasure.top, this._tempMeasure.width, this._tempMeasure.height), i.restore();+ }+ /**+ * @internal+ */+ _updateValueFromPointer(i, d) {+ this._invertTransformMatrix.transformCoordinates(i, d, this._transformedPosition), i = this._transformedPosition.x, d = this._transformedPosition.y;+ const g = this._invertScrollDirection ? -1 : 1;+ this._first && (this._first = !1, this._originX = i, this._originY = d, (i < this._tempMeasure.left || i > this._tempMeasure.left + this._tempMeasure.width || d < this._tempMeasure.top || d > this._tempMeasure.top + this._tempMeasure.height) && (this.isVertical ? this.value = this.minimum + (1 - (d - this._currentMeasure.top) / this._currentMeasure.height) * (this.maximum - this.minimum) : this.value = this.minimum + (i - this._currentMeasure.left) / this._currentMeasure.width * (this.maximum - this.minimum)));+ let y;+ this.isVertical ? y = -((d - this._originY) / (this._currentMeasure.height - this._effectiveThumbThickness)) : y = (i - this._originX) / (this._currentMeasure.width - this._effectiveThumbThickness), this.value += g * y * (this.maximum - this.minimum), this._originX = i, this._originY = d;+ }+ _onPointerDown(i, d, g, y, M) {+ return this._first = !0, super._onPointerDown(i, d, g, y, M);+ }+ serialize(i) {+ super.serialize(i), this.backgroundGradient && (i.backgroundGradient = {}, this.backgroundGradient.serialize(i.backgroundGradient));+ }+ _parseFromContent(i, d) {+ if (super._parseFromContent(i, d), i.backgroundGradient) {+ const g = Lr.Instantiate("BABYLON.GUI." + i.backgroundGradient.className);+ this.backgroundGradient = new g(), this.backgroundGradient.parse(i.backgroundGradient);+ }+ }+}+q([+ H()+], Cu.prototype, "borderColor", null);+q([+ H()+], Cu.prototype, "background", null);+q([+ H()+], Cu.prototype, "invertScrollDirection", null);+kr("BABYLON.GUI.Scrollbar", Cu);+class $g extends $n {+ /** Inverts the scrolling direction (default: false) */+ get invertScrollDirection() {+ return this._invertScrollDirection;+ }+ set invertScrollDirection(i) {+ this._invertScrollDirection = i;+ }+ /**+ * Gets or sets the image used to render the background for horizontal bar+ */+ get backgroundImage() {+ return this._backgroundBaseImage;+ }+ set backgroundImage(i) {+ this._backgroundBaseImage !== i && (this._backgroundBaseImage = i, this.isVertical && this.num90RotationInVerticalMode !== 0 ? i.isLoaded ? (this._backgroundImage = i._rotate90(this.num90RotationInVerticalMode, !0), this._markAsDirty()) : i.onImageLoadedObservable.addOnce(() => {+ const d = i._rotate90(this.num90RotationInVerticalMode, !0);+ this._backgroundImage = d, d.isLoaded || d.onImageLoadedObservable.addOnce(() => {+ this._markAsDirty();+ }), this._markAsDirty();+ }) : (this._backgroundImage = i, i && !i.isLoaded && i.onImageLoadedObservable.addOnce(() => {+ this._markAsDirty();+ }), this._markAsDirty()));+ }+ /**+ * Gets or sets the image used to render the thumb+ */+ get thumbImage() {+ return this._thumbBaseImage;+ }+ set thumbImage(i) {+ this._thumbBaseImage !== i && (this._thumbBaseImage = i, this.isVertical && this.num90RotationInVerticalMode !== 0 ? i.isLoaded ? (this._thumbImage = i._rotate90(-this.num90RotationInVerticalMode, !0), this._markAsDirty()) : i.onImageLoadedObservable.addOnce(() => {+ const d = i._rotate90(-this.num90RotationInVerticalMode, !0);+ this._thumbImage = d, d.isLoaded || d.onImageLoadedObservable.addOnce(() => {+ this._markAsDirty();+ }), this._markAsDirty();+ }) : (this._thumbImage = i, i && !i.isLoaded && i.onImageLoadedObservable.addOnce(() => {+ this._markAsDirty();+ }), this._markAsDirty()));+ }+ /**+ * Gets or sets the length of the thumb+ */+ get thumbLength() {+ return this._thumbLength;+ }+ set thumbLength(i) {+ this._thumbLength !== i && (this._thumbLength = i, this._markAsDirty());+ }+ /**+ * Gets or sets the height of the thumb+ */+ get thumbHeight() {+ return this._thumbHeight;+ }+ set thumbHeight(i) {+ this._thumbHeight !== i && (this._thumbHeight = i, this._markAsDirty());+ }+ /**+ * Gets or sets the height of the bar image+ */+ get barImageHeight() {+ return this._barImageHeight;+ }+ set barImageHeight(i) {+ this._barImageHeight !== i && (this._barImageHeight = i, this._markAsDirty());+ }+ /**+ * Creates a new ImageScrollBar+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._thumbLength = 0.5, this._thumbHeight = 1, this._barImageHeight = 1, this._tempMeasure = new Ko(0, 0, 0, 0), this._invertScrollDirection = !1, this.num90RotationInVerticalMode = 1;+ }+ _getTypeName() {+ return "ImageScrollBar";+ }+ _getThumbThickness() {+ let i;+ return this._thumbWidth.isPixel ? i = this._thumbWidth.getValue(this._host) : i = this._backgroundBoxThickness * this._thumbWidth.getValue(this._host), i;+ }+ _draw(i) {+ i.save(), this._applyStates(i), this._prepareRenderingData("rectangle");+ const d = this._getThumbPosition(), g = this._renderLeft, y = this._renderTop, M = this._renderWidth, N = this._renderHeight;+ this._backgroundImage && (this._tempMeasure.copyFromFloats(g, y, M, N), this.isVertical ? (this._tempMeasure.copyFromFloats(g + M * (1 - this._barImageHeight) * 0.5, this._currentMeasure.top, M * this._barImageHeight, N), this._tempMeasure.height += this._effectiveThumbThickness, this._backgroundImage._currentMeasure.copyFrom(this._tempMeasure)) : (this._tempMeasure.copyFromFloats(this._currentMeasure.left, y + N * (1 - this._barImageHeight) * 0.5, M, N * this._barImageHeight), this._tempMeasure.width += this._effectiveThumbThickness, this._backgroundImage._currentMeasure.copyFrom(this._tempMeasure)), this._backgroundImage._draw(i)), this.isVertical ? this._tempMeasure.copyFromFloats(g - this._effectiveBarOffset + this._currentMeasure.width * (1 - this._thumbHeight) * 0.5, this._currentMeasure.top + d, this._currentMeasure.width * this._thumbHeight, this._effectiveThumbThickness) : this._tempMeasure.copyFromFloats(this._currentMeasure.left + d, this._currentMeasure.top + this._currentMeasure.height * (1 - this._thumbHeight) * 0.5, this._effectiveThumbThickness, this._currentMeasure.height * this._thumbHeight), this._thumbImage && (this._thumbImage._currentMeasure.copyFrom(this._tempMeasure), this._thumbImage._draw(i)), i.restore();+ }+ /**+ * @internal+ */+ _updateValueFromPointer(i, d) {+ this._invertTransformMatrix.transformCoordinates(i, d, this._transformedPosition), i = this._transformedPosition.x, d = this._transformedPosition.y;+ const g = this._invertScrollDirection ? -1 : 1;+ this._first && (this._first = !1, this._originX = i, this._originY = d, (i < this._tempMeasure.left || i > this._tempMeasure.left + this._tempMeasure.width || d < this._tempMeasure.top || d > this._tempMeasure.top + this._tempMeasure.height) && (this.isVertical ? this.value = this.minimum + (1 - (d - this._currentMeasure.top) / this._currentMeasure.height) * (this.maximum - this.minimum) : this.value = this.minimum + (i - this._currentMeasure.left) / this._currentMeasure.width * (this.maximum - this.minimum)));+ let y;+ this.isVertical ? y = -((d - this._originY) / (this._currentMeasure.height - this._effectiveThumbThickness)) : y = (i - this._originX) / (this._currentMeasure.width - this._effectiveThumbThickness), this.value += g * y * (this.maximum - this.minimum), this._originX = i, this._originY = d;+ }+ _onPointerDown(i, d, g, y, M) {+ return this._first = !0, super._onPointerDown(i, d, g, y, M);+ }+}+q([+ H()+], $g.prototype, "num90RotationInVerticalMode", void 0);+q([+ H()+], $g.prototype, "invertScrollDirection", null);+class Lu extends si {+ /**+ * Gets the horizontal scrollbar+ */+ get horizontalBar() {+ return this._horizontalBar;+ }+ /**+ * Gets the vertical scrollbar+ */+ get verticalBar() {+ return this._verticalBar;+ }+ /**+ * Adds a new control to the current container+ * @param control defines the control to add+ * @returns the current container+ */+ addControl(i) {+ return i ? (this._window.addControl(i), this) : this;+ }+ /**+ * Removes a control from the current container+ * @param control defines the control to remove+ * @returns the current container+ */+ removeControl(i) {+ return this._window.removeControl(i), this;+ }+ /** Gets the list of children */+ get children() {+ return this._window.children;+ }+ _flagDescendantsAsMatrixDirty() {+ for (const i of this._children)+ i._markMatrixAsDirty();+ }+ /**+ * Freezes or unfreezes the controls in the window.+ * When controls are frozen, the scroll viewer can render a lot more quickly but updates to positions/sizes of controls+ * are not taken into account. If you want to change positions/sizes, unfreeze, perform the changes then freeze again+ */+ get freezeControls() {+ return this._window.freezeControls;+ }+ set freezeControls(i) {+ this._window.freezeControls = i;+ }+ /** Gets the bucket width */+ get bucketWidth() {+ return this._window.bucketWidth;+ }+ /** Gets the bucket height */+ get bucketHeight() {+ return this._window.bucketHeight;+ }+ /**+ * Sets the bucket sizes.+ * When freezeControls is true, setting a non-zero bucket size will improve performances by updating only+ * controls that are visible. The bucket sizes is used to subdivide (internally) the window area to smaller areas into which+ * controls are dispatched. So, the size should be roughly equals to the mean size of all the controls of+ * the window. To disable the usage of buckets, sets either width or height (or both) to 0.+ * Please note that using this option will raise the memory usage (the higher the bucket sizes, the less memory+ * used), that's why it is not enabled by default.+ * @param width width of the bucket+ * @param height height of the bucket+ */+ setBucketSizes(i, d) {+ this._window.setBucketSizes(i, d);+ }+ /**+ * Forces the horizontal scroll bar to be displayed+ */+ get forceHorizontalBar() {+ return this._forceHorizontalBar;+ }+ set forceHorizontalBar(i) {+ this._grid.setRowDefinition(1, i ? this._barSize : 0, !0), this._horizontalBar.isVisible = i, this._forceHorizontalBar = i;+ }+ /**+ * Forces the vertical scroll bar to be displayed+ */+ get forceVerticalBar() {+ return this._forceVerticalBar;+ }+ set forceVerticalBar(i) {+ this._grid.setColumnDefinition(1, i ? this._barSize : 0, !0), this._verticalBar.isVisible = i, this._forceVerticalBar = i;+ }+ /**+ * Creates a new ScrollViewer+ * @param name of ScrollViewer+ * @param isImageBased+ */+ constructor(i, d) {+ super(i), this._barSize = 20, this._pointerIsOver = !1, this._wheelPrecision = 0.05, this._thumbLength = 0.5, this._thumbHeight = 1, this._barImageHeight = 1, this._horizontalBarImageHeight = 1, this._verticalBarImageHeight = 1, this._oldWindowContentsWidth = 0, this._oldWindowContentsHeight = 0, this._forceHorizontalBar = !1, this._forceVerticalBar = !1, this._useImageBar = d || !1, this.onDirtyObservable.add(() => {+ this._horizontalBarSpace.color = this.color, this._verticalBarSpace.color = this.color, this._dragSpace.color = this.color;+ }), this.onPointerEnterObservable.add(() => {+ this._pointerIsOver = !0;+ }), this.onPointerOutObservable.add(() => {+ this._pointerIsOver = !1;+ }), this._grid = new Hi(), this._useImageBar ? (this._horizontalBar = new $g(), this._verticalBar = new $g()) : (this._horizontalBar = new Cu(), this._verticalBar = new Cu()), this._window = new V9("scrollViewer_window"), this._window.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this._window.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, this._grid.addColumnDefinition(1), this._grid.addColumnDefinition(0, !0), this._grid.addRowDefinition(1), this._grid.addRowDefinition(0, !0), super.addControl(this._grid), this._grid.addControl(this._window, 0, 0), this._verticalBarSpace = new si(), this._verticalBarSpace.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this._verticalBarSpace.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, this._verticalBarSpace.thickness = 1, this._grid.addControl(this._verticalBarSpace, 0, 1), this._addBar(this._verticalBar, this._verticalBarSpace, !0, Math.PI), this._horizontalBarSpace = new si(), this._horizontalBarSpace.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this._horizontalBarSpace.verticalAlignment = pe.VERTICAL_ALIGNMENT_TOP, this._horizontalBarSpace.thickness = 1, this._grid.addControl(this._horizontalBarSpace, 1, 0), this._addBar(this._horizontalBar, this._horizontalBarSpace, !1, 0), this._dragSpace = new si(), this._dragSpace.thickness = 1, this._grid.addControl(this._dragSpace, 1, 1), this._grid.clipChildren = !1, this._useImageBar || (this.barColor = "grey", this.barBackground = "transparent");+ }+ /** Reset the scroll viewer window to initial size */+ resetWindow() {+ this._window.width = "100%", this._window.height = "100%";+ }+ _getTypeName() {+ return "ScrollViewer";+ }+ _buildClientSizes() {+ const i = this.host.idealRatio;+ this._window.parentClientWidth = this._currentMeasure.width - (this._verticalBar.isVisible || this.forceVerticalBar ? this._barSize * i : 0) - 2 * this.thickness, this._window.parentClientHeight = this._currentMeasure.height - (this._horizontalBar.isVisible || this.forceHorizontalBar ? this._barSize * i : 0) - 2 * this.thickness, this._clientWidth = this._window.parentClientWidth, this._clientHeight = this._window.parentClientHeight;+ }+ _additionalProcessing(i, d) {+ super._additionalProcessing(i, d), this._buildClientSizes();+ }+ _postMeasure() {+ super._postMeasure(), this._updateScroller(), this._setWindowPosition(!1);+ }+ /**+ * Gets or sets the mouse wheel precision+ * from 0 to 1 with a default value of 0.05+ * */+ get wheelPrecision() {+ return this._wheelPrecision;+ }+ set wheelPrecision(i) {+ this._wheelPrecision !== i && (i < 0 && (i = 0), i > 1 && (i = 1), this._wheelPrecision = i);+ }+ /** Gets or sets the scroll bar container background color */+ get scrollBackground() {+ return this._horizontalBarSpace.background;+ }+ set scrollBackground(i) {+ this._horizontalBarSpace.background !== i && (this._horizontalBarSpace.background = i, this._verticalBarSpace.background = i);+ }+ /** Gets or sets the bar color */+ get barColor() {+ return this._barColor;+ }+ set barColor(i) {+ this._barColor !== i && (this._barColor = i, this._horizontalBar.color = i, this._verticalBar.color = i);+ }+ /** Gets or sets the bar image */+ get thumbImage() {+ return this._barImage;+ }+ set thumbImage(i) {+ if (this._barImage === i)+ return;+ this._barImage = i;+ const d = this._horizontalBar, g = this._verticalBar;+ d.thumbImage = i, g.thumbImage = i;+ }+ /** Gets or sets the horizontal bar image */+ get horizontalThumbImage() {+ return this._horizontalBarImage;+ }+ set horizontalThumbImage(i) {+ if (this._horizontalBarImage === i)+ return;+ this._horizontalBarImage = i;+ const d = this._horizontalBar;+ d.thumbImage = i;+ }+ /** Gets or sets the vertical bar image */+ get verticalThumbImage() {+ return this._verticalBarImage;+ }+ set verticalThumbImage(i) {+ if (this._verticalBarImage === i)+ return;+ this._verticalBarImage = i;+ const d = this._verticalBar;+ d.thumbImage = i;+ }+ /** Gets or sets the size of the bar */+ get barSize() {+ return this._barSize;+ }+ set barSize(i) {+ this._barSize !== i && (this._barSize = i, this._markAsDirty(), this._horizontalBar.isVisible && this._grid.setRowDefinition(1, this._barSize, !0), this._verticalBar.isVisible && this._grid.setColumnDefinition(1, this._barSize, !0));+ }+ /** Gets or sets the length of the thumb */+ get thumbLength() {+ return this._thumbLength;+ }+ set thumbLength(i) {+ if (this._thumbLength === i)+ return;+ i <= 0 && (i = 0.1), i > 1 && (i = 1), this._thumbLength = i;+ const d = this._horizontalBar, g = this._verticalBar;+ d.thumbLength = i, g.thumbLength = i, this._markAsDirty();+ }+ /** Gets or sets the height of the thumb */+ get thumbHeight() {+ return this._thumbHeight;+ }+ set thumbHeight(i) {+ if (this._thumbHeight === i)+ return;+ i <= 0 && (i = 0.1), i > 1 && (i = 1), this._thumbHeight = i;+ const d = this._horizontalBar, g = this._verticalBar;+ d.thumbHeight = i, g.thumbHeight = i, this._markAsDirty();+ }+ /** Gets or sets the height of the bar image */+ get barImageHeight() {+ return this._barImageHeight;+ }+ set barImageHeight(i) {+ if (this._barImageHeight === i)+ return;+ i <= 0 && (i = 0.1), i > 1 && (i = 1), this._barImageHeight = i;+ const d = this._horizontalBar, g = this._verticalBar;+ d.barImageHeight = i, g.barImageHeight = i, this._markAsDirty();+ }+ /** Gets or sets the height of the horizontal bar image */+ get horizontalBarImageHeight() {+ return this._horizontalBarImageHeight;+ }+ set horizontalBarImageHeight(i) {+ if (this._horizontalBarImageHeight === i)+ return;+ i <= 0 && (i = 0.1), i > 1 && (i = 1), this._horizontalBarImageHeight = i;+ const d = this._horizontalBar;+ d.barImageHeight = i, this._markAsDirty();+ }+ /** Gets or sets the height of the vertical bar image */+ get verticalBarImageHeight() {+ return this._verticalBarImageHeight;+ }+ set verticalBarImageHeight(i) {+ if (this._verticalBarImageHeight === i)+ return;+ i <= 0 && (i = 0.1), i > 1 && (i = 1), this._verticalBarImageHeight = i;+ const d = this._verticalBar;+ d.barImageHeight = i, this._markAsDirty();+ }+ /** Gets or sets the bar background */+ get barBackground() {+ return this._barBackground;+ }+ set barBackground(i) {+ if (this._barBackground === i)+ return;+ this._barBackground = i;+ const d = this._horizontalBar, g = this._verticalBar;+ d.background = i, g.background = i, this._dragSpace.background = i;+ }+ /** Gets or sets the bar background image */+ get barImage() {+ return this._barBackgroundImage;+ }+ set barImage(i) {+ this._barBackgroundImage = i;+ const d = this._horizontalBar, g = this._verticalBar;+ d.backgroundImage = i, g.backgroundImage = i;+ }+ /** Gets or sets the horizontal bar background image */+ get horizontalBarImage() {+ return this._horizontalBarBackgroundImage;+ }+ set horizontalBarImage(i) {+ this._horizontalBarBackgroundImage = i;+ const d = this._horizontalBar;+ d.backgroundImage = i;+ }+ /** Gets or sets the vertical bar background image */+ get verticalBarImage() {+ return this._verticalBarBackgroundImage;+ }+ set verticalBarImage(i) {+ this._verticalBarBackgroundImage = i;+ const d = this._verticalBar;+ d.backgroundImage = i;+ }+ _setWindowPosition(i = !0) {+ const d = this.host.idealRatio, g = this._window._currentMeasure.width, y = this._window._currentMeasure.height;+ if (!i && this._oldWindowContentsWidth === g && this._oldWindowContentsHeight === y)+ return;+ this._oldWindowContentsWidth = g, this._oldWindowContentsHeight = y;+ const M = this._clientWidth - g, N = this._clientHeight - y, O = this._horizontalBar.value / d * M + "px", F = this._verticalBar.value / d * N + "px";+ O !== this._window.left && (this._window.left = O, this.freezeControls || (this._rebuildLayout = !0)), F !== this._window.top && (this._window.top = F, this.freezeControls || (this._rebuildLayout = !0));+ }+ /** @internal */+ _updateScroller() {+ const i = this._window._currentMeasure.width, d = this._window._currentMeasure.height;+ this._horizontalBar.isVisible && i <= this._clientWidth && !this.forceHorizontalBar ? (this._grid.setRowDefinition(1, 0, !0), this._horizontalBar.isVisible = !1, this._horizontalBar.value = 0, this._rebuildLayout = !0) : !this._horizontalBar.isVisible && (i > this._clientWidth || this.forceHorizontalBar) && (this._grid.setRowDefinition(1, this._barSize, !0), this._horizontalBar.isVisible = !0, this._rebuildLayout = !0), this._verticalBar.isVisible && d <= this._clientHeight && !this.forceVerticalBar ? (this._grid.setColumnDefinition(1, 0, !0), this._verticalBar.isVisible = !1, this._verticalBar.value = 0, this._rebuildLayout = !0) : !this._verticalBar.isVisible && (d > this._clientHeight || this.forceVerticalBar) && (this._grid.setColumnDefinition(1, this._barSize, !0), this._verticalBar.isVisible = !0, this._rebuildLayout = !0), this._buildClientSizes();+ const g = this.host.idealRatio;+ this._horizontalBar.thumbWidth = this._thumbLength * 0.9 * (this._clientWidth / g) + "px", this._verticalBar.thumbWidth = this._thumbLength * 0.9 * (this._clientHeight / g) + "px";+ }+ _link(i) {+ super._link(i), this._attachWheel();+ }+ /**+ * @internal+ */+ _addBar(i, d, g, y) {+ i.paddingLeft = 0, i.width = "100%", i.height = "100%", i.barOffset = 0, i.value = 0, i.maximum = 1, i.horizontalAlignment = pe.HORIZONTAL_ALIGNMENT_CENTER, i.verticalAlignment = pe.VERTICAL_ALIGNMENT_CENTER, i.isVertical = g, i.rotation = y, i.isVisible = !1, d.addControl(i), i.onValueChangedObservable.add(() => {+ this._setWindowPosition();+ });+ }+ /** @internal */+ _attachWheel() {+ !this._host || this._onWheelObserver || (this._onWheelObserver = this.onWheelObservable.add((i) => {+ !this._pointerIsOver || this.isReadOnly || (this._verticalBar.isVisible == !0 && (i.y < 0 && this._verticalBar.value > 0 ? this._verticalBar.value -= this._wheelPrecision : i.y > 0 && this._verticalBar.value < this._verticalBar.maximum && (this._verticalBar.value += this._wheelPrecision)), this._horizontalBar.isVisible == !0 && (i.x < 0 && this._horizontalBar.value < this._horizontalBar.maximum ? this._horizontalBar.value += this._wheelPrecision : i.x > 0 && this._horizontalBar.value > 0 && (this._horizontalBar.value -= this._wheelPrecision)));+ }));+ }+ _renderHighlightSpecific(i) {+ this.isHighlighted && (super._renderHighlightSpecific(i), this._grid._renderHighlightSpecific(i), i.restore());+ }+ /** Releases associated resources */+ dispose() {+ this.onWheelObservable.remove(this._onWheelObserver), this._onWheelObserver = null, super.dispose();+ }+}+q([+ H()+], Lu.prototype, "wheelPrecision", null);+q([+ H()+], Lu.prototype, "scrollBackground", null);+q([+ H()+], Lu.prototype, "barColor", null);+q([+ H()+], Lu.prototype, "barSize", null);+q([+ H()+], Lu.prototype, "barBackground", null);+kr("BABYLON.GUI.ScrollViewer", Lu);+class sS extends si {+ /** Gets or sets group name this toggle button belongs to */+ get group() {+ return this._group;+ }+ set group(i) {+ this._group !== i && (this._group = i);+ }+ /** Gets or sets a boolean indicating if the toggle button is active or not */+ get isActive() {+ return this._isActive;+ }+ set isActive(i) {+ this._isActive !== i && (this._isActive = i, this._isActive ? this.toActiveAnimation?.() : this.toInactiveAnimation?.(), this._markAsDirty(), this.onIsActiveChangedObservable.notifyObservers(i), this._isActive && this._host && this._group && this._host.executeOnAllControls((d) => {+ if (d.typeName === "ToggleButton") {+ if (d === this)+ return;+ const g = d;+ g.group === this.group && (g.isActive = !1);+ }+ }));+ }+ /**+ * Creates a new ToggleButton+ * @param name defines the control name+ * @param group defines the toggle group this toggle belongs to+ */+ constructor(i, d) {+ super(i), this.name = i, this.onIsActiveChangedObservable = new qt(), this.delegatePickingToChildren = !1, this._isActive = !1, this.group = d ?? "", this.thickness = 0, this.isPointerBlocker = !0;+ let g = null;+ this.toActiveAnimation = () => {+ this.thickness = 1;+ }, this.toInactiveAnimation = () => {+ this.thickness = 0;+ }, this.pointerEnterActiveAnimation = () => {+ g = this.alpha, this.alpha -= 0.1;+ }, this.pointerOutActiveAnimation = () => {+ g !== null && (this.alpha = g);+ }, this.pointerDownActiveAnimation = () => {+ this.scaleX -= 0.05, this.scaleY -= 0.05;+ }, this.pointerUpActiveAnimation = () => {+ this.scaleX += 0.05, this.scaleY += 0.05;+ }, this.pointerEnterInactiveAnimation = () => {+ g = this.alpha, this.alpha -= 0.1;+ }, this.pointerOutInactiveAnimation = () => {+ g !== null && (this.alpha = g);+ }, this.pointerDownInactiveAnimation = () => {+ this.scaleX -= 0.05, this.scaleY -= 0.05;+ }, this.pointerUpInactiveAnimation = () => {+ this.scaleX += 0.05, this.scaleY += 0.05;+ };+ }+ _getTypeName() {+ return "ToggleButton";+ }+ // While being a container, the toggle button behaves like a control.+ /**+ * @internal+ */+ _processPicking(i, d, g, y, M, N, O, F) {+ if (!this._isEnabled || !this.isHitTestVisible || !this.isVisible || this.notRenderable || !super.contains(i, d))+ return !1;+ if (this.delegatePickingToChildren) {+ let ne = !1;+ for (let $ = this._children.length - 1; $ >= 0; $--) {+ const Q = this._children[$];+ if (Q.isEnabled && Q.isHitTestVisible && Q.isVisible && !Q.notRenderable && Q.contains(i, d)) {+ ne = !0;+ break;+ }+ }+ if (!ne)+ return !1;+ }+ return this._processObservables(y, i, d, g, M, N, O, F), !0;+ }+ /**+ * @internal+ */+ _onPointerEnter(i, d) {+ return super._onPointerEnter(i, d) ? (this.isReadOnly || (this._isActive ? this.pointerEnterActiveAnimation && this.pointerEnterActiveAnimation() : this.pointerEnterInactiveAnimation && this.pointerEnterInactiveAnimation()), !0) : !1;+ }+ /**+ * @internal+ */+ _onPointerOut(i, d, g = !1) {+ this.isReadOnly || (this._isActive ? this.pointerOutActiveAnimation && this.pointerOutActiveAnimation() : this.pointerOutInactiveAnimation && this.pointerOutInactiveAnimation()), super._onPointerOut(i, d, g);+ }+ /**+ * @internal+ */+ _onPointerDown(i, d, g, y, M) {+ return super._onPointerDown(i, d, g, y, M) ? (this.isReadOnly || (this._isActive ? this.pointerDownActiveAnimation && this.pointerDownActiveAnimation() : this.pointerDownInactiveAnimation && this.pointerDownInactiveAnimation()), !0) : !1;+ }+ /**+ * @internal+ */+ _onPointerUp(i, d, g, y, M, N) {+ this.isReadOnly || (this._isActive ? this.pointerUpActiveAnimation && this.pointerUpActiveAnimation() : this.pointerUpInactiveAnimation && this.pointerUpInactiveAnimation()), super._onPointerUp(i, d, g, y, M, N);+ }+}+kr("BABYLON.GUI.ToggleButton", sS);+class Q9 {+}+class jb extends Gi {+ constructor() {+ super(...arguments), this.onKeyPressObservable = new qt(), this.defaultButtonWidth = "40px", this.defaultButtonHeight = "40px", this.defaultButtonPaddingLeft = "2px", this.defaultButtonPaddingRight = "2px", this.defaultButtonPaddingTop = "2px", this.defaultButtonPaddingBottom = "2px", this.defaultButtonColor = "#DDD", this.defaultButtonBackground = "#070707", this.shiftButtonColor = "#7799FF", this.selectedShiftThickness = 1, this.shiftState = 0, this._currentlyConnectedInputText = null, this._connectedInputTexts = [], this._onKeyPressObserver = null;+ }+ _getTypeName() {+ return "VirtualKeyboard";+ }+ _createKey(i, d) {+ const g = Bs.CreateSimpleButton(i, i);+ return g.width = d && d.width ? d.width : this.defaultButtonWidth, g.height = d && d.height ? d.height : this.defaultButtonHeight, g.color = d && d.color ? d.color : this.defaultButtonColor, g.background = d && d.background ? d.background : this.defaultButtonBackground, g.paddingLeft = d && d.paddingLeft ? d.paddingLeft : this.defaultButtonPaddingLeft, g.paddingRight = d && d.paddingRight ? d.paddingRight : this.defaultButtonPaddingRight, g.paddingTop = d && d.paddingTop ? d.paddingTop : this.defaultButtonPaddingTop, g.paddingBottom = d && d.paddingBottom ? d.paddingBottom : this.defaultButtonPaddingBottom, g.thickness = 0, g.isFocusInvisible = !0, g.shadowColor = this.shadowColor, g.shadowBlur = this.shadowBlur, g.shadowOffsetX = this.shadowOffsetX, g.shadowOffsetY = this.shadowOffsetY, g.onPointerUpObservable.add(() => {+ this.onKeyPressObservable.notifyObservers(i);+ }), g;+ }+ /**+ * Adds a new row of keys+ * @param keys defines the list of keys to add+ * @param propertySets defines the associated property sets+ */+ addKeysRow(i, d) {+ const g = new Gi();+ g.isVertical = !1, g.isFocusInvisible = !0;+ let y = null;+ for (let M = 0; M < i.length; M++) {+ let N = null;+ d && d.length === i.length && (N = d[M]);+ const O = this._createKey(i[M], N);+ (!y || O.heightInPixels > y.heightInPixels) && (y = O), g.addControl(O);+ }+ g.height = y ? y.height : this.defaultButtonHeight, this.addControl(g);+ }+ /**+ * Set the shift key to a specific state+ * @param shiftState defines the new shift state+ */+ applyShiftState(i) {+ if (this.children)+ for (let d = 0; d < this.children.length; d++) {+ const g = this.children[d];+ if (!g || !g.children)+ continue;+ const y = g;+ for (let M = 0; M < y.children.length; M++) {+ const N = y.children[M];+ if (!N || !N.children[0])+ continue;+ const O = N.children[0];+ O.text === "⇧" && (N.color = i ? this.shiftButtonColor : this.defaultButtonColor, N.thickness = i > 1 ? this.selectedShiftThickness : 0), O.text = i > 0 ? O.text.toUpperCase() : O.text.toLowerCase();+ }+ }+ }+ /** Gets the input text control currently attached to the keyboard */+ get connectedInputText() {+ return this._currentlyConnectedInputText;+ }+ /**+ * Connects the keyboard with an input text control+ *+ * @param input defines the target control+ */+ connect(i) {+ if (this._connectedInputTexts.some((M) => M.input === i))+ return;+ this._onKeyPressObserver === null && (this._onKeyPressObserver = this.onKeyPressObservable.add((M) => {+ if (this._currentlyConnectedInputText) {+ switch (this._currentlyConnectedInputText._host.focusedControl = this._currentlyConnectedInputText, M) {+ case "⇧":+ this.shiftState++, this.shiftState > 2 && (this.shiftState = 0), this.applyShiftState(this.shiftState);+ return;+ case "←":+ this._currentlyConnectedInputText instanceof Au ? this._currentlyConnectedInputText.alternativeProcessKey("Backspace") : this._currentlyConnectedInputText.processKey(8);+ return;+ case "↵":+ this._currentlyConnectedInputText instanceof Au ? this._currentlyConnectedInputText.alternativeProcessKey("Enter") : this._currentlyConnectedInputText.processKey(13);+ return;+ }+ this._currentlyConnectedInputText instanceof Au ? this._currentlyConnectedInputText.alternativeProcessKey("", this.shiftState ? M.toUpperCase() : M) : this._currentlyConnectedInputText.processKey(-1, this.shiftState ? M.toUpperCase() : M), this.shiftState === 1 && (this.shiftState = 0, this.applyShiftState(this.shiftState));+ }+ })), this.isVisible = !1, this._currentlyConnectedInputText = i, i._connectedVirtualKeyboard = this;+ const g = i.onFocusObservable.add(() => {+ this._currentlyConnectedInputText = i, i._connectedVirtualKeyboard = this, this.isVisible = !0;+ }), y = i.onBlurObservable.add(() => {+ i._connectedVirtualKeyboard = null, this._currentlyConnectedInputText = null, this.isVisible = !1;+ });+ this._connectedInputTexts.push({+ input: i,+ onBlurObserver: y,+ onFocusObserver: g+ });+ }+ /**+ * Disconnects the keyboard from connected InputText controls+ *+ * @param input optionally defines a target control, otherwise all are disconnected+ */+ disconnect(i) {+ if (i) {+ const d = this._connectedInputTexts.filter((g) => g.input === i);+ d.length === 1 && (this._removeConnectedInputObservables(d[0]), this._connectedInputTexts = this._connectedInputTexts.filter((g) => g.input !== i), this._currentlyConnectedInputText === i && (this._currentlyConnectedInputText = null));+ } else {+ for (const d of this._connectedInputTexts)+ this._removeConnectedInputObservables(d);+ this._connectedInputTexts.length = 0;+ }+ this._connectedInputTexts.length === 0 && (this._currentlyConnectedInputText = null, this.onKeyPressObservable.remove(this._onKeyPressObserver), this._onKeyPressObserver = null);+ }+ _removeConnectedInputObservables(i) {+ i.input._connectedVirtualKeyboard = null, i.input.onFocusObservable.remove(i.onFocusObserver), i.input.onBlurObservable.remove(i.onBlurObserver);+ }+ /**+ * Release all resources+ */+ dispose() {+ super.dispose(), this.disconnect();+ }+ // Statics+ /**+ * Creates a new keyboard using a default layout+ *+ * @param name defines control name+ * @returns a new VirtualKeyboard+ */+ static CreateDefaultLayout(i) {+ const d = new jb(i);+ return d.addKeysRow(["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "←"]), d.addKeysRow(["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"]), d.addKeysRow(["a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "↵"]), d.addKeysRow(["⇧", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/"]), d.addKeysRow([" "], [{ width: "200px" }]), d;+ }+ /**+ * @internal+ */+ _parseFromContent(i, d) {+ super._parseFromContent(i, d);+ for (const g of this.children)+ if (g.getClassName() === "StackPanel") {+ const y = g;+ for (const M of y.children)+ M.getClassName() === "Button" && M.name && M.onPointerUpObservable.add(() => {+ this.onKeyPressObservable.notifyObservers(M.name);+ });+ }+ }+}+kr("BABYLON.GUI.VirtualKeyboard", jb);+class Xa extends pe {+ /** Gets or sets a boolean indicating if minor lines must be rendered (true by default)) */+ get displayMinorLines() {+ return this._displayMinorLines;+ }+ set displayMinorLines(i) {+ this._displayMinorLines !== i && (this._displayMinorLines = i, this._markAsDirty());+ }+ /** Gets or sets a boolean indicating if major lines must be rendered (true by default)) */+ get displayMajorLines() {+ return this._displayMajorLines;+ }+ set displayMajorLines(i) {+ this._displayMajorLines !== i && (this._displayMajorLines = i, this._markAsDirty());+ }+ /** Gets or sets background color (Black by default) */+ get background() {+ return this._background;+ }+ set background(i) {+ this._background !== i && (this._background = i, this._markAsDirty());+ }+ /** Gets or sets the width of each cell (20 by default) */+ get cellWidth() {+ return this._cellWidth;+ }+ set cellWidth(i) {+ this._cellWidth = i, this._markAsDirty();+ }+ /** Gets or sets the height of each cell (20 by default) */+ get cellHeight() {+ return this._cellHeight;+ }+ set cellHeight(i) {+ this._cellHeight = i, this._markAsDirty();+ }+ /** Gets or sets the tickness of minor lines (1 by default) */+ get minorLineTickness() {+ return this._minorLineTickness;+ }+ set minorLineTickness(i) {+ this._minorLineTickness = i, this._markAsDirty();+ }+ /** Gets or sets the color of minor lines (DarkGray by default) */+ get minorLineColor() {+ return this._minorLineColor;+ }+ set minorLineColor(i) {+ this._minorLineColor = i, this._markAsDirty();+ }+ /** Gets or sets the tickness of major lines (2 by default) */+ get majorLineTickness() {+ return this._majorLineTickness;+ }+ set majorLineTickness(i) {+ this._majorLineTickness = i, this._markAsDirty();+ }+ /** Gets or sets the color of major lines (White by default) */+ get majorLineColor() {+ return this._majorLineColor;+ }+ set majorLineColor(i) {+ this._majorLineColor = i, this._markAsDirty();+ }+ /** Gets or sets the frequency of major lines (default is 1 every 5 minor lines)*/+ get majorLineFrequency() {+ return this._majorLineFrequency;+ }+ set majorLineFrequency(i) {+ this._majorLineFrequency = i, this._markAsDirty();+ }+ /**+ * Creates a new GridDisplayRectangle+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._cellWidth = 20, this._cellHeight = 20, this._minorLineTickness = 1, this._minorLineColor = "DarkGray", this._majorLineTickness = 2, this._majorLineColor = "White", this._majorLineFrequency = 5, this._background = "Black", this._displayMajorLines = !0, this._displayMinorLines = !0;+ }+ _draw(i) {+ if (i.save(), this._applyStates(i), this._isEnabled) {+ this._background && (i.fillStyle = this._background, i.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height));+ const d = this._currentMeasure.width / this._cellWidth, g = this._currentMeasure.height / this._cellHeight, y = this._currentMeasure.left + this._currentMeasure.width / 2, M = this._currentMeasure.top + this._currentMeasure.height / 2;+ if (this._displayMinorLines) {+ i.strokeStyle = this._minorLineColor, i.lineWidth = this._minorLineTickness;+ for (let N = -d / 2 + 1; N < d / 2; N++) {+ const O = y + N * this.cellWidth;+ i.beginPath(), i.moveTo(O, this._currentMeasure.top), i.lineTo(O, this._currentMeasure.top + this._currentMeasure.height), i.stroke();+ }+ for (let N = -g / 2 + 1; N < g / 2; N++) {+ const O = M + N * this.cellHeight;+ i.beginPath(), i.moveTo(this._currentMeasure.left, O), i.lineTo(this._currentMeasure.left + this._currentMeasure.width, O), i.stroke();+ }+ }+ if (this._displayMajorLines) {+ i.strokeStyle = this._majorLineColor, i.lineWidth = this._majorLineTickness;+ for (let N = -d / 2 + this._majorLineFrequency; N < d / 2; N += this._majorLineFrequency) {+ const O = y + N * this.cellWidth;+ i.beginPath(), i.moveTo(O, this._currentMeasure.top), i.lineTo(O, this._currentMeasure.top + this._currentMeasure.height), i.stroke();+ }+ for (let N = -g / 2 + this._majorLineFrequency; N < g / 2; N += this._majorLineFrequency) {+ const O = M + N * this.cellHeight;+ i.moveTo(this._currentMeasure.left, O), i.lineTo(this._currentMeasure.left + this._currentMeasure.width, O), i.closePath(), i.stroke();+ }+ }+ }+ i.restore();+ }+ _getTypeName() {+ return "DisplayGrid";+ }+}+q([+ H()+], Xa.prototype, "displayMinorLines", null);+q([+ H()+], Xa.prototype, "displayMajorLines", null);+q([+ H()+], Xa.prototype, "background", null);+q([+ H()+], Xa.prototype, "cellWidth", null);+q([+ H()+], Xa.prototype, "cellHeight", null);+q([+ H()+], Xa.prototype, "minorLineTickness", null);+q([+ H()+], Xa.prototype, "minorLineColor", null);+q([+ H()+], Xa.prototype, "majorLineTickness", null);+q([+ H()+], Xa.prototype, "majorLineColor", null);+q([+ H()+], Xa.prototype, "majorLineFrequency", null);+kr("BABYLON.GUI.DisplayGrid", Xa);+class dw extends $n {+ get displayThumb() {+ return this._displayThumb && this.thumbImage != null;+ }+ set displayThumb(i) {+ this._displayThumb !== i && (this._displayThumb = i, this._markAsDirty());+ }+ /**+ * Gets or sets the image used to render the background+ */+ get backgroundImage() {+ return this._backgroundImage;+ }+ set backgroundImage(i) {+ this._backgroundImage !== i && (this._backgroundImage = i, i && !i.isLoaded && i.onImageLoadedObservable.addOnce(() => this._markAsDirty()), this._markAsDirty());+ }+ /**+ * Gets or sets the image used to render the value bar+ */+ get valueBarImage() {+ return this._valueBarImage;+ }+ set valueBarImage(i) {+ this._valueBarImage !== i && (this._valueBarImage = i, i && !i.isLoaded && i.onImageLoadedObservable.addOnce(() => this._markAsDirty()), this._markAsDirty());+ }+ /**+ * Gets or sets the image used to render the thumb+ */+ get thumbImage() {+ return this._thumbImage;+ }+ set thumbImage(i) {+ this._thumbImage !== i && (this._thumbImage = i, i && !i.isLoaded && i.onImageLoadedObservable.addOnce(() => this._markAsDirty()), this._markAsDirty());+ }+ /**+ * Creates a new ImageBasedSlider+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.name = i, this._tempMeasure = new Ko(0, 0, 0, 0);+ }+ _getTypeName() {+ return "ImageBasedSlider";+ }+ _draw(i) {+ i.save(), this._applyStates(i), this._prepareRenderingData("rectangle");+ const d = this._getThumbPosition(), g = this._renderLeft, y = this._renderTop, M = this._renderWidth, N = this._renderHeight;+ this._backgroundImage && (this._tempMeasure.copyFromFloats(g, y, M, N), this.isThumbClamped && this.displayThumb && (this.isVertical ? this._tempMeasure.height += this._effectiveThumbThickness : this._tempMeasure.width += this._effectiveThumbThickness), this._backgroundImage._currentMeasure.copyFrom(this._tempMeasure), this._backgroundImage._draw(i)), this._valueBarImage && (this.isVertical ? this.isThumbClamped && this.displayThumb ? this._tempMeasure.copyFromFloats(g, y + d, M, N - d + this._effectiveThumbThickness) : this._tempMeasure.copyFromFloats(g, y + d, M, N - d) : this.isThumbClamped && this.displayThumb ? this._tempMeasure.copyFromFloats(g, y, d + this._effectiveThumbThickness / 2, N) : this._tempMeasure.copyFromFloats(g, y, d, N), this._valueBarImage._currentMeasure.copyFrom(this._tempMeasure), this._valueBarImage._draw(i)), this.displayThumb && (this.isVertical ? this._tempMeasure.copyFromFloats(g - this._effectiveBarOffset, this._currentMeasure.top + d, this._currentMeasure.width, this._effectiveThumbThickness) : this._tempMeasure.copyFromFloats(this._currentMeasure.left + d, this._currentMeasure.top, this._effectiveThumbThickness, this._currentMeasure.height), this._thumbImage._currentMeasure.copyFrom(this._tempMeasure), this._thumbImage._draw(i)), i.restore();+ }+ /**+ * Serializes the current control+ * @param serializationObject defined the JSON serialized object+ */+ serialize(i) {+ super.serialize(i);+ const d = {}, g = {}, y = {};+ this.backgroundImage.serialize(d), this.thumbImage.serialize(g), this.valueBarImage.serialize(y), i.backgroundImage = d, i.thumbImage = g, i.valueBarImage = y;+ }+ /**+ * @internal+ */+ _parseFromContent(i, d) {+ super._parseFromContent(i, d), this.backgroundImage = Ft.Parse(i.backgroundImage, d), this.thumbImage = Ft.Parse(i.thumbImage, d), this.valueBarImage = Ft.Parse(i.valueBarImage, d);+ }+}+q([+ H()+], dw.prototype, "displayThumb", null);+kr("BABYLON.GUI.ImageBasedSlider", dw);+const U9 = "Statics";+pe.AddHeader = function($e, i, d, g) {+ const y = new Gi("panel"), M = g ? g.isHorizontal : !0, N = g ? g.controlFirst : !0;+ y.isVertical = !M;+ const O = new zr("header");+ return O.text = i, O.textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, M ? O.width = d : O.height = d, N ? (y.addControl($e), y.addControl(O), O.paddingLeft = "5px") : (y.addControl(O), y.addControl($e), O.paddingRight = "5px"), O.shadowBlur = $e.shadowBlur, O.shadowColor = $e.shadowColor, O.shadowOffsetX = $e.shadowOffsetX, O.shadowOffsetY = $e.shadowOffsetY, y;+};+class uw {+ constructor() {+ this._colorStops = [], this._gradientDirty = !0;+ }+ _addColorStopsToCanvasGradient() {+ for (const i of this._colorStops)+ this._canvasGradient.addColorStop(i.offset, i.color);+ }+ /**+ * If there are any changes or the context changed, regenerate the canvas gradient object. Else,+ * reuse the existing gradient.+ * @param context the context to create the gradient from+ * @returns the canvas gradient+ */+ getCanvasGradient(i) {+ return (this._gradientDirty || this._context !== i) && (this._context = i, this._canvasGradient = this._createCanvasGradient(i), this._addColorStopsToCanvasGradient(), this._gradientDirty = !1), this._canvasGradient;+ }+ /**+ * Adds a new color stop to the gradient.+ * @param offset the offset of the stop on the gradient. Should be between 0 and 1+ * @param color the color of the stop+ */+ addColorStop(i, d) {+ this._colorStops.push({ offset: i, color: d }), this._gradientDirty = !0;+ }+ /**+ * Removes an existing color stop with the specified offset from the gradient+ * @param offset the offset of the stop to be removed+ */+ removeColorStop(i) {+ this._colorStops = this._colorStops.filter((d) => d.offset !== i), this._gradientDirty = !0;+ }+ /**+ * Removes all color stops from the gradient+ */+ clearColorStops() {+ this._colorStops = [], this._gradientDirty = !0;+ }+ /**+ * Color stops of the gradient+ */+ get colorStops() {+ return this._colorStops;+ }+ /**+ * @returns Type of the gradient+ */+ getClassName() {+ return "BaseGradient";+ }+ /**+ * Serialize into a json object+ * @param serializationObject object to serialize into+ */+ serialize(i) {+ i.colorStops = this._colorStops, i.className = this.getClassName();+ }+ /**+ * Parse from json object+ * @param serializationObject object to parse from+ */+ parse(i) {+ this._colorStops = i.colorStops;+ }+}+class lS extends uw {+ /**+ * Creates a new linear gradient+ * @param x0+ * @param y0+ * @param x1+ * @param y1+ */+ constructor(i, d, g, y) {+ super(), this._x0 = i ?? 0, this._y0 = d ?? 0, this._x1 = g ?? 0, this._y1 = y ?? 0;+ }+ _createCanvasGradient(i) {+ return i.createLinearGradient(this._x0, this._y0, this._x1, this._y1);+ }+ /** X axis coordinate of the starting point in the line */+ get x0() {+ return this._x0;+ }+ /** X axis coordinate of the ending point in the line */+ get x1() {+ return this._x1;+ }+ /** Y axis coordinate of the starting point in the line */+ get y0() {+ return this._y0;+ }+ /** Y axis coordinate of the ending point in the line */+ get y1() {+ return this._y1;+ }+ /**+ * Class name of the gradient+ * @returns the class name of the gradient+ */+ getClassName() {+ return "LinearGradient";+ }+ /**+ * Serializes this gradient+ * @param serializationObject the object to serialize to+ */+ serialize(i) {+ super.serialize(i), i.x0 = this._x0, i.y0 = this._y0, i.x1 = this._x1, i.y1 = this._y1;+ }+ /**+ * Parses a gradient from a serialization object+ * @param serializationObject the object to parse from+ */+ parse(i) {+ super.parse(i), this._x0 = i.x0, this._y0 = i.y0, this._x1 = i.x1, this._y1 = i.y1;+ }+}+kr("BABYLON.GUI.LinearGradient", lS);+class cS extends uw {+ /**+ * Creates a new radial gradient+ * @param x0 x coordinate of the first circle's center+ * @param y0 y coordinate of the first circle's center+ * @param r0 radius of the first circle+ * @param x1 x coordinate of the second circle's center+ * @param y1 y coordinate of the second circle's center+ * @param r1 radius of the second circle+ */+ constructor(i, d, g, y, M, N) {+ super(), this._x0 = i ?? 0, this._y0 = d ?? 0, this._r0 = g ?? 0, this._x1 = y ?? 0, this._y1 = M ?? 0, this._r1 = N ?? 0;+ }+ _createCanvasGradient(i) {+ return i.createRadialGradient(this._x0, this._y0, this._r0, this._x1, this._y1, this._r1);+ }+ /** x coordinate of the first circle's center */+ get x0() {+ return this._x0;+ }+ /** x coordinate of the second circle's center */+ get x1() {+ return this._x1;+ }+ /** y coordinate of the first circle's center */+ get y0() {+ return this._y0;+ }+ /** y coordinate of the second circle's center */+ get y1() {+ return this._y1;+ }+ /** radius of the first circle */+ get r0() {+ return this._r0;+ }+ /** radius of the second circle */+ get r1() {+ return this._r1;+ }+ /**+ * Class name of the gradient+ * @returns the class name of the gradient+ */+ getClassName() {+ return "RadialGradient";+ }+ /**+ * Serializes this gradient+ * @param serializationObject the object to serialize to+ */+ serialize(i) {+ super.serialize(i), i.x0 = this._x0, i.y0 = this._y0, i.r0 = this._r0, i.x1 = this._x1, i.y1 = this._y1, i.r1 = this._r1;+ }+ /**+ * Parses a gradient from a serialization object+ * @param serializationObject the object to parse from+ */+ parse(i) {+ super.parse(i), this._x0 = i.x0, this._y0 = i.y0, this._r0 = i.r0, this._x1 = i.x1, this._y1 = i.y1, this._r1 = i.r1;+ }+}+kr("BABYLON.GUI.RadialGradient", cS);+class dS {+ /**+ * Creates a new style object+ * @param host defines the AdvancedDynamicTexture which hosts this style+ */+ constructor(i) {+ this._fontFamily = "Arial", this._fontStyle = "", this._fontWeight = "", this._fontSize = new St(18, St.UNITMODE_PIXEL, !1), this.onChangedObservable = new qt(), this._host = i;+ }+ /**+ * Gets or sets the font size+ */+ get fontSize() {+ return this._fontSize.toString(this._host);+ }+ set fontSize(i) {+ this._fontSize.toString(this._host) !== i && this._fontSize.fromString(i) && this.onChangedObservable.notifyObservers(this);+ }+ /**+ * Gets or sets the font family+ */+ get fontFamily() {+ return this._fontFamily;+ }+ set fontFamily(i) {+ this._fontFamily !== i && (this._fontFamily = i, this.onChangedObservable.notifyObservers(this));+ }+ /**+ * Gets or sets the font style+ */+ get fontStyle() {+ return this._fontStyle;+ }+ set fontStyle(i) {+ this._fontStyle !== i && (this._fontStyle = i, this.onChangedObservable.notifyObservers(this));+ }+ /** Gets or sets font weight */+ get fontWeight() {+ return this._fontWeight;+ }+ set fontWeight(i) {+ this._fontWeight !== i && (this._fontWeight = i, this.onChangedObservable.notifyObservers(this));+ }+ /** Dispose all associated resources */+ dispose() {+ this.onChangedObservable.clear();+ }+}+class go extends K4 {+ /** Gets the number of layout calls made the last time the ADT has been rendered */+ get numLayoutCalls() {+ return this._numLayoutCalls;+ }+ /** Gets the number of render calls made the last time the ADT has been rendered */+ get numRenderCalls() {+ return this._numRenderCalls;+ }+ /**+ * If set to true, the renderScale will be adjusted automatically to the engine's hardware scaling+ * If this is set to true, manually setting the renderScale will be ignored+ * This is useful when the engine's hardware scaling is set to a value other than 1+ */+ get adjustToEngineHardwareScalingLevel() {+ return this._adjustToEngineHardwareScalingLevel;+ }+ set adjustToEngineHardwareScalingLevel(i) {+ this._adjustToEngineHardwareScalingLevel !== i && (this._adjustToEngineHardwareScalingLevel = i, this._onResize());+ }+ /**+ * Gets or sets a number used to scale rendering size (2 means that the texture will be twice bigger).+ * Useful when you want more antialiasing+ */+ get renderScale() {+ return this._renderScale;+ }+ set renderScale(i) {+ i !== this._renderScale && (this._renderScale = i, this._onResize());+ }+ /** Gets or sets the background color */+ get background() {+ return this._background;+ }+ set background(i) {+ this._background !== i && (this._background = i, this.markAsDirty());+ }+ /**+ * Gets or sets the ideal width used to design controls.+ * The GUI will then rescale everything accordingly+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling+ */+ get idealWidth() {+ return this._idealWidth;+ }+ set idealWidth(i) {+ this._idealWidth !== i && (this._idealWidth = i, this.markAsDirty(), this._rootContainer._markAllAsDirty());+ }+ /**+ * Gets or sets the ideal height used to design controls.+ * The GUI will then rescale everything accordingly+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling+ */+ get idealHeight() {+ return this._idealHeight;+ }+ set idealHeight(i) {+ this._idealHeight !== i && (this._idealHeight = i, this.markAsDirty(), this._rootContainer._markAllAsDirty());+ }+ /**+ * Gets or sets a boolean indicating if the smallest ideal value must be used if idealWidth and idealHeight are both set+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling+ */+ get useSmallestIdeal() {+ return this._useSmallestIdeal;+ }+ set useSmallestIdeal(i) {+ this._useSmallestIdeal !== i && (this._useSmallestIdeal = i, this.markAsDirty(), this._rootContainer._markAllAsDirty());+ }+ /**+ * Gets or sets a boolean indicating if adaptive scaling must be used+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling+ */+ get renderAtIdealSize() {+ return this._renderAtIdealSize;+ }+ set renderAtIdealSize(i) {+ this._renderAtIdealSize !== i && (this._renderAtIdealSize = i, this._onResize());+ }+ /**+ * Gets the ratio used when in "ideal mode"+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling+ * */+ get idealRatio() {+ let i = 0, d = 0;+ return this._idealWidth && (i = this.getSize().width / this._idealWidth), this._idealHeight && (d = this.getSize().height / this._idealHeight), this._useSmallestIdeal && this._idealWidth && this._idealHeight ? window.innerWidth < window.innerHeight ? i : d : this._idealWidth ? i : this._idealHeight ? d : 1;+ }+ /**+ * Gets the underlying layer used to render the texture when in fullscreen mode+ */+ get layer() {+ return this._layerToDispose;+ }+ /**+ * Gets the root container control+ */+ get rootContainer() {+ return this._rootContainer;+ }+ /**+ * Returns an array containing the root container.+ * This is mostly used to let the Inspector introspects the ADT+ * @returns an array containing the rootContainer+ */+ getChildren() {+ return [this._rootContainer];+ }+ /**+ * Will return all controls that are inside this texture+ * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered+ * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored+ * @returns all child controls+ */+ getDescendants(i, d) {+ return this._rootContainer.getDescendants(i, d);+ }+ /**+ * Will return all controls with the given type name+ * @param typeName defines the type name to search for+ * @returns an array of all controls found+ */+ getControlsByType(i) {+ return this._rootContainer.getDescendants(!1, (d) => d.typeName === i);+ }+ /**+ * Will return the first control with the given name+ * @param name defines the name to search for+ * @returns the first control found or null+ */+ getControlByName(i) {+ return this._getControlByKey("name", i);+ }+ _getControlByKey(i, d) {+ return this._rootContainer.getDescendants().find((g) => g[i] === d) || null;+ }+ /**+ * Gets or sets the current focused control+ */+ get focusedControl() {+ return this._focusedControl;+ }+ set focusedControl(i) {+ this._focusedControl != i && (this._focusedControl && this._focusedControl.onBlur(), i && i.onFocus(), this._focusedControl = i);+ }+ /**+ * Gets or sets a boolean indicating if the texture must be rendered in background or foreground when in fullscreen mode+ */+ get isForeground() {+ return this.layer ? !this.layer.isBackground : !0;+ }+ set isForeground(i) {+ this.layer && this.layer.isBackground !== !i && (this.layer.isBackground = !i);+ }+ /**+ * Gets or set information about clipboardData+ */+ get clipboardData() {+ return this._clipboardData;+ }+ set clipboardData(i) {+ this._clipboardData = i;+ }+ /** @internal */+ constructor(i, d, g = 0, y, M = !1, N = Wr.NEAREST_SAMPLINGMODE, O = !0) {+ d = d ?? 0;+ const F = typeof d == "object" && d !== void 0 ? d.width ?? 0 : d ?? 0, ne = typeof d == "object" && d !== void 0 ? d.height ?? 0 : g;+ if (super(i, { width: F, height: ne }, typeof d == "object" && d !== void 0 ? d : y, M, N, Is.TEXTUREFORMAT_RGBA, O), this.useStandalone = !1, this.onGuiReadyObservable = new qt(), this._isDirty = !1, this._rootContainer = new wi("root"), this._lastControlOver = {}, this._lastControlDown = {}, this._capturingControl = {}, this._linkedControls = new Array(), this._isFullscreen = !1, this._fullscreenViewport = new Kg(0, 0, 1, 1), this._idealWidth = 0, this._idealHeight = 0, this._useSmallestIdeal = !1, this._renderAtIdealSize = !1, this._blockNextFocusCheck = !1, this._renderScale = 1, this._cursorChanged = !1, this._defaultMousePointerId = 0, this._rootChildrenHaveChanged = !1, this._adjustToEngineHardwareScalingLevel = !1, this._capturedPointerIds = /* @__PURE__ */ new Set(), this._numLayoutCalls = 0, this._numRenderCalls = 0, this._clipboardData = "", this.onClipboardObservable = new qt(), this.onControlPickedObservable = new qt(), this.onBeginLayoutObservable = new qt(), this.onEndLayoutObservable = new qt(), this.onBeginRenderObservable = new qt(), this.onEndRenderObservable = new qt(), this.premulAlpha = !1, this.applyYInversionOnUpdate = !0, this.disableTabNavigation = !1, this.disablePicking = !1, this.usePointerTapForClickEvent = !1, this.skipBlockEvents = 0, this.checkPointerEveryFrame = !1, this._useInvalidateRectOptimization = !0, this._invalidatedRectangle = null, this._alreadyRegisteredForRender = !1, this._clearMeasure = new Ko(0, 0, 0, 0), this._focusProperties = { index: 0, total: -1 }, this._onClipboardCopy = (Q) => {+ const X = Q, he = new ew(Ih.COPY, X);+ this.onClipboardObservable.notifyObservers(he), X.preventDefault();+ }, this._onClipboardCut = (Q) => {+ const X = Q, he = new ew(Ih.CUT, X);+ this.onClipboardObservable.notifyObservers(he), X.preventDefault();+ }, this._onClipboardPaste = (Q) => {+ const X = Q, he = new ew(Ih.PASTE, X);+ this.onClipboardObservable.notifyObservers(he), X.preventDefault();+ }, this.parseContent = this.parseSerializedObject, y = this.getScene(), !y || !this._texture)+ return;+ this.applyYInversionOnUpdate = O, this._rootElement = y.getEngine().getInputElement();+ const $ = d;+ this.useStandalone = !!$?.useStandalone, this.useStandalone || (this._renderObserver = y.onBeforeCameraRenderObservable.add((Q) => this._checkUpdate(Q))), this._controlAddedObserver = this._rootContainer.onControlAddedObservable.add((Q) => {+ Q && (this._rootChildrenHaveChanged = !0);+ }), this._controlRemovedObserver = this._rootContainer.onControlRemovedObservable.add((Q) => {+ Q && (this._rootChildrenHaveChanged = !0);+ }), this._preKeyboardObserver = y.onPreKeyboardObservable.add((Q) => {+ if (!this.disableTabNavigation && Q.type === C4.KEYDOWN && Q.event.code === "Tab") {+ const X = !Q.event.shiftKey;+ if (X && this._focusProperties.index === this._focusProperties.total - 1 || !X && this._focusProperties.index === 0 && this._focusProperties.total > 0) {+ this.focusedControl = null, this._focusProperties.index = 0, this._focusProperties.total = -1;+ return;+ }+ this._focusNextElement(X), Q.event.preventDefault();+ return;+ }+ this._focusedControl && (Q.type === C4.KEYDOWN && this._focusedControl.processKeyboard(Q.event), Q.skipOnPointerObservable = !0);+ }), this._rootContainer._link(this), this.hasAlpha = !0, (!F || !ne) && (this._resizeObserver = y.getEngine().onResizeObservable.add(() => this._onResize()), this._onResize()), this._texture.isReady = !0;+ }+ /**+ * Get the current class name of the texture useful for serialization or dynamic coding.+ * @returns "AdvancedDynamicTexture"+ */+ getClassName() {+ return "AdvancedDynamicTexture";+ }+ /**+ * Function used to execute a function on all controls+ * @param func defines the function to execute+ * @param container defines the container where controls belong. If null the root container will be used+ */+ executeOnAllControls(i, d) {+ d || (d = this._rootContainer), i(d);+ for (const g of d.children) {+ if (g.children) {+ this.executeOnAllControls(i, g);+ continue;+ }+ i(g);+ }+ }+ /**+ * Gets or sets a boolean indicating if the InvalidateRect optimization should be turned on+ */+ get useInvalidateRectOptimization() {+ return this._useInvalidateRectOptimization;+ }+ set useInvalidateRectOptimization(i) {+ this._useInvalidateRectOptimization = i;+ }+ /**+ * Invalidates a rectangle area on the gui texture+ * @param invalidMinX left most position of the rectangle to invalidate in the texture+ * @param invalidMinY top most position of the rectangle to invalidate in the texture+ * @param invalidMaxX right most position of the rectangle to invalidate in the texture+ * @param invalidMaxY bottom most position of the rectangle to invalidate in the texture+ */+ invalidateRect(i, d, g, y) {+ if (this._useInvalidateRectOptimization)+ if (!this._invalidatedRectangle)+ this._invalidatedRectangle = new Ko(i, d, g - i + 1, y - d + 1);+ else {+ const M = Math.ceil(Math.max(this._invalidatedRectangle.left + this._invalidatedRectangle.width - 1, g)), N = Math.ceil(Math.max(this._invalidatedRectangle.top + this._invalidatedRectangle.height - 1, y));+ this._invalidatedRectangle.left = Math.floor(Math.min(this._invalidatedRectangle.left, i)), this._invalidatedRectangle.top = Math.floor(Math.min(this._invalidatedRectangle.top, d)), this._invalidatedRectangle.width = M - this._invalidatedRectangle.left + 1, this._invalidatedRectangle.height = N - this._invalidatedRectangle.top + 1;+ }+ }+ /**+ * Marks the texture as dirty forcing a complete update+ */+ markAsDirty() {+ this._isDirty = !0;+ }+ /**+ * Helper function used to create a new style+ * @returns a new style+ * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#styles+ */+ createStyle() {+ return new dS(this);+ }+ /**+ * Adds a new control to the root container+ * @param control defines the control to add+ * @returns the current texture+ */+ addControl(i) {+ return this._rootContainer.addControl(i), this;+ }+ /**+ * Removes a control from the root container+ * @param control defines the control to remove+ * @returns the current texture+ */+ removeControl(i) {+ return this._rootContainer.removeControl(i), this;+ }+ /**+ * Moves overlapped controls towards a position where it is not overlapping anymore.+ * Please note that this method alters linkOffsetXInPixels and linkOffsetYInPixels.+ * @param overlapGroup the overlap group which will be processed or undefined to process all overlap groups+ * @param deltaStep the step size (speed) to reach the target non overlapping position (default 0.1)+ * @param repelFactor how much is the control repelled by other controls+ */+ moveToNonOverlappedPosition(i, d = 1, g = 1) {+ let y;+ if (Array.isArray(i))+ y = i;+ else {+ const M = this.getDescendants(!0);+ y = i === void 0 ? M.filter((N) => N.overlapGroup !== void 0) : M.filter((N) => N.overlapGroup === i);+ }+ for (const M of y) {+ let N = mo.Zero();+ const O = new mo(M.centerX, M.centerY);+ for (const F of y)+ if (M !== F && go._Overlaps(M, F)) {+ const ne = O.subtract(new mo(F.centerX, F.centerY)), $ = ne.length();+ $ > 0 && (N = N.add(ne.normalize().scale(g / $)));+ }+ N.length() > 0 && (N = N.normalize().scale(d * (M.overlapDeltaMultiplier ?? 1)), M.linkOffsetXInPixels += N.x, M.linkOffsetYInPixels += N.y);+ }+ }+ /**+ * Release all resources+ */+ dispose() {+ const i = this.getScene();+ i && (this._rootElement = null, i.onBeforeCameraRenderObservable.remove(this._renderObserver), this._resizeObserver && i.getEngine().onResizeObservable.remove(this._resizeObserver), this._prePointerObserver && i.onPrePointerObservable.remove(this._prePointerObserver), this._sceneRenderObserver && i.onBeforeRenderObservable.remove(this._sceneRenderObserver), this._pointerObserver && i.onPointerObservable.remove(this._pointerObserver), this._preKeyboardObserver && i.onPreKeyboardObservable.remove(this._preKeyboardObserver), this._canvasPointerOutObserver && i.getEngine().onCanvasPointerOutObservable.remove(this._canvasPointerOutObserver), this._canvasBlurObserver && i.getEngine().onCanvasBlurObservable.remove(this._canvasBlurObserver), this._controlAddedObserver && this._rootContainer.onControlAddedObservable.remove(this._controlAddedObserver), this._controlRemovedObserver && this._rootContainer.onControlRemovedObservable.remove(this._controlRemovedObserver), this._layerToDispose && (this._layerToDispose.texture = null, this._layerToDispose.dispose(), this._layerToDispose = null), this._rootContainer.dispose(), this.onClipboardObservable.clear(), this.onControlPickedObservable.clear(), this.onBeginRenderObservable.clear(), this.onEndRenderObservable.clear(), this.onBeginLayoutObservable.clear(), this.onEndLayoutObservable.clear(), this.onGuiReadyObservable.clear(), super.dispose());+ }+ _onResize() {+ const i = this.getScene();+ if (!i)+ return;+ const d = i.getEngine();+ this.adjustToEngineHardwareScalingLevel && (this._renderScale = d.getHardwareScalingLevel(), this._renderScale = 1 / Math.max(this._renderScale, d.getRenderWidth() / d.getCaps().maxTextureSize, d.getRenderHeight() / d.getCaps().maxTextureSize));+ const g = this.getSize();+ let y = d.getRenderWidth() * this._renderScale, M = d.getRenderHeight() * this._renderScale;+ if (this._renderAtIdealSize && (this._idealWidth ? (M = M * this._idealWidth / y, y = this._idealWidth) : this._idealHeight && (y = y * this._idealHeight / M, M = this._idealHeight)), g.width !== y || g.height !== M) {+ if (this.scaleTo(y, M), this.adjustToEngineHardwareScalingLevel) {+ const N = 1 / d.getHardwareScalingLevel(), O = this._renderScale * N;+ this._rootContainer.scaleX = O, this._rootContainer.scaleY = O, this._rootContainer.widthInPixels = y / O, this._rootContainer.heightInPixels = M / O;+ }+ this.markAsDirty(), (this._idealWidth || this._idealHeight) && this._rootContainer._markAllAsDirty(), this._alreadyRegisteredForRender || (this._alreadyRegisteredForRender = !0, Lr.SetImmediate(() => {+ this.update(this.applyYInversionOnUpdate, this.premulAlpha, go.AllowGPUOptimizations), this._alreadyRegisteredForRender = !1;+ }));+ }+ this.invalidateRect(0, 0, g.width - 1, g.height - 1);+ }+ /** @internal */+ _getGlobalViewport() {+ const i = this.getSize(), d = this._fullscreenViewport.toGlobal(i.width, i.height), g = Math.round(d.width / this._rootContainer.scaleX), y = Math.round(d.height / this._rootContainer.scaleY), M = this._adjustToEngineHardwareScalingLevel ? this._renderScale / (this.getScene()?.getEngine().getHardwareScalingLevel() || 1) : 1;+ return d.x += (d.width / M - g) / 2, d.y += (d.height / M - y) / 2, d.width = g, d.height = y, d;+ }+ /**+ * Get screen coordinates for a vector3+ * @param position defines the position to project+ * @param worldMatrix defines the world matrix to use+ * @returns the projected position+ */+ getProjectedPosition(i, d) {+ const g = this.getProjectedPositionWithZ(i, d);+ return new mo(g.x, g.y);+ }+ /**+ * Get screen coordinates for a vector3+ * @param position defines the position to project+ * @param worldMatrix defines the world matrix to use+ * @returns the projected position with Z+ */+ getProjectedPositionWithZ(i, d) {+ const g = this.getScene();+ if (!g)+ return Se.Zero();+ const y = this._getGlobalViewport(), M = Se.Project(i, d, g.getTransformMatrix(), y);+ return new Se(M.x, M.y, M.z);+ }+ /** @internal */+ _checkUpdate(i, d) {+ if (!(this._layerToDispose && i && !(i.layerMask & this._layerToDispose.layerMask))) {+ if (this._isFullscreen && this._linkedControls.length) {+ const g = this.getScene();+ if (!g)+ return;+ const y = this._getGlobalViewport();+ for (const M of this._linkedControls) {+ if (!M.isVisible)+ continue;+ const N = M._linkedMesh;+ if (!N || N.isDisposed()) {+ Lr.SetImmediate(() => {+ M.linkWithMesh(null);+ });+ continue;+ }+ const O = N.getBoundingInfo ? N.getBoundingInfo().boundingSphere.center : Se.ZeroReadOnly, F = Se.Project(O, N.getWorldMatrix(), g.getTransformMatrix(), y);+ if (F.z < 0 || F.z > 1) {+ M.notRenderable = !0;+ continue;+ }+ M.notRenderable = !1, this.useInvalidateRectOptimization && M.invalidateRect(), M._moveToProjectedPosition(F);+ }+ }+ !this._isDirty && !this._rootContainer.isDirty || (this._isDirty = !1, this._render(d), d || this.update(this.applyYInversionOnUpdate, this.premulAlpha, go.AllowGPUOptimizations));+ }+ }+ _render(i) {+ const d = this.getSize(), g = d.width, y = d.height, M = this.getContext();+ if (M.font = "18px Arial", M.strokeStyle = "white", this.onGuiReadyObservable.hasObservers() && this._checkGuiIsReady(), this._rootChildrenHaveChanged) {+ const O = this.getScene()?.activeCamera;+ O && (this._rootChildrenHaveChanged = !1, this._checkUpdate(O, !0));+ }+ this.onBeginLayoutObservable.notifyObservers(this);+ const N = new Ko(0, 0, g, y);+ this._numLayoutCalls = 0, this._rootContainer._layout(N, M), this.onEndLayoutObservable.notifyObservers(this), this._isDirty = !1, !i && (this._invalidatedRectangle ? this._clearMeasure.copyFrom(this._invalidatedRectangle) : this._clearMeasure.copyFromFloats(0, 0, g, y), M.clearRect(this._clearMeasure.left, this._clearMeasure.top, this._clearMeasure.width, this._clearMeasure.height), this._background && (M.save(), M.fillStyle = this._background, M.fillRect(this._clearMeasure.left, this._clearMeasure.top, this._clearMeasure.width, this._clearMeasure.height), M.restore()), this.onBeginRenderObservable.notifyObservers(this), this._numRenderCalls = 0, this._rootContainer._render(M, this._invalidatedRectangle), this.onEndRenderObservable.notifyObservers(this), this._invalidatedRectangle = null);+ }+ /**+ * @internal+ */+ _changeCursor(i) {+ this._rootElement && (this._rootElement.style.cursor = i, this._cursorChanged = !0);+ }+ /**+ * @internal+ */+ _registerLastControlDown(i, d) {+ this._lastControlDown[d] = i, this.onControlPickedObservable.notifyObservers(i);+ }+ _doPicking(i, d, g, y, M, N, O, F) {+ const ne = this.getScene();+ if (!ne || this.disablePicking)+ return;+ const $ = ne.getEngine(), Q = this.getSize();+ if (this._isFullscreen) {+ const X = ne.cameraToUseForPointers || ne.activeCamera;+ if (!X)+ return;+ const he = X.viewport;+ i = i * (Q.width / ($.getRenderWidth() * he.width)), d = d * (Q.height / ($.getRenderHeight() * he.height));+ }+ if (this._capturingControl[M]) {+ this._capturingControl[M].isPointerBlocker && (this._shouldBlockPointer = !0), this._capturingControl[M]._processObservables(y, i, d, g, M, N);+ return;+ }+ this._cursorChanged = !1, this._rootContainer._processPicking(i, d, g, y, M, N, O, F) || (ne.doNotHandleCursors || this._changeCursor(""), y === Ir.POINTERMOVE && this._lastControlOver[M] && (this._lastControlOver[M]._onPointerOut(this._lastControlOver[M], g), delete this._lastControlOver[M])), !this._cursorChanged && !ne.doNotHandleCursors && this._changeCursor(""), this._manageFocus();+ }+ /**+ * @internal+ */+ _cleanControlAfterRemovalFromList(i, d) {+ for (const g in i) {+ if (!Object.prototype.hasOwnProperty.call(i, g))+ continue;+ i[g] === d && delete i[g];+ }+ }+ /**+ * @internal+ */+ _cleanControlAfterRemoval(i) {+ this._cleanControlAfterRemovalFromList(this._lastControlDown, i), this._cleanControlAfterRemovalFromList(this._lastControlOver, i);+ }+ /**+ * This function will run a pointer event on this ADT and will trigger any pointer events on any controls+ * This will work on a fullscreen ADT only. For mesh based ADT, simulate pointer events using the scene directly.+ * @param x pointer X on the canvas for the picking+ * @param y pointer Y on the canvas for the picking+ * @param pi optional pointer information+ */+ pick(i, d, g = null) {+ this._isFullscreen && this._scene && this._translateToPicking(this._scene, new Kg(0, 0, 0, 0), g, i, d);+ }+ _translateToPicking(i, d, g, y = i.pointerX, M = i.pointerY) {+ const N = i.cameraToUseForPointers || i.activeCamera, O = i.getEngine(), F = i.cameraToUseForPointers;+ if (!N)+ d.x = 0, d.y = 0, d.width = O.getRenderWidth(), d.height = O.getRenderHeight();+ else if (N.rigCameras.length) {+ const Q = new Kg(0, 0, 1, 1);+ for (const X of N.rigCameras) {+ X.viewport.toGlobalToRef(O.getRenderWidth(), O.getRenderHeight(), Q);+ const he = y / O.getHardwareScalingLevel() - Q.x, Me = M / O.getHardwareScalingLevel() - (O.getRenderHeight() - Q.y - Q.height);+ if (he < 0 || Me < 0 || he > Q.width || Me > Q.height)+ return;+ i.cameraToUseForPointers = X, d.x = Q.x, d.y = Q.y, d.width = Q.width, d.height = Q.height;+ }+ } else+ N.viewport.toGlobalToRef(O.getRenderWidth(), O.getRenderHeight(), d);+ const ne = y / O.getHardwareScalingLevel() - d.x, $ = M / O.getHardwareScalingLevel() - (O.getRenderHeight() - d.y - d.height);+ if (this._shouldBlockPointer = !1, g) {+ const Q = g.event.pointerId || this._defaultMousePointerId;+ this._doPicking(ne, $, g, g.type, Q, g.event.button, g.event.deltaX, g.event.deltaY), (this._shouldBlockPointer && !(g.type & this.skipBlockEvents) || this._capturingControl[Q]) && (g.skipOnPointerObservable = !0);+ } else+ this._doPicking(ne, $, null, Ir.POINTERMOVE, this._defaultMousePointerId, 0);+ i.cameraToUseForPointers = F;+ }+ /** Attach to all scene events required to support pointer events */+ attach() {+ const i = this.getScene();+ if (!i)+ return;+ const d = new Kg(0, 0, 0, 0);+ this._prePointerObserver = i.onPrePointerObservable.add((g) => {+ if (!(i.isPointerCaptured(g.event.pointerId) && g.type === Ir.POINTERUP && !this._capturedPointerIds.has(g.event.pointerId)) && !(g.type !== Ir.POINTERMOVE && g.type !== Ir.POINTERUP && g.type !== Ir.POINTERDOWN && g.type !== Ir.POINTERWHEEL && g.type !== Ir.POINTERTAP)) {+ if (g.type === Ir.POINTERMOVE) {+ if (i.isPointerCaptured(g.event.pointerId))+ return;+ g.event.pointerId && (this._defaultMousePointerId = g.event.pointerId);+ }+ this._translateToPicking(i, d, g);+ }+ }), this._attachPickingToSceneRender(i, () => this._translateToPicking(i, d, null), !1), this._attachToOnPointerOut(i), this._attachToOnBlur(i);+ }+ _focusNextElement(i = !0) {+ const d = [];+ if (this.executeOnAllControls((y) => {+ y.isFocusInvisible || !y.isVisible || y.tabIndex < 0 || d.push(y);+ }), d.length === 0)+ return;+ d.sort((y, M) => y.tabIndex === 0 ? 1 : M.tabIndex === 0 ? -1 : y.tabIndex - M.tabIndex), this._focusProperties.total = d.length;+ let g;+ this._focusedControl ? (g = d.indexOf(this._focusedControl) + (i ? 1 : -1), g < 0 ? g = d.length - 1 : g >= d.length && (g = 0)) : g = i ? 0 : d.length - 1, d[g].focus(), this._focusProperties.index = g;+ }+ /**+ * Register the clipboard Events onto the canvas+ */+ registerClipboardEvents() {+ self.addEventListener("copy", this._onClipboardCopy, !1), self.addEventListener("cut", this._onClipboardCut, !1), self.addEventListener("paste", this._onClipboardPaste, !1);+ }+ /**+ * Unregister the clipboard Events from the canvas+ */+ unRegisterClipboardEvents() {+ self.removeEventListener("copy", this._onClipboardCopy), self.removeEventListener("cut", this._onClipboardCut), self.removeEventListener("paste", this._onClipboardPaste);+ }+ /**+ * Transform uvs from mesh space to texture space, taking the texture into account+ * @param uv the uvs in mesh space+ * @returns the uvs in texture space+ */+ _transformUvs(i) {+ const d = this.getTextureMatrix();+ let g;+ if (d.isIdentityAs3x2())+ g = i;+ else {+ const y = Jr.Matrix[0];+ d.getRowToRef(0, Jr.Vector4[0]), d.getRowToRef(1, Jr.Vector4[1]), d.getRowToRef(2, Jr.Vector4[2]);+ const M = Jr.Vector4[0], N = Jr.Vector4[1], O = Jr.Vector4[2];+ y.setRowFromFloats(0, M.x, M.y, 0, 0), y.setRowFromFloats(1, N.x, N.y, 0, 0), y.setRowFromFloats(2, 0, 0, 1, 0), y.setRowFromFloats(3, O.x, O.y, 0, 1), g = Jr.Vector2[0], mo.TransformToRef(i, y, g);+ }+ if ((this.wrapU === Wr.WRAP_ADDRESSMODE || this.wrapU === Wr.MIRROR_ADDRESSMODE) && g.x > 1) {+ let y = g.x - Math.trunc(g.x);+ this.wrapU === Wr.MIRROR_ADDRESSMODE && Math.trunc(g.x) % 2 === 1 && (y = 1 - y), g.x = y;+ }+ if ((this.wrapV === Wr.WRAP_ADDRESSMODE || this.wrapV === Wr.MIRROR_ADDRESSMODE) && g.y > 1) {+ let y = g.y - Math.trunc(g.y);+ this.wrapV === Wr.MIRROR_ADDRESSMODE && Math.trunc(g.y) % 2 === 1 && (y = 1 - y), g.y = y;+ }+ return g;+ }+ /**+ * Connect the texture to a hosting mesh to enable interactions+ * @param mesh defines the mesh to attach to+ * @param supportPointerMove defines a boolean indicating if pointer move events must be catched as well+ */+ attachToMesh(i, d = !0) {+ const g = this.getScene();+ g && (this._pointerObserver && g.onPointerObservable.remove(this._pointerObserver), this._pointerObserver = g.onPointerObservable.add((y) => {+ if (y.type !== Ir.POINTERMOVE && y.type !== Ir.POINTERUP && y.type !== Ir.POINTERDOWN && y.type !== Ir.POINTERWHEEL)+ return;+ y.type === Ir.POINTERMOVE && y.event.pointerId && (this._defaultMousePointerId = y.event.pointerId);+ const M = y.event.pointerId || this._defaultMousePointerId;+ if (y.pickInfo && y.pickInfo.hit && y.pickInfo.pickedMesh === i) {+ let N = y.pickInfo.getTextureCoordinates();+ if (N) {+ N = this._transformUvs(N);+ const O = this.getSize();+ this._doPicking(N.x * O.width, (this.applyYInversionOnUpdate ? 1 - N.y : N.y) * O.height, y, y.type, M, y.event.button, y.event.deltaX, y.event.deltaY);+ }+ } else if (y.type === Ir.POINTERUP) {+ if (this._lastControlDown[M] && this._lastControlDown[M]._forcePointerUp(M), delete this._lastControlDown[M], this.focusedControl) {+ const N = this.focusedControl.keepsFocusWith();+ let O = !0;+ if (N)+ for (const F of N) {+ if (this === F._host)+ continue;+ const ne = F._host;+ if (ne._lastControlOver[M] && ne._lastControlOver[M].isAscendant(F)) {+ O = !1;+ break;+ }+ }+ O && (this.focusedControl = null);+ }+ } else y.type === Ir.POINTERMOVE && (this._lastControlOver[M] && this._lastControlOver[M]._onPointerOut(this._lastControlOver[M], y, !0), delete this._lastControlOver[M]);+ }), i.enablePointerMoveEvents = d, this._attachPickingToSceneRender(g, () => {+ const y = this._defaultMousePointerId, M = g?.pick(g.pointerX, g.pointerY);+ if (M && M.hit && M.pickedMesh === i) {+ let N = M.getTextureCoordinates();+ if (N) {+ N = this._transformUvs(N);+ const O = this.getSize();+ this._doPicking(N.x * O.width, (this.applyYInversionOnUpdate ? 1 - N.y : N.y) * O.height, null, Ir.POINTERMOVE, y, 0);+ }+ } else+ this._lastControlOver[y] && this._lastControlOver[y]._onPointerOut(this._lastControlOver[y], null, !0), delete this._lastControlOver[y];+ }, !0), this._attachToOnPointerOut(g), this._attachToOnBlur(g));+ }+ /**+ * Move the focus to a specific control+ * @param control defines the control which will receive the focus+ */+ moveFocusToControl(i) {+ this.focusedControl = i, this._lastPickedControl = i, this._blockNextFocusCheck = !0;+ }+ _manageFocus() {+ if (this._blockNextFocusCheck) {+ this._blockNextFocusCheck = !1, this._lastPickedControl = this._focusedControl;+ return;+ }+ if (this._focusedControl && this._focusedControl !== this._lastPickedControl) {+ if (this._lastPickedControl.isFocusInvisible)+ return;+ this.focusedControl = null;+ }+ }+ _attachPickingToSceneRender(i, d, g) {+ this._sceneRenderObserver = i.onBeforeRenderObservable.add(() => {+ this.checkPointerEveryFrame && (this._linkedControls.length > 0 || g) && d();+ });+ }+ _attachToOnPointerOut(i) {+ this._canvasPointerOutObserver = i.getEngine().onCanvasPointerOutObservable.add((d) => {+ this._lastControlOver[d.pointerId] && this._lastControlOver[d.pointerId]._onPointerOut(this._lastControlOver[d.pointerId], null), delete this._lastControlOver[d.pointerId], this._lastControlDown[d.pointerId] && this._lastControlDown[d.pointerId] !== this._capturingControl[d.pointerId] && (this._lastControlDown[d.pointerId]._forcePointerUp(d.pointerId), delete this._lastControlDown[d.pointerId]);+ });+ }+ _attachToOnBlur(i) {+ this._canvasBlurObserver = i.getEngine().onCanvasBlurObservable.add(() => {+ Object.entries(this._lastControlDown).forEach(([, d]) => {+ d._onCanvasBlur();+ }), this.focusedControl = null, this._lastControlDown = {};+ });+ }+ /**+ * Serializes the entire GUI system+ * @returns an object with the JSON serialized data+ */+ serializeContent() {+ const i = this.getSize(), d = {+ root: {},+ width: i.width,+ height: i.height+ };+ return this._rootContainer.serialize(d.root), d;+ }+ /**+ * Recreate the content of the ADT from a JSON object+ * @param serializedObject define the JSON serialized object to restore from+ * @param scaleToSize defines whether to scale to texture to the saved size+ * @param urlRewriter defines an url rewriter to update urls before sending them to the controls+ */+ parseSerializedObject(i, d, g) {+ if (this._rootContainer = pe.Parse(i.root, this, g), d) {+ const y = i.width, M = i.height;+ typeof y == "number" && typeof M == "number" && y >= 0 && M >= 0 ? this.scaleTo(y, M) : this.scaleTo(1920, 1080);+ }+ }+ /**+ * Clones the ADT. If no mesh is defined, the GUI will be considered as a fullscreen GUI+ * @param newName defines the name of the new ADT+ * @param attachToMesh defines if the new ADT should be attached to a mesh+ * @returns the clone of the ADT+ */+ clone(i, d) {+ const g = this.getScene();+ if (!g)+ return this;+ const y = this.getSize(), M = this.serializeContent();+ let N;+ return this._isFullscreen ? N = go.CreateFullscreenUI(i ?? "Clone of " + this.name) : d ? N = go.CreateForMesh(d, y.width, y.height) : N = new go(i ?? "Clone of " + this.name, y.width, y.height, g, !this.noMipmap, this.samplingMode), N.parseSerializedObject(M), N;+ }+ /**+ * Recreate the content of the ADT from a snippet saved by the GUI editor+ * @param snippetId defines the snippet to load+ * @param scaleToSize defines whether to scale to texture to the saved size+ * @param appendToAdt if provided the snippet will be appended to the adt. Otherwise a fullscreen ADT will be created.+ * @param urlRewriter defines an url rewriter to update urls before sending them to the controls+ * @returns a promise that will resolve on success+ */+ static async ParseFromSnippetAsync(i, d, g, y) {+ const M = g ?? go.CreateFullscreenUI("ADT from snippet");+ if (i === "_BLANK")+ return M;+ const N = await go._LoadURLContentAsync(go.SnippetUrl + "/" + i.replace(/#/g, "/"), !0);+ return M.parseSerializedObject(N, d, y), M;+ }+ /**+ * Recreate the content of the ADT from a snippet saved by the GUI editor+ * @param snippetId defines the snippet to load+ * @param scaleToSize defines whether to scale to texture to the saved size+ * @param urlRewriter defines an url rewriter to update urls before sending them to the controls+ * @returns a promise that will resolve on success+ */+ async parseFromSnippetAsync(i, d, g) {+ return await go.ParseFromSnippetAsync(i, d, this, g);+ }+ /**+ * Recreate the content of the ADT from a url json+ * @param url defines the url to load+ * @param scaleToSize defines whether to scale to texture to the saved size+ * @param appendToAdt if provided the snippet will be appended to the adt. Otherwise a fullscreen ADT will be created.+ * @param urlRewriter defines an url rewriter to update urls before sending them to the controls+ * @returns a promise that will resolve on success+ */+ static async ParseFromFileAsync(i, d, g, y) {+ const M = g ?? go.CreateFullscreenUI("ADT from URL"), N = await go._LoadURLContentAsync(i);+ return M.parseSerializedObject(N, d, y), M;+ }+ /**+ * Recreate the content of the ADT from a url json+ * @param url defines the url to load+ * @param scaleToSize defines whether to scale to texture to the saved size+ * @param urlRewriter defines an url rewriter to update urls before sending them to the controls+ * @returns a promise that will resolve on success+ */+ async parseFromURLAsync(i, d, g) {+ return await go.ParseFromFileAsync(i, d, this, g);+ }+ static async _LoadURLContentAsync(i, d = !1) {+ if (i === "")+ throw new Error("No URL provided");+ return await new Promise((g, y) => {+ const M = new A9();+ M.addEventListener("readystatechange", () => {+ if (M.readyState == 4)+ if (M.status == 200) {+ let N;+ if (d) {+ const F = JSON.parse(JSON.parse(M.responseText).jsonPayload);+ N = F.encodedGui ? new TextDecoder("utf-8").decode(C9(F.encodedGui)) : F.gui;+ } else+ N = M.responseText;+ const O = JSON.parse(N);+ g(O);+ } else+ y("Unable to load");+ }), M.open("GET", i), M.send();+ });+ }+ // Statics+ /**+ * Compares two rectangle based controls for pixel overlap+ * @param control1 The first control to compare+ * @param control2 The second control to compare+ * @returns true if overlaps, otherwise false+ */+ static _Overlaps(i, d) {+ return !(i.centerX > d.centerX + d.widthInPixels || i.centerX + i.widthInPixels < d.centerX || i.centerY + i.heightInPixels < d.centerY || i.centerY > d.centerY + d.heightInPixels);+ }+ /**+ * Creates a new AdvancedDynamicTexture in projected mode (ie. attached to a mesh)+ * @param mesh defines the mesh which will receive the texture+ * @param width defines the texture width (1024 by default)+ * @param height defines the texture height (1024 by default)+ * @param supportPointerMove defines a boolean indicating if the texture must capture move events (true by default)+ * @param onlyAlphaTesting defines a boolean indicating that alpha blending will not be used (only alpha testing) (false by default)+ * @param invertY defines if the texture needs to be inverted on the y axis during loading (true by default)+ * @param materialSetupCallback defines a custom way of creating and setting up the material on the mesh+ * @param sampling defines the texture sampling mode (Texture.TRILINEAR_SAMPLINGMODE by default)+ * @returns a new AdvancedDynamicTexture+ */+ static CreateForMesh(i, d = 1024, g = 1024, y = !0, M = !1, N, O = this._CreateMaterial, F = Wr.TRILINEAR_SAMPLINGMODE) {+ const ne = M9(), $ = new go(`AdvancedDynamicTexture for ${i.name} [${ne}]`, d, g, i.getScene(), !0, F, N);+ return O(i, ne, $, M), $.attachToMesh(i, y), $;+ }+ static _CreateMaterial(i, d, g, y) {+ const M = yb("BABYLON.StandardMaterial");+ if (!M)+ throw "StandardMaterial needs to be imported before as it contains a side-effect required by your code.";+ const N = new M(`AdvancedDynamicTextureMaterial for ${i.name} [${d}]`, i.getScene());+ N.backFaceCulling = !1, N.diffuseColor = nr.Black(), N.specularColor = nr.Black(), y ? (N.diffuseTexture = g, N.emissiveTexture = g, g.hasAlpha = !0) : (N.emissiveTexture = g, N.opacityTexture = g), i.material = N;+ }+ /**+ * Creates a new AdvancedDynamicTexture in projected mode (ie. attached to a mesh) BUT do not create a new material for the mesh. You will be responsible for connecting the texture+ * @param mesh defines the mesh which will receive the texture+ * @param width defines the texture width (1024 by default)+ * @param height defines the texture height (1024 by default)+ * @param supportPointerMove defines a boolean indicating if the texture must capture move events (true by default)+ * @param invertY defines if the texture needs to be inverted on the y axis during loading (true by default)+ * @param sampling defines the texture sampling mode (Texture.TRILINEAR_SAMPLINGMODE by default)+ * @returns a new AdvancedDynamicTexture+ */+ static CreateForMeshTexture(i, d = 1024, g = 1024, y = !0, M, N = Wr.TRILINEAR_SAMPLINGMODE) {+ const O = new go(i.name + " AdvancedDynamicTexture", d, g, i.getScene(), !0, N, M);+ return O.attachToMesh(i, y), O;+ }+ /**+ * Creates a new AdvancedDynamicTexture in fullscreen mode.+ * In this mode the texture will rely on a layer for its rendering.+ * This allows it to be treated like any other layer.+ * As such, if you have a multi camera setup, you can set the layerMask on the GUI as well.+ * LayerMask is set through advancedTexture.layer.layerMask+ * @param name defines name for the texture+ * @param foreground defines a boolean indicating if the texture must be rendered in foreground (default is true)+ * @param sceneOrOptions defines the hosting scene or options (IAdvancedDynamicTextureOptions)+ * @param sampling defines the texture sampling mode (Texture.BILINEAR_SAMPLINGMODE by default)+ * @param adaptiveScaling defines whether to automatically scale root to match hardwarescaling (false by default)+ * @returns a new AdvancedDynamicTexture+ */+ static CreateFullscreenUI(i, d = !0, g = null, y = Wr.BILINEAR_SAMPLINGMODE, M = !1) {+ const O = !g || g._isScene ? new go(i, 0, 0, g, !1, y) : new go(i, g), F = O.getScene(), ne = new k9(i + "_layer", null, F, !d);+ return ne.texture = O, O._layerToDispose = ne, O._isFullscreen = !0, O.useStandalone && (ne.layerMask = 0), O.adjustToEngineHardwareScalingLevel = M, O.attach(), O;+ }+ /**+ * Scales the texture+ * @param ratio the scale factor to apply to both width and height+ */+ scale(i) {+ super.scale(i), this.markAsDirty();+ }+ /**+ * Resizes the texture+ * @param width the new width+ * @param height the new height+ */+ scaleTo(i, d) {+ super.scaleTo(i, d), this.markAsDirty();+ }+ _checkGuiIsReady() {+ this.guiIsReady() && (this.onGuiReadyObservable.notifyObservers(this), this.onGuiReadyObservable.clear());+ }+ /**+ * @returns true if all the GUI components are ready to render+ */+ guiIsReady() {+ return this._rootContainer.isReady();+ }+}+go.SnippetUrl = Is.SnippetUrl;+go.AllowGPUOptimizations = !0;+class uS extends L9 {+ get disabled() {+ return this._disabled;+ }+ set disabled(i) {+ this._disabled = i, this._adt.disablePicking = i;+ }+ /**+ * Gets the underlying advanced dynamic texture.+ */+ get gui() {+ return this._adt;+ }+ /**+ * Constructs a new GUI task.+ * @param name Name of the task+ * @param frameGraph Frame graph the task belongs to+ * @param adt The GUI texture. If not provided, a new fullscreen GUI will be created.+ */+ constructor(i, d, g) {+ if (super(i, d), g) {+ if (!g.useStandalone)+ throw new Error(`AdvancedDynamicTexture "${i}": the texture must have been created with the useStandalone property set to true`);+ } else+ g = go.CreateFullscreenUI(i, void 0, { useStandalone: !0, scene: d.scene });+ this._adt = g, this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();+ }+ isReady() {+ return this._adt.guiIsReady() && this._adt._layerToDispose.isReady();+ }+ getClassName() {+ return "FrameGraphGUITask";+ }+ record() {+ if (this.targetTexture === void 0)+ throw new Error("FrameGraphGUITask: targetTexture is required");+ this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);+ const i = this._frameGraph.addRenderPass(this.name);+ i.setRenderTarget(this.outputTexture), i.setExecuteFunc((g) => {+ this._adt._checkUpdate(null), g.render(this._adt._layerToDispose);+ });+ const d = this._frameGraph.addRenderPass(this.name + "_disabled", !0);+ d.setRenderTarget(this.outputTexture), d.setExecuteFunc((g) => {+ });+ }+ dispose() {+ this._adt.dispose(), super.dispose();+ }+}+class fS extends S9 {+ /**+ * Gets the frame graph task associated with this block+ */+ get task() {+ return this._frameGraphTask;+ }+ /**+ * Gets the GUI texture used by this block+ */+ get gui() {+ return this._frameGraphTask.gui;+ }+ /**+ * Create a new NodeRenderGraphGUIBlock+ * @param name defines the block name+ * @param frameGraph defines the hosting frame graph+ * @param scene defines the hosting scene+ */+ constructor(i, d, g) {+ super(i, d, g), this.registerInput("target", tw.Texture), this._addDependenciesInput(), this.registerOutput("output", tw.BasedOnInput), this.target.addAcceptedConnectionPointTypes(tw.TextureAll), this.output._typeConnectionSource = this.target, this._gui = go.CreateFullscreenUI(this.name, void 0, {+ useStandalone: !0,+ scene: g+ }), this._frameGraphTask = new uS(this.name, d, this._gui);+ }+ /**+ * Gets the current class name+ * @returns the class name+ */+ getClassName() {+ return "GUI.NodeRenderGraphGUIBlock";+ }+ /**+ * Gets the target input component+ */+ get target() {+ return this._inputs[0];+ }+ /**+ * Gets the output component+ */+ get output() {+ return this._outputs[0];+ }+ _buildBlock(i) {+ super._buildBlock(i), this.output.value = this._frameGraphTask.outputTexture, this._frameGraphTask.targetTexture = this.target.connectedPoint?.value;+ }+}+kr("BABYLON.GUI.NodeRenderGraphGUIBlock", fS);+const S4 = "XmlLoader Exception : XML file is malformed or corrupted.";+class Z9 {+ /**+ * Create a new xml loader+ * @param parentClass Sets the class context. Used when the loader is instanced inside a class and not in a global context+ */+ constructor(i = null) {+ this._nodes = {}, this._nodeTypes = {+ element: 1,+ attribute: 2,+ text: 3+ }, this._isLoaded = !1, this._objectAttributes = {+ textHorizontalAlignment: 1,+ textVerticalAlignment: 2,+ horizontalAlignment: 3,+ verticalAlignment: 4,+ stretch: 5+ }, i && (this._parentClass = i);+ }+ _getChainElement(i) {+ let d = window;+ this._parentClass && (d = this._parentClass);+ let g = i;+ g = g.split(".");+ for (let y = 0; y < g.length; y++)+ d = d[g[y]];+ return d;+ }+ _getClassAttribute(i) {+ const d = i.split(".");+ return yb("BABYLON.GUI." + d[0])[d[1]];+ }+ _createGuiElement(i, d, g = !0) {+ try {+ const y = yb("BABYLON.GUI." + i.nodeName), M = new y();+ d && g && d.addControl(M);+ for (let O = 0; O < i.attributes.length; O++)+ if (!i.attributes[O].name.toLowerCase().includes("datasource"))+ if (i.attributes[O].name.toLowerCase().includes("observable")) {+ const F = this._getChainElement(i.attributes[O].value);+ M[i.attributes[O].name].add(F);+ continue;+ } else if (i.attributes[O].name == "linkWithMesh")+ this._parentClass ? M.linkWithMesh(this._parentClass[i.attributes[O].value]) : M.linkWithMesh(window[i.attributes[O].value]);+ else if (i.attributes[O].value.match(/{{.*}}/)) {+ const F = i.attributes[O].value.match(/{{(.*)}}/);+ let ne = this._getChainElement(F[1]);+ i.attributes[O].value.startsWith("{{") && i.attributes[O].value.endsWith("}}") || (ne = i.attributes[O].value.replace(/{{.*}}/, `${ne}`)), M[i.attributes[O].name] = ne;+ } else this._objectAttributes[i.attributes[O].name] ? M[i.attributes[O].name] = this._getClassAttribute(i.attributes[O].value) : i.attributes[O].value == "true" || i.attributes[O].value == "false" ? M[i.attributes[O].name] = i.attributes[O].value == "true" : M[i.attributes[O].name] = isNaN(Number(i.attributes[O].value)) ? i.attributes[O].value : Number(i.attributes[O].value);+ if (!i.attributes.getNamedItem("id"))+ return this._nodes[i.nodeName + Object.keys(this._nodes).length + "_gen"] = M, M;+ let N = i.attributes.getNamedItem("id").value;+ if (N.startsWith("{{") && N.endsWith("}}") && (N = this._getChainElement(N.substring(2, N.length - 2))), !this._nodes[N])+ this._nodes[N] = M;+ else+ throw "XmlLoader Exception : Duplicate ID, every element should have an unique ID attribute";+ return M;+ } catch (y) {+ throw "XmlLoader Exception : Error parsing Control " + i.nodeName + "," + y + ".";+ }+ }+ _parseGrid(i, d, g) {+ let y, M, N;+ const O = i.children;+ let F, ne, $, Q = -1, X = -1, he = 0;+ for (let Me = 0; Me < O.length; Me++)+ if (O[Me].nodeType == this._nodeTypes.element) {+ if (O[Me].nodeName != "Row")+ throw "XmlLoader Exception : Expecting Row node, received " + O[Me].nodeName;+ if (Q += 1, N = O[Me].children, !O[Me].attributes.getNamedItem("height"))+ throw "XmlLoader Exception : Height must be defined for grid rows";+ M = Number(O[Me].attributes.getNamedItem("height").nodeValue), ne = O[Me].attributes.getNamedItem("isPixel") ? JSON.parse(O[Me].attributes.getNamedItem("isPixel").nodeValue) : !1, d.addRowDefinition(M, ne);+ for (let p = 0; p < N.length; p++)+ if (N[p].nodeType == this._nodeTypes.element) {+ if (N[p].nodeName != "Column")+ throw "XmlLoader Exception : Expecting Column node, received " + N[p].nodeName;+ if (X += 1, Q > 0 && X > he)+ throw "XmlLoader Exception : In the Grid element, the number of columns is defined in the first row, do not add more columns in the subsequent rows.";+ if (Q == 0) {+ if (!N[p].attributes.getNamedItem("width"))+ throw "XmlLoader Exception : Width must be defined for all the grid columns in the first row";+ y = Number(N[p].attributes.getNamedItem("width").nodeValue), ne = N[p].attributes.getNamedItem("isPixel") ? JSON.parse(N[p].attributes.getNamedItem("isPixel").nodeValue) : !1, d.addColumnDefinition(y, ne);+ }+ F = N[p].children;+ for (let De = 0; De < F.length; De++)+ F[De].nodeType == this._nodeTypes.element && ($ = this._createGuiElement(F[De], d, !1), d.addControl($, Q, X), F[De].firstChild && this._parseXml(F[De].firstChild, $));+ }+ Q == 0 && (he = X), X = -1;+ }+ i.nextSibling && this._parseXml(i.nextSibling, g);+ }+ _parseElement(i, d, g) {+ i.firstChild && this._parseXml(i.firstChild, d), i.nextSibling && this._parseXml(i.nextSibling, g);+ }+ _prepareSourceElement(i, d, g, y, M) {+ this._parentClass ? this._parentClass[g] = y[M] : window[g] = y[M], i.firstChild && this._parseXml(i.firstChild, d, !0);+ }+ _parseElementsFromSource(i, d, g) {+ const y = i.attributes.getNamedItem("dataSource").value;+ if (y.includes(" in ")) {+ let M = !0;+ const N = y.split(" in ");+ if (N.length < 2)+ throw "XmlLoader Exception : Malformed XML, Data Source must have an iterator and a source";+ let O = N[1];+ if (O.startsWith("{") && O.endsWith("}") && (M = !1), (!M || O.startsWith("[") && O.endsWith("]")) && (O = O.substring(1, O.length - 1)), this._parentClass ? O = this._parentClass[O] : O = window[O], M)+ for (let F = 0; F < O.length; F++)+ this._prepareSourceElement(i, d, N[0], O, F);+ else+ for (const F in O)+ this._prepareSourceElement(i, d, N[0], O, F);+ i.nextSibling && this._parseXml(i.nextSibling, g);+ } else+ throw "XmlLoader Exception : Malformed XML, Data Source must include an in";+ }+ _parseXml(i, d, g = !1) {+ if (i.nodeType != this._nodeTypes.element) {+ i.nextSibling && this._parseXml(i.nextSibling, d, g);+ return;+ }+ g && i.setAttribute("id", d.id + (d._children.length + 1));+ const y = this._createGuiElement(i, d);+ this._rootNode || (this._rootNode = y), i.nodeName == "Grid" ? this._parseGrid(i, y, d) : i.attributes.getNamedItem("dataSource") ? this._parseElementsFromSource(i, y, d) : this._parseElement(i, y, d);+ }+ /**+ * Gets if the loading has finished.+ * @returns whether the loading has finished or not+ */+ isLoaded() {+ return this._isLoaded;+ }+ /**+ * Gets a loaded node / control by id.+ * @param id the Controls id set in the xml+ * @returns element of type Control+ */+ getNodeById(i) {+ return this._nodes[i];+ }+ /**+ * Gets all loaded nodes / controls+ * @returns Array of controls+ */+ getNodes() {+ return this._nodes;+ }+ /**+ * Disposes the loaded layout+ */+ dispose() {+ this._rootNode && (this._rootNode.dispose(), this._rootNode = null, this._nodes = {});+ }+ /**+ * Initiates the xml layout loading+ * @param xmlFile defines the xml layout to load+ * @param rootNode defines the node / control to use as a parent for the loaded layout controls.+ * @param onSuccess defines the callback called on layout load successfully.+ * @param onError defines the callback called on layout load failure.+ */+ loadLayout(i, d, g = null, y = null) {+ const M = new XMLHttpRequest();+ M.onload = () => {+ if (M.readyState === 4 && M.status === 200) {+ if (!M.responseXML)+ if (y) {+ y(S4);+ return;+ } else+ throw S4;+ const N = M.responseXML.documentElement;+ this._parseXml(N.firstChild, d), this._isLoaded = !0, g && g();+ }+ }, M.onerror = function() {+ y && y("an error occurred during loading the layout");+ }, M.open("GET", i, !0), M.send();+ }+ /**+ * Initiates the xml layout loading asynchronously+ * @param xmlFile defines the xml layout to load+ * @param rootNode defines the node / control to use as a parent for the loaded layout controls.+ * @returns Promise+ */+ async loadLayoutAsync(i, d) {+ return await new Promise((g, y) => {+ this.loadLayout(i, d, g, y);+ });+ }+}+class wb extends Se {+ /**+ * Creates a new Vector3WithInfo+ * @param source defines the vector3 data to transport+ * @param buttonIndex defines the current mouse button index+ */+ constructor(i, d = 0) {+ super(i.x, i.y, i.z), this.buttonIndex = d;+ }+}+class tm {+ /** Gets or sets the control position in world space */+ get position() {+ return this._node ? this._node.position : (this._position = this._position || Se.Zero(), this._position);+ }+ set position(i) {+ this._position = i, this._node && (this._node.position = this._position);+ }+ /** Gets or sets the control scaling in world space */+ get scaling() {+ return this._node ? this._node.scaling : (this._scaling = this._scaling || new Se(1, 1, 1), this._scaling);+ }+ set scaling(i) {+ this._scaling = i, this._node && (this._isScaledByManager = !1, this._node.scaling = this._scaling);+ }+ /**+ * Gets the list of attached behaviors+ * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors+ */+ get behaviors() {+ return this._behaviors;+ }+ /**+ * Attach a behavior to the control+ * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors+ * @param behavior defines the behavior to attach+ * @returns the current control+ */+ addBehavior(i) {+ if (this._behaviors.indexOf(i) !== -1)+ return this;+ i.init();+ const g = this._host.scene;+ return g.isLoading ? g.onDataLoadedObservable.addOnce(() => {+ i.attach(this);+ }) : i.attach(this), this._behaviors.push(i), this;+ }+ /**+ * Remove an attached behavior+ * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors+ * @param behavior defines the behavior to attach+ * @returns the current control+ */+ removeBehavior(i) {+ const d = this._behaviors.indexOf(i);+ return d === -1 ? this : (this._behaviors[d].detach(), this._behaviors.splice(d, 1), this);+ }+ /**+ * Gets an attached behavior by name+ * @param name defines the name of the behavior to look for+ * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors+ * @returns null if behavior was not found else the requested behavior+ */+ getBehaviorByName(i) {+ for (const d of this._behaviors)+ if (d.name === i)+ return d;+ return null;+ }+ /** Gets or sets a boolean indicating if the control is visible */+ get isVisible() {+ return this._isVisible;+ }+ set isVisible(i) {+ if (this._isVisible === i)+ return;+ this._isVisible = i;+ const d = this.mesh;+ d && d.setEnabled(i);+ }+ /**+ * Creates a new control+ * @param name defines the control name+ */+ constructor(i) {+ this.name = i, this._downCount = 0, this._enterCount = -1, this._downPointerIds = {}, this._isVisible = !0, this._isScaledByManager = !1, this.onPointerMoveObservable = new qt(), this.onPointerOutObservable = new qt(), this.onPointerDownObservable = new qt(), this.onPointerUpObservable = new qt(), this.onPointerClickObservable = new qt(), this.onPointerEnterObservable = new qt(), this._behaviors = new Array();+ }+ /**+ * Gets a string representing the class name+ */+ get typeName() {+ return this._getTypeName();+ }+ /**+ * Get the current class name of the control.+ * @returns current class name+ */+ getClassName() {+ return this._getTypeName();+ }+ _getTypeName() {+ return "Control3D";+ }+ /**+ * Gets the transform node used by this control+ */+ get node() {+ return this._node;+ }+ /**+ * Gets the mesh used to render this control+ */+ get mesh() {+ return this._node instanceof $4 ? this._node : null;+ }+ /**+ * Link the control as child of the given node+ * @param node defines the node to link to. Use null to unlink the control+ * @returns the current control+ */+ linkToTransformNode(i) {+ return this._node && (this._node.parent = i), this;+ }+ /**+ * @internal+ */+ _prepareNode(i) {+ if (!this._node) {+ if (this._node = this._createNode(i), !this.node)+ return;+ this._position && (this.node.position = this._position), this._scaling && (this.node.scaling = this._scaling), this._injectGUI3DReservedDataStore(this.node).control = this;+ const d = this.mesh;+ d && (d.isPickable = !0, this._affectMaterial(d));+ }+ }+ _injectGUI3DReservedDataStore(i) {+ return i.reservedDataStore = i.reservedDataStore ?? {}, i.reservedDataStore.GUI3D = i.reservedDataStore.GUI3D ?? {}, i.reservedDataStore.GUI3D;+ }+ /**+ * Node creation.+ * Can be overriden by children+ * @param scene defines the scene where the node must be attached+ * @returns the attached node or null if none. Must return a Mesh or AbstractMesh if there is an attached visible object+ */+ // eslint-disable-next-line @typescript-eslint/no-unused-vars+ _createNode(i) {+ return null;+ }+ /**+ * Affect a material to the given mesh+ * @param mesh defines the mesh which will represent the control+ */+ _affectMaterial(i) {+ i.material = null;+ }+ _isTouchButton3D(i) {+ return i._generatePointerEventType !== void 0;+ }+ // Pointers+ /**+ * @internal+ */+ _onPointerMove(i, d) {+ this.onPointerMoveObservable.notifyObservers(d, -1, i, this);+ }+ /**+ * @internal+ */+ _onPointerEnter(i) {+ return this._enterCount === -1 && (this._enterCount = 0), this._enterCount++, this._enterCount > 1 ? !1 : (this.onPointerEnterObservable.notifyObservers(this, -1, i, this), this.pointerEnterAnimation && this.pointerEnterAnimation(), !0);+ }+ /**+ * @internal+ */+ _onPointerOut(i) {+ this._enterCount--, !(this._enterCount > 0) && (this._enterCount = 0, this.onPointerOutObservable.notifyObservers(this, -1, i, this), this.pointerOutAnimation && this.pointerOutAnimation());+ }+ /**+ * @internal+ */+ _onPointerDown(i, d, g, y) {+ return this._downCount++, this._downPointerIds[g] = this._downPointerIds[g] + 1 || 1, this._downCount !== 1 ? !1 : (this.onPointerDownObservable.notifyObservers(new wb(d, y), -1, i, this), this.pointerDownAnimation && this.pointerDownAnimation(), !0);+ }+ /**+ * @internal+ */+ _onPointerUp(i, d, g, y, M) {+ if (this._downCount--, this._downPointerIds[g]--, this._downPointerIds[g] <= 0 && delete this._downPointerIds[g], this._downCount < 0) {+ this._downCount = 0;+ return;+ }+ this._downCount == 0 && (M && (this._enterCount > 0 || this._enterCount === -1) && this.onPointerClickObservable.notifyObservers(new wb(d, y), -1, i, this), this.onPointerUpObservable.notifyObservers(new wb(d, y), -1, i, this), this.pointerUpAnimation && this.pointerUpAnimation());+ }+ /**+ * @internal+ */+ forcePointerUp(i = null) {+ if (i !== null)+ this._onPointerUp(this, Se.Zero(), i, 0, !0);+ else {+ for (const d in this._downPointerIds)+ this._onPointerUp(this, Se.Zero(), +d, 0, !0);+ this._downCount > 0 && (this._downCount = 1, this._onPointerUp(this, Se.Zero(), 0, 0, !0));+ }+ }+ /**+ * @internal+ */+ _processObservables(i, d, g, y, M) {+ if (this._isTouchButton3D(this) && g && (i = this._generatePointerEventType(i, g, this._downCount)), i === Ir.POINTERMOVE) {+ this._onPointerMove(this, d);+ const N = this._host._lastControlOver[y];+ return N && N !== this && N._onPointerOut(this), N !== this && this._onPointerEnter(this), this._host._lastControlOver[y] = this, !0;+ }+ return i === Ir.POINTERDOWN ? (this._onPointerDown(this, d, y, M), this._host._lastControlDown[y] = this, this._host._lastPickedControl = this, !0) : i === Ir.POINTERUP || i === Ir.POINTERDOUBLETAP ? (this._host._lastControlDown[y] && this._host._lastControlDown[y]._onPointerUp(this, d, y, M, !0), delete this._host._lastControlDown[y], !0) : !1;+ }+ /** @internal */+ _disposeNode() {+ this._node && (this._node.dispose(), this._node = null);+ }+ /**+ * Releases all associated resources+ */+ dispose() {+ this.onPointerDownObservable.clear(), this.onPointerEnterObservable.clear(), this.onPointerMoveObservable.clear(), this.onPointerOutObservable.clear(), this.onPointerUpObservable.clear(), this.onPointerClickObservable.clear(), this._disposeNode();+ for (const i of this._behaviors)+ i.detach();+ }+}+class hS extends tm {+ constructor() {+ super(...arguments), this._contentResolution = 512, this._contentScaleRatio = 2;+ }+ /**+ * Gets or sets the GUI 2D content used to display the button's facade+ */+ get content() {+ return this._content;+ }+ set content(i) {+ if (this._content = i, !(!i || !this._host || !this._host.utilityLayer)) {+ if (this._facadeTexture)+ this._facadeTexture.rootContainer.clearControls();+ else {+ const d = typeof this._contentResolution == "number" ? this._contentResolution : this._contentResolution.width, g = typeof this._contentResolution == "number" ? this._contentResolution : this._contentResolution.height;+ this._facadeTexture = new go("Facade", d, g, this._host.utilityLayer.utilityLayerScene, !0, Wr.TRILINEAR_SAMPLINGMODE), this._setFacadeTextureScaling(), this._facadeTexture.premulAlpha = !0;+ }+ this._facadeTexture.addControl(i), this._applyFacade(this._facadeTexture);+ }+ }+ _setFacadeTextureScaling() {+ this._facadeTexture && (typeof this._contentResolution != "number" && (this._contentScaleRatioY = this._contentResolution.height / this._contentResolution.width * this._contentScaleRatio), this._facadeTexture.rootContainer.scaleX = this._contentScaleRatio, this._facadeTexture.rootContainer.scaleY = this._contentScaleRatioY ?? this._contentScaleRatio);+ }+ /**+ * Gets or sets the texture resolution used to render content (512 by default)+ */+ get contentResolution() {+ return this._contentResolution;+ }+ set contentResolution(i) {+ const d = typeof i == "number" ? i : i.width, g = typeof i == "number" ? i : i.height, y = typeof this._contentResolution == "number" ? this._contentResolution : this._contentResolution.width, M = typeof this._contentResolution == "number" ? this._contentResolution : this._contentResolution.height;+ d === y && g === M || (this._contentResolution = i, this._resetContent());+ }+ _disposeFacadeTexture() {+ this._facadeTexture && (this._facadeTexture.dispose(), this._facadeTexture = null);+ }+ _resetContent() {+ this._disposeFacadeTexture(), this.content = this._content;+ }+ /**+ * Apply the facade texture (created from the content property).+ * This function can be overloaded by child classes+ * @param facadeTexture defines the AdvancedDynamicTexture to use+ */+ // eslint-disable-next-line @typescript-eslint/no-unused-vars+ _applyFacade(i) {+ }+}+class pS extends hS {+ /**+ * Creates a new button+ * @param name defines the control name+ */+ constructor(i) {+ super(i);+ }+ _getTypeName() {+ return "AbstractButton3D";+ }+ // Mesh association+ _createNode(i) {+ return new Mu("button" + this.name, i);+ }+}+class Bb extends pS {+ /**+ * Creates a new button+ * @param name defines the control name+ * @param options defines the options used to create the button+ */+ constructor(i, d) {+ super(i), this._options = {+ width: 1,+ height: 1,+ depth: 0.08,+ ...d+ }, this.pointerEnterAnimation = () => {+ this.mesh && (this._currentMaterial.emissiveColor = nr.Red());+ }, this.pointerOutAnimation = () => {+ this._currentMaterial.emissiveColor = nr.Black();+ }, this.pointerDownAnimation = () => {+ this.mesh && this.mesh.scaling.scaleInPlace(0.95);+ }, this.pointerUpAnimation = () => {+ this.mesh && this.mesh.scaling.scaleInPlace(1 / 0.95);+ };+ }+ /**+ * Apply the facade texture (created from the content property).+ * @param facadeTexture defines the AdvancedDynamicTexture to use+ */+ _applyFacade(i) {+ this._currentMaterial.emissiveTexture = i;+ }+ _getTypeName() {+ return "Button3D";+ }+ // Mesh association+ _createNode(i) {+ const d = new Array(6);+ for (let y = 0; y < 6; y++)+ d[y] = new fi(0, 0, 0, 0);+ i.useRightHandedSystem ? d[0].copyFromFloats(1, 0, 0, 1) : d[1].copyFromFloats(0, 0, 1, 1);+ const g = Wi(this.name + "_rootMesh", {+ width: this._options.width,+ height: this._options.height,+ depth: this._options.depth,+ faceUV: d,+ wrap: !0+ }, i);+ return this._contentScaleRatioY = this._contentScaleRatio * this._options.width / this._options.height, this._setFacadeTextureScaling(), g;+ }+ _affectMaterial(i) {+ const d = new xu(this.name + "Material", i.getScene());+ d.specularColor = nr.Black(), i.material = d, this._currentMaterial = d, this._resetContent();+ }+ /**+ * Releases all associated resources+ */+ dispose() {+ super.dispose(), this._disposeFacadeTexture(), this._currentMaterial && this._currentMaterial.dispose();+ }+}+class No extends tm {+ /**+ * Gets the list of child controls+ */+ get children() {+ return this._children;+ }+ /**+ * Gets or sets a boolean indicating if the layout must be blocked (default is false).+ * This is helpful to optimize layout operation when adding multiple children in a row+ */+ get blockLayout() {+ return this._blockLayout;+ }+ set blockLayout(i) {+ this._blockLayout !== i && (this._blockLayout = i, this._blockLayout || this._arrangeChildren());+ }+ /**+ * Creates a new container+ * @param name defines the container name+ */+ constructor(i) {+ super(i), this._blockLayout = !1, this._children = new Array();+ }+ /**+ * Force the container to update the layout. Please note that it will not take blockLayout property in account+ * @returns the current container+ */+ updateLayout() {+ return this._arrangeChildren(), this;+ }+ /**+ * Gets a boolean indicating if the given control is in the children of this control+ * @param control defines the control to check+ * @returns true if the control is in the child list+ */+ containsControl(i) {+ return this._children.indexOf(i) !== -1;+ }+ /**+ * Adds a control to the children of this control+ * @param control defines the control to add+ * @returns the current container+ */+ addControl(i) {+ return this._children.indexOf(i) !== -1 ? this : (i.parent = this, i._host = this._host, this._children.push(i), this._host.utilityLayer && (i._prepareNode(this._host.utilityLayer.utilityLayerScene), i.node && (i.node.parent = this.node), this.blockLayout || this._arrangeChildren()), this);+ }+ /**+ * This function will be called everytime a new control is added+ */+ _arrangeChildren() {+ }+ _createNode(i) {+ return new Mu("ContainerNode", i);+ }+ /**+ * Removes a control from the children of this control+ * @param control defines the control to remove+ * @returns the current container+ */+ removeControl(i) {+ const d = this._children.indexOf(i);+ return d !== -1 && (this._children.splice(d, 1), i.parent = null, i._disposeNode()), this;+ }+ _getTypeName() {+ return "Container3D";+ }+ /**+ * Releases all associated resources+ */+ dispose() {+ for (const i of this._children)+ i.dispose();+ this._children.length = 0, super.dispose();+ }+}+No.UNSET_ORIENTATION = 0;+No.FACEORIGIN_ORIENTATION = 1;+No.FACEORIGINREVERSED_ORIENTATION = 2;+No.FACEFORWARD_ORIENTATION = 3;+No.FACEFORWARDREVERSED_ORIENTATION = 4;+class Rh extends No {+ /**+ * Gets or sets the orientation to apply to all controls (BABYLON.Container3D.FaceOriginReversedOrientation by default)+ * | Value | Type | Description |+ * | ----- | ----------------------------------- | ----------- |+ * | 0 | UNSET_ORIENTATION | Control rotation will remain unchanged |+ * | 1 | FACEORIGIN_ORIENTATION | Control will rotate to make it look at sphere central axis |+ * | 2 | FACEORIGINREVERSED_ORIENTATION | Control will rotate to make it look back at sphere central axis |+ * | 3 | FACEFORWARD_ORIENTATION | Control will rotate to look at z axis (0, 0, 1) |+ * | 4 | FACEFORWARDREVERSED_ORIENTATION | Control will rotate to look at negative z axis (0, 0, -1) |+ */+ get orientation() {+ return this._orientation;+ }+ set orientation(i) {+ this._orientation !== i && (this._orientation = i, Lr.SetImmediate(() => {+ this._arrangeChildren();+ }));+ }+ /**+ * Gets or sets the number of columns requested (10 by default).+ * The panel will automatically compute the number of rows based on number of child controls.+ */+ get columns() {+ return this._columns;+ }+ set columns(i) {+ this._columns !== i && (this._columns = i, this._rowThenColum = !0, Lr.SetImmediate(() => {+ this._arrangeChildren();+ }));+ }+ /**+ * Gets or sets a the number of rows requested.+ * The panel will automatically compute the number of columns based on number of child controls.+ */+ get rows() {+ return this._rows;+ }+ set rows(i) {+ this._rows !== i && (this._rows = i, this._rowThenColum = !1, Lr.SetImmediate(() => {+ this._arrangeChildren();+ }));+ }+ /**+ * Creates new VolumeBasedPanel+ * @param name+ */+ constructor(i) {+ super(i), this._columns = 10, this._rows = 0, this._rowThenColum = !0, this._orientation = No.FACEORIGIN_ORIENTATION, this.margin = 0;+ }+ _arrangeChildren() {+ this._cellWidth = 0, this._cellHeight = 0;+ let i, d, g = 0;+ for (const F of this._children) {+ if (!F.mesh)+ continue;+ g++, F.mesh.computeWorldMatrix(!0);+ const ne = F.mesh.getBoundingInfo().boundingBox.extendSize, $ = F.mesh.getDescendants(!1);+ for (const Q of $) {+ Q.computeWorldMatrix(!0);+ const X = Q;+ if (typeof X.getBoundingInfo == "function") {+ const he = X.getBoundingInfo().boundingBox.extendSize;+ ne.x = Math.max(ne.x, he.x), ne.y = Math.max(ne.y, he.y), ne.z = Math.max(ne.z, he.z);+ }+ }+ this._cellWidth = Math.max(this._cellWidth, ne.x * 2), this._cellHeight = Math.max(this._cellHeight, ne.y * 2);+ }+ this._cellWidth += this.margin * 2, this._cellHeight += this.margin * 2, this._rowThenColum ? (d = this._columns, i = Math.ceil(g / this._columns)) : (i = this._rows, d = Math.ceil(g / this._rows));+ const y = d * 0.5 * this._cellWidth, M = i * 0.5 * this._cellHeight, N = [];+ let O = 0;+ if (this._rowThenColum)+ for (let F = 0; F < i; F++)+ for (let ne = 0; ne < d && (N.push(new Se(ne * this._cellWidth - y + this._cellWidth / 2, F * this._cellHeight - M + this._cellHeight / 2, 0)), O++, !(O > g)); ne++)+ ;+ else+ for (let F = 0; F < d; F++)+ for (let ne = 0; ne < i && (N.push(new Se(F * this._cellWidth - y + this._cellWidth / 2, ne * this._cellHeight - M + this._cellHeight / 2, 0)), O++, !(O > g)); ne++)+ ;+ O = 0;+ for (const F of this._children)+ F.mesh && (this._mapGridNode(F, N[O]), O++);+ this._finalProcessing();+ }+ /** Child classes can implement this function to provide additional processing */+ _finalProcessing() {+ }+}+class X9 extends Rh {+ constructor() {+ super(...arguments), this._radius = 5;+ }+ /**+ * Gets or sets the radius of the cylinder where to project controls (5 by default)+ */+ get radius() {+ return this._radius;+ }+ set radius(i) {+ this._radius !== i && (this._radius = i, Lr.SetImmediate(() => {+ this._arrangeChildren();+ }));+ }+ _mapGridNode(i, d) {+ const g = i.mesh;+ if (!g)+ return;+ const y = this._cylindricalMapping(d);+ switch (i.position = y, this.orientation) {+ case No.FACEORIGIN_ORIENTATION:+ g.lookAt(new Se(2 * y.x, y.y, 2 * y.z));+ break;+ case No.FACEORIGINREVERSED_ORIENTATION:+ g.lookAt(new Se(-y.x, y.y, -y.z));+ break;+ case No.FACEFORWARD_ORIENTATION:+ break;+ case No.FACEFORWARDREVERSED_ORIENTATION:+ g.rotate(+ eS.Y,+ Math.PI,+ 0+ /* Space.LOCAL */+ );+ break;+ }+ }+ _cylindricalMapping(i) {+ const d = new Se(0, i.y, this._radius), g = i.x / this._radius;+ return Oh.RotationYawPitchRollToRef(g, 0, 0, Jr.Matrix[0]), Se.TransformNormal(d, Jr.Matrix[0]);+ }+}+const j4 = "fluentVertexShader", J9 = `precision highp float;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;uniform mat4 world;uniform mat4 viewProjection;varying vec2 vUV;+#ifdef BORDER+varying vec2 scaleInfo;uniform float borderWidth;uniform vec3 scaleFactor;+#endif+#ifdef HOVERLIGHT+varying vec3 worldPosition;+#endif+void main(void) {vUV=uv;+#ifdef BORDER+vec3 scale=scaleFactor;float minScale=min(min(scale.x,scale.y),scale.z);float maxScale=max(max(scale.x,scale.y),scale.z);float minOverMiddleScale=minScale/(scale.x+scale.y+scale.z-minScale-maxScale);float areaYZ=scale.y*scale.z;float areaXZ=scale.x*scale.z;float areaXY=scale.x*scale.y;float scaledBorderWidth=borderWidth; +if (abs(normal.x)==1.0) +{scale.x=scale.y;scale.y=scale.z;if (areaYZ>areaXZ && areaYZ>areaXY)+{scaledBorderWidth*=minOverMiddleScale;}}+else if (abs(normal.y)==1.0) +{scale.x=scale.z;if (areaXZ>areaXY && areaXZ>areaYZ)+{scaledBorderWidth*=minOverMiddleScale;}}+else +{if (areaXY>areaYZ && areaXY>areaXZ)+{scaledBorderWidth*=minOverMiddleScale;}}+float scaleRatio=min(scale.x,scale.y)/max(scale.x,scale.y);if (scale.x>scale.y)+{scaleInfo.x=1.0-(scaledBorderWidth*scaleRatio);scaleInfo.y=1.0-scaledBorderWidth;}+else+{scaleInfo.x=1.0-scaledBorderWidth;scaleInfo.y=1.0-(scaledBorderWidth*scaleRatio);} +#endif +vec4 worldPos=world*vec4(position,1.0);+#ifdef HOVERLIGHT+worldPosition=worldPos.xyz;+#endif+gl_Position=viewProjection*worldPos;}+`;+br.ShadersStore[j4] || (br.ShadersStore[j4] = J9);+const B4 = "fluentPixelShader", K9 = `precision highp float;varying vec2 vUV;uniform vec4 albedoColor;+#ifdef INNERGLOW+uniform vec4 innerGlowColor;+#endif+#ifdef BORDER+varying vec2 scaleInfo;uniform float edgeSmoothingValue;uniform float borderMinValue;+#endif+#ifdef HOVERLIGHT+varying vec3 worldPosition;uniform vec3 hoverPosition;uniform vec4 hoverColor;uniform float hoverRadius;+#endif+#ifdef TEXTURE+uniform sampler2D albedoSampler;uniform mat4 textureMatrix;vec2 finalUV;+#endif+void main(void) {vec3 albedo=albedoColor.rgb;float alpha=albedoColor.a;+#ifdef TEXTURE+finalUV=vec2(textureMatrix*vec4(vUV,1.0,0.0));albedo=texture2D(albedoSampler,finalUV).rgb;+#endif+#ifdef HOVERLIGHT+float pointToHover=(1.0-clamp(length(hoverPosition-worldPosition)/hoverRadius,0.,1.))*hoverColor.a;albedo=clamp(albedo+hoverColor.rgb*pointToHover,0.,1.);+#else+float pointToHover=1.0;+#endif+#ifdef BORDER +float borderPower=10.0;float inverseBorderPower=1.0/borderPower;vec3 borderColor=albedo*borderPower;vec2 distanceToEdge;distanceToEdge.x=abs(vUV.x-0.5)*2.0;distanceToEdge.y=abs(vUV.y-0.5)*2.0;float borderValue=max(smoothstep(scaleInfo.x-edgeSmoothingValue,scaleInfo.x+edgeSmoothingValue,distanceToEdge.x),+smoothstep(scaleInfo.y-edgeSmoothingValue,scaleInfo.y+edgeSmoothingValue,distanceToEdge.y));borderColor=borderColor*borderValue*max(borderMinValue*inverseBorderPower,pointToHover); +albedo+=borderColor;alpha=max(alpha,borderValue);+#endif+#ifdef INNERGLOW+vec2 uvGlow=(vUV-vec2(0.5,0.5))*(innerGlowColor.a*2.0);uvGlow=uvGlow*uvGlow;uvGlow=uvGlow*uvGlow;albedo+=mix(vec3(0.0,0.0,0.0),innerGlowColor.rgb,uvGlow.x+uvGlow.y); +#endif+gl_FragColor=vec4(albedo,alpha);}`;+br.ShadersStore[B4] || (br.ShadersStore[B4] = K9);+class gS extends hc {+ constructor() {+ super(), this.INNERGLOW = !1, this.BORDER = !1, this.HOVERLIGHT = !1, this.TEXTURE = !1, this.rebuild();+ }+}+class $o extends uc {+ /**+ * Creates a new Fluent material+ * @param name defines the name of the material+ * @param scene defines the hosting scene+ */+ constructor(i, d) {+ super(i, d), this.innerGlowColorIntensity = 0.5, this.innerGlowColor = new nr(1, 1, 1), this.albedoColor = new nr(0.3, 0.35, 0.4), this.renderBorders = !1, this.borderWidth = 0.5, this.edgeSmoothingValue = 0.02, this.borderMinValue = 0.1, this.renderHoverLight = !1, this.hoverRadius = 0.01, this.hoverColor = new Gr(0.3, 0.3, 0.3, 1), this.hoverPosition = Se.Zero();+ }+ needAlphaBlending() {+ return this.alpha !== 1;+ }+ needAlphaTesting() {+ return !1;+ }+ getAlphaTestTexture() {+ return null;+ }+ isReadyForSubMesh(i, d) {+ const g = d._drawWrapper;+ if (this.isFrozen && g.effect && g._wasPreviouslyReady)+ return !0;+ d.materialDefines || (d.materialDefines = new gS());+ const y = this.getScene(), M = d.materialDefines;+ if (!this.checkReadyOnEveryCall && d.effect && M._renderId === y.getRenderId())+ return !0;+ if (M._areTexturesDirty)+ if (M.INNERGLOW = this.innerGlowColorIntensity > 0, M.BORDER = this.renderBorders, M.HOVERLIGHT = this.renderHoverLight, this._albedoTexture)+ if (this._albedoTexture.isReadyOrNotBlocking())+ M.TEXTURE = !0;+ else+ return !1;+ else+ M.TEXTURE = !1;+ const N = y.getEngine();+ if (M.isDirty) {+ M.markAsProcessed(), y.resetCachedMaterial();+ const O = [Yt.PositionKind];+ O.push(Yt.NormalKind), O.push(Yt.UVKind);+ const F = "fluent", ne = [+ "world",+ "viewProjection",+ "innerGlowColor",+ "albedoColor",+ "borderWidth",+ "edgeSmoothingValue",+ "scaleFactor",+ "borderMinValue",+ "hoverColor",+ "hoverPosition",+ "hoverRadius",+ "textureMatrix"+ ], $ = ["albedoSampler"], Q = [];+ fc({+ uniformsNames: ne,+ uniformBuffersNames: Q,+ samplers: $,+ defines: M,+ maxSimultaneousLights: 4+ });+ const X = M.toString();+ d.setEffect(y.getEngine().createEffect(F, {+ attributes: O,+ uniformsNames: ne,+ uniformBuffersNames: Q,+ samplers: $,+ defines: X,+ fallbacks: null,+ onCompiled: this.onCompiled,+ onError: this.onError,+ indexParameters: { maxSimultaneousLights: 4 }+ }, N), M, this._materialContext);+ }+ return !d.effect || !d.effect.isReady() ? !1 : (M._renderId = y.getRenderId(), g._wasPreviouslyReady = !0, !0);+ }+ bindForSubMesh(i, d, g) {+ const y = this.getScene(), M = g.materialDefines;+ if (!M)+ return;+ const N = g.effect;+ if (N) {+ if (this._activeEffect = N, this.bindOnlyWorldMatrix(i), this._activeEffect.setMatrix("viewProjection", y.getTransformMatrix()), this._mustRebind(y, N, g) && (this._activeEffect.setColor4("albedoColor", this.albedoColor, this.alpha), M.INNERGLOW && this._activeEffect.setColor4("innerGlowColor", this.innerGlowColor, this.innerGlowColorIntensity), M.BORDER && (this._activeEffect.setFloat("borderWidth", this.borderWidth), this._activeEffect.setFloat("edgeSmoothingValue", this.edgeSmoothingValue), this._activeEffect.setFloat("borderMinValue", this.borderMinValue), d.getBoundingInfo().boundingBox.extendSize.multiplyToRef(d.scaling, Jr.Vector3[0]), this._activeEffect.setVector3("scaleFactor", Jr.Vector3[0])), M.HOVERLIGHT && (this._activeEffect.setDirectColor4("hoverColor", this.hoverColor), this._activeEffect.setFloat("hoverRadius", this.hoverRadius), this._activeEffect.setVector3("hoverPosition", this.hoverPosition)), M.TEXTURE && this._albedoTexture)) {+ this._activeEffect.setTexture("albedoSampler", this._albedoTexture);+ const O = this._albedoTexture.getTextureMatrix();+ this._activeEffect.setMatrix("textureMatrix", O);+ }+ this._afterBind(d, this._activeEffect, g);+ }+ }+ getActiveTextures() {+ return super.getActiveTextures();+ }+ hasTexture(i) {+ return !!super.hasTexture(i);+ }+ dispose(i) {+ super.dispose(i);+ }+ clone(i) {+ return Eo.Clone(() => new $o(i, this.getScene()), this);+ }+ serialize() {+ const i = super.serialize();+ return i.customType = "BABYLON.GUI.FluentMaterial", i;+ }+ getClassName() {+ return "FluentMaterial";+ }+ // Statics+ static Parse(i, d, g) {+ return Eo.Parse(() => new $o(i.name, d), i, d, g);+ }+}+q([+ H(),+ Cb("_markAllSubMeshesAsTexturesDirty")+], $o.prototype, "innerGlowColorIntensity", void 0);+q([+ tS()+], $o.prototype, "innerGlowColor", void 0);+q([+ tS()+], $o.prototype, "albedoColor", void 0);+q([+ H(),+ Cb("_markAllSubMeshesAsTexturesDirty")+], $o.prototype, "renderBorders", void 0);+q([+ H()+], $o.prototype, "borderWidth", void 0);+q([+ H()+], $o.prototype, "edgeSmoothingValue", void 0);+q([+ H()+], $o.prototype, "borderMinValue", void 0);+q([+ H(),+ Cb("_markAllSubMeshesAsTexturesDirty")+], $o.prototype, "renderHoverLight", void 0);+q([+ H()+], $o.prototype, "hoverRadius", void 0);+q([+ rS()+], $o.prototype, "hoverColor", void 0);+q([+ ku()+], $o.prototype, "hoverPosition", void 0);+q([+ j9("albedoTexture")+], $o.prototype, "_albedoTexture", void 0);+q([+ Cb("_markAllSubMeshesAsTexturesAndMiscDirty")+], $o.prototype, "albedoTexture", void 0);+kr("BABYLON.GUI.FluentMaterial", $o);+class bd extends Rh {+ /**+ * Gets or sets the margin size of the backplate in button size units.+ * Setting this to 1, will make the backPlate margin the size of 1 button+ */+ get backPlateMargin() {+ return this._backPlateMargin;+ }+ set backPlateMargin(i) {+ if (this._backPlateMargin = i, this._children.length >= 1) {+ for (const d of this.children)+ this._updateCurrentMinMax(d.position);+ this._updateMargins();+ }+ }+ _createNode(i) {+ const d = new Mb(`menu_${this.name}`, i);+ return this._backPlate = Wi("backPlate" + this.name, { size: 1 }, i), this._backPlate.parent = d, d;+ }+ _affectMaterial(i) {+ this._backPlateMaterial = new $o(this.name + "backPlateMaterial", i.getScene()), this._backPlateMaterial.albedoColor = new nr(0.08, 0.15, 0.55), this._backPlateMaterial.renderBorders = !0, this._backPlateMaterial.renderHoverLight = !0, this._pickedPointObserver = this._host.onPickedPointChangedObservable.add((d) => {+ d ? (this._backPlateMaterial.hoverPosition = d, this._backPlateMaterial.hoverColor.a = 1) : this._backPlateMaterial.hoverColor.a = 0;+ }), this._backPlate.material = this._backPlateMaterial;+ }+ _mapGridNode(i, d) {+ i.mesh && (i.position = d.clone(), this._updateCurrentMinMax(d));+ }+ _finalProcessing() {+ this._updateMargins();+ }+ _updateCurrentMinMax(i) {+ this._currentMin || (this._currentMin = i.clone(), this._currentMax = i.clone()), this._currentMin.minimizeInPlace(i), this._currentMax.maximizeInPlace(i);+ }+ _updateMargins() {+ if (this._children.length > 0) {+ this._currentMin.addInPlaceFromFloats(-this._cellWidth / 2, -this._cellHeight / 2, 0), this._currentMax.addInPlaceFromFloats(this._cellWidth / 2, this._cellHeight / 2, 0);+ const i = this._currentMax.subtract(this._currentMin);+ this._backPlate.scaling.x = i.x + this._cellWidth * this.backPlateMargin, this._backPlate.scaling.y = i.y + this._cellHeight * this.backPlateMargin, this._backPlate.scaling.z = 1e-3;+ for (let d = 0; d < this._children.length; d++)+ this._children[d].position.subtractInPlace(this._currentMin).subtractInPlace(i.scale(0.5)), this._children[d].position.z -= 0.01;+ }+ this._currentMin = null, this._currentMax = null;+ }+ /**+ * Creates a holographic menu GUI 3D control+ * @param name name of the menu+ */+ constructor(i) {+ super(i), this._backPlateMargin = 1.25;+ }+ /**+ * Adds a button to the menu.+ * Please note that the back material of the button will be set to transparent as it is attached to the menu.+ *+ * @param button Button to add+ * @returns This menu+ */+ addButton(i) {+ const d = this.blockLayout;+ return d || (this.blockLayout = !0), super.addControl(i), i.isBackplateVisible = !1, i.scaling.scaleInPlace(bd.MENU_BUTTON_SCALE), d || (this.blockLayout = !1), this;+ }+ /**+ * This method should not be used directly. It is inherited from `Container3D`.+ * Please use `addButton` instead.+ * @param _control the control to add+ * @returns the current container+ */+ addControl(i) {+ return zh.Warn("TouchHolographicMenu can only contain buttons. Please use the method `addButton` instead."), this;+ }+ /**+ * Disposes the menu+ */+ dispose() {+ super.dispose(), this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);+ }+}+bd.MENU_BUTTON_SCALE = 1;+class $9 extends bd {+ /**+ * The hand constraint behavior setting the transformation of this node+ */+ get handConstraintBehavior() {+ return this._handConstraintBehavior;+ }+ _createNode(i) {+ const d = super._createNode(i);+ return this._handConstraintBehavior.attach(d), d;+ }+ /**+ * Creates a hand menu GUI 3D control+ * @param xr the WebXRExperienceHelper used to link this control to the enabled WebXRHandTracking feature+ * @param name name of the hand menu+ */+ constructor(i, d) {+ super(d), this._handConstraintBehavior = new B9(), this._handConstraintBehavior.linkToXRExperience(i), this.backPlateMargin = 0.15, this.rows = 3;+ }+ /**+ * Disposes the hand menu+ */+ dispose() {+ super.dispose(), this._handConstraintBehavior.detach();+ }+}+const N4 = "fluentBackplatePixelShader", eF = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;uniform float _Radius_;uniform float _Line_Width_;uniform bool _Absolute_Sizes_;uniform float _Filter_Width_;uniform vec4 _Base_Color_;uniform vec4 _Line_Color_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform float _Rate_;uniform vec4 _Highlight_Color_;uniform float _Highlight_Width_;uniform vec4 _Highlight_Transform_;uniform float _Highlight_;uniform float _Iridescence_Intensity_;uniform float _Iridescence_Edge_Intensity_;uniform float _Angle_;uniform float _Fade_Out_;uniform bool _Reflected_;uniform float _Frequency_;uniform float _Vertical_Offset_;uniform sampler2D _Iridescent_Map_;uniform bool _Use_Global_Left_Index_;uniform bool _Use_Global_Right_Index_;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;void Round_Rect_Fragment_B31(+float Radius,+float Line_Width,+vec4 Line_Color,+float Filter_Width,+vec2 UV,+float Line_Visibility,+vec4 Rect_Parms,+vec4 Fill_Color,+out vec4 Color)+{float d=length(max(abs(UV)-Rect_Parms.xy,0.0));float dx=max(fwidth(d)*Filter_Width,0.00001);float g=min(Rect_Parms.z,Rect_Parms.w);float dgrad=max(fwidth(g)*Filter_Width,0.00001);float Inside_Rect=clamp(g/dgrad,0.0,1.0);float inner=clamp((d+dx*0.5-max(Radius-Line_Width,d-dx*0.5))/dx,0.0,1.0);Color=clamp(mix(Fill_Color,Line_Color,inner),0.0,1.0)*Inside_Rect;}+void Blob_Fragment_B71(+sampler2D Blob_Texture,+vec4 Blob_Info1,+vec4 Blob_Info2,+out vec4 Blob_Color)+{float k1=dot(Blob_Info1.xy,Blob_Info1.xy);float k2=dot(Blob_Info2.xy,Blob_Info2.xy);vec3 closer=k1<k2 ? vec3(k1,Blob_Info1.z,Blob_Info1.w) : vec3(k2,Blob_Info2.z,Blob_Info2.w);Blob_Color=closer.z*texture(Blob_Texture,vec2(vec2(sqrt(closer.x),closer.y).x,1.0-vec2(sqrt(closer.x),closer.y).y))*clamp(1.0-closer.x,0.0,1.0);}+void Line_Fragment_B48(+vec4 Base_Color,+vec4 Highlight_Color,+float Highlight_Width,+vec3 Line_Vertex,+float Highlight,+out vec4 Line_Color)+{float k2=1.0-clamp(abs(Line_Vertex.y/Highlight_Width),0.0,1.0);Line_Color=mix(Base_Color,Highlight_Color,Highlight*k2);}+void Scale_RGB_B54(+vec4 Color,+float Scalar,+out vec4 Result)+{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}+void Conditional_Float_B38(+bool Which,+float If_True,+float If_False,+out float Result)+{Result=Which ? If_True : If_False;}+void main()+{float R_Q72;float G_Q72;float B_Q72;float A_Q72;R_Q72=vColor.r; G_Q72=vColor.g; B_Q72=vColor.b; A_Q72=vColor.a;vec4 Blob_Color_Q71;+#if BLOB_ENABLE+float k1=dot(vExtra2.xy,vExtra2.xy);float k2=dot(vExtra3.xy,vExtra3.xy);vec3 closer=k1<k2 ? vec3(k1,vExtra2.z,vExtra2.w) : vec3(k2,vExtra3.z,vExtra3.w);Blob_Color_Q71=closer.z*texture(_Blob_Texture_,vec2(vec2(sqrt(closer.x),closer.y).x,1.0-vec2(sqrt(closer.x),closer.y).y))*clamp(1.0-closer.x,0.0,1.0);+#else+Blob_Color_Q71=vec4(0,0,0,0);+#endif+vec4 Line_Color_Q48;Line_Fragment_B48(_Line_Color_,_Highlight_Color_,_Highlight_Width_,vTangent,_Highlight_,Line_Color_Q48);float X_Q67;float Y_Q67;X_Q67=vUV.x;Y_Q67=vUV.y;vec3 Incident_Q66=normalize(vPosition-cameraPosition);vec3 Reflected_Q60=reflect(Incident_Q66,vBinormal);float Product_Q63=Y_Q67*_Vertical_Offset_;float Dot_Q68=dot(Incident_Q66, Reflected_Q60);float Dot_Q57=dot(vNormal, Incident_Q66);float Result_Q38;Conditional_Float_B38(_Reflected_,Dot_Q68,Dot_Q57,Result_Q38);float Product_Q64=Result_Q38*_Frequency_;float Sum_Q69=Product_Q64+1.0;float Product_Q70=Sum_Q69*0.5;float Sum_Q62=Product_Q63+Product_Q70;float FractF_Q59=fract(Sum_Q62);vec2 Vec2_Q65=vec2(FractF_Q59,0.5);vec4 Color_Q58;+#if IRIDESCENT_MAP_ENABLE+Color_Q58=texture(_Iridescent_Map_,Vec2_Q65);+#else+Color_Q58=vec4(0,0,0,0);+#endif+vec4 Result_Q54;Scale_RGB_B54(Color_Q58,_Iridescence_Edge_Intensity_,Result_Q54);vec4 Result_Q55;Scale_RGB_B54(Color_Q58,_Iridescence_Intensity_,Result_Q55);vec4 Base_And_Iridescent_Q53;Base_And_Iridescent_Q53=Line_Color_Q48+vec4(Result_Q54.rgb,0.0);vec4 Base_And_Iridescent_Q56;Base_And_Iridescent_Q56=_Base_Color_+vec4(Result_Q55.rgb,0.0);vec4 Result_Q52=Base_And_Iridescent_Q53; Result_Q52.a=1.0;vec4 Result_Q35=Blob_Color_Q71+(1.0-Blob_Color_Q71.a)*Base_And_Iridescent_Q56;vec4 Color_Q31;Round_Rect_Fragment_B31(R_Q72,G_Q72,Result_Q52,_Filter_Width_,vUV,1.0,vExtra1,Result_Q35,Color_Q31);vec4 Result_Q47=_Fade_Out_*Color_Q31;vec4 Out_Color=Result_Q47;float Clip_Threshold=0.001;bool To_sRGB=false;gl_FragColor=Out_Color;}`;+br.ShadersStore[N4] || (br.ShadersStore[N4] = eF);+const I4 = "fluentBackplateVertexShader", tF = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;+#ifdef TANGENT+attribute vec3 tangent;+#else+const vec3 tangent=vec3(0.);+#endif+uniform float _Radius_;uniform float _Line_Width_;uniform bool _Absolute_Sizes_;uniform float _Filter_Width_;uniform vec4 _Base_Color_;uniform vec4 _Line_Color_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform float _Rate_;uniform vec4 _Highlight_Color_;uniform float _Highlight_Width_;uniform vec4 _Highlight_Transform_;uniform float _Highlight_;uniform float _Iridescence_Intensity_;uniform float _Iridescence_Edge_Intensity_;uniform float _Angle_;uniform float _Fade_Out_;uniform bool _Reflected_;uniform float _Frequency_;uniform float _Vertical_Offset_;uniform sampler2D _Iridescent_Map_;uniform bool _Use_Global_Left_Index_;uniform bool _Use_Global_Right_Index_;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;void Object_To_World_Pos_B115(+vec3 Pos_Object,+out vec3 Pos_World)+{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}+void PickDir_B140(+float Degrees,+vec3 DirX,+vec3 DirY,+out vec3 Dir)+{float a=Degrees*3.14159/180.0;Dir=cos(a)*DirX+sin(a)*DirY;}+void Round_Rect_Vertex_B139(+vec2 UV,+float Radius,+float Margin,+float Anisotropy,+float Gradient1,+float Gradient2,+out vec2 Rect_UV,+out vec4 Rect_Parms,+out vec2 Scale_XY,+out vec2 Line_UV)+{Scale_XY=vec2(Anisotropy,1.0);Line_UV=(UV-vec2(0.5,0.5));Rect_UV=Line_UV*Scale_XY;Rect_Parms.xy=Scale_XY*0.5-vec2(Radius,Radius)-vec2(Margin,Margin);Rect_Parms.z=Gradient1; +Rect_Parms.w=Gradient2;}+void Line_Vertex_B135(+vec2 Scale_XY,+vec2 UV,+float Time,+float Rate,+vec4 Highlight_Transform,+out vec3 Line_Vertex)+{float angle2=(Rate*Time)*2.0*3.1416;float sinAngle2=sin(angle2);float cosAngle2=cos(angle2);vec2 xformUV=UV*Highlight_Transform.xy+Highlight_Transform.zw;Line_Vertex.x=0.0;Line_Vertex.y=cosAngle2*xformUV.x-sinAngle2*xformUV.y;Line_Vertex.z=0.0; }+void Blob_Vertex_B180(+vec3 Position,+vec3 Normal,+vec3 Tangent,+vec3 Bitangent,+vec3 Blob_Position,+float Intensity,+float Blob_Near_Size,+float Blob_Far_Size,+float Blob_Near_Distance,+float Blob_Far_Distance,+float Blob_Fade_Length,+float Blob_Pulse,+float Blob_Fade,+out vec4 Blob_Info)+{vec3 blob=Blob_Position;vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}+void Move_Verts_B129(+float Anisotropy,+vec3 P,+float Radius,+out vec3 New_P,+out vec2 New_UV,+out float Radial_Gradient,+out vec3 Radial_Dir)+{vec2 UV=P.xy*2.0+0.5;vec2 center=clamp(UV,0.0,1.0);vec2 delta=UV-center;vec2 r2=2.0*vec2(Radius/Anisotropy,Radius);New_UV=center+r2*(UV-2.0*center+0.5);New_P=vec3(New_UV-0.5,P.z);Radial_Gradient=1.0-length(delta)*2.0;Radial_Dir=vec3(delta*r2,0.0);}+void Object_To_World_Dir_B132(+vec3 Dir_Object,+out vec3 Binormal_World,+out vec3 Binormal_World_N,+out float Binormal_Length)+{Binormal_World=(world*vec4(Dir_Object,0.0)).xyz;Binormal_Length=length(Binormal_World);Binormal_World_N=Binormal_World/Binormal_Length;}+void RelativeOrAbsoluteDetail_B147(+float Nominal_Radius,+float Nominal_LineWidth,+bool Absolute_Measurements,+float Height,+out float Radius,+out float Line_Width)+{float scale=Absolute_Measurements ? 1.0/Height : 1.0;Radius=Nominal_Radius*scale;Line_Width=Nominal_LineWidth*scale;}+void Edge_AA_Vertex_B130(+vec3 Position_World,+vec3 Position_Object,+vec3 Normal_Object,+vec3 Eye,+float Radial_Gradient,+vec3 Radial_Dir,+vec3 Tangent,+out float Gradient1,+out float Gradient2)+{vec3 I=(Eye-Position_World);vec3 T=(world* vec4(Tangent,0.0)).xyz;float g=(dot(T,I)<0.0) ? 0.0 : 1.0;if (Normal_Object.z==0.0) { +Gradient1=Position_Object.z>0.0 ? g : 1.0;Gradient2=Position_Object.z>0.0 ? 1.0 : g;} else {Gradient1=g+(1.0-g)*(Radial_Gradient);Gradient2=1.0;}}+void Pick_Radius_B144(+float Radius,+float Radius_Top_Left,+float Radius_Top_Right,+float Radius_Bottom_Left,+float Radius_Bottom_Right,+vec3 Position,+out float Result)+{bool whichY=Position.y>0.0;Result=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);Result*=Radius;}+void main()+{vec3 Nrm_World_Q128;Nrm_World_Q128=normalize((world*vec4(normal,0.0)).xyz);vec3 Tangent_World_Q131;vec3 Tangent_World_N_Q131;float Tangent_Length_Q131;Tangent_World_Q131=(world*vec4(vec3(1,0,0),0.0)).xyz;Tangent_Length_Q131=length(Tangent_World_Q131);Tangent_World_N_Q131=Tangent_World_Q131/Tangent_Length_Q131;vec3 Binormal_World_Q132;vec3 Binormal_World_N_Q132;float Binormal_Length_Q132;Object_To_World_Dir_B132(vec3(0,1,0),Binormal_World_Q132,Binormal_World_N_Q132,Binormal_Length_Q132);float Anisotropy_Q133=Tangent_Length_Q131/Binormal_Length_Q132;vec3 Result_Q177;Result_Q177=mix(_Blob_Position_,Global_Left_Index_Tip_Position.xyz,float(_Use_Global_Left_Index_));vec3 Result_Q178;Result_Q178=mix(_Blob_Position_2_,Global_Right_Index_Tip_Position.xyz,float(_Use_Global_Right_Index_));float Result_Q144;Pick_Radius_B144(_Radius_,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q144);vec3 Dir_Q140;PickDir_B140(_Angle_,Tangent_World_N_Q131,Binormal_World_N_Q132,Dir_Q140);float Radius_Q147;float Line_Width_Q147;RelativeOrAbsoluteDetail_B147(Result_Q144,_Line_Width_,_Absolute_Sizes_,Binormal_Length_Q132,Radius_Q147,Line_Width_Q147);vec4 Out_Color_Q145=vec4(Radius_Q147,Line_Width_Q147,0,1);vec3 New_P_Q129;vec2 New_UV_Q129;float Radial_Gradient_Q129;vec3 Radial_Dir_Q129;Move_Verts_B129(Anisotropy_Q133,position,Radius_Q147,New_P_Q129,New_UV_Q129,Radial_Gradient_Q129,Radial_Dir_Q129);vec3 Pos_World_Q115;Object_To_World_Pos_B115(New_P_Q129,Pos_World_Q115);vec4 Blob_Info_Q180;+#if BLOB_ENABLE+Blob_Vertex_B180(Pos_World_Q115,Nrm_World_Q128,Tangent_World_N_Q131,Binormal_World_N_Q132,Result_Q177,_Blob_Intensity_,_Blob_Near_Size_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_,_Blob_Fade_,Blob_Info_Q180);+#else+Blob_Info_Q180=vec4(0,0,0,0);+#endif+vec4 Blob_Info_Q181;+#if BLOB_ENABLE_2+Blob_Vertex_B180(Pos_World_Q115,Nrm_World_Q128,Tangent_World_N_Q131,Binormal_World_N_Q132,Result_Q178,_Blob_Intensity_,_Blob_Near_Size_2_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_2_,_Blob_Fade_2_,Blob_Info_Q181);+#else+Blob_Info_Q181=vec4(0,0,0,0);+#endif+float Gradient1_Q130;float Gradient2_Q130;+#if SMOOTH_EDGES+Edge_AA_Vertex_B130(Pos_World_Q115,position,normal,cameraPosition,Radial_Gradient_Q129,Radial_Dir_Q129,tangent,Gradient1_Q130,Gradient2_Q130);+#else+Gradient1_Q130=1.0;Gradient2_Q130=1.0;+#endif+vec2 Rect_UV_Q139;vec4 Rect_Parms_Q139;vec2 Scale_XY_Q139;vec2 Line_UV_Q139;Round_Rect_Vertex_B139(New_UV_Q129,Radius_Q147,0.0,Anisotropy_Q133,Gradient1_Q130,Gradient2_Q130,Rect_UV_Q139,Rect_Parms_Q139,Scale_XY_Q139,Line_UV_Q139);vec3 Line_Vertex_Q135;Line_Vertex_B135(Scale_XY_Q139,Line_UV_Q139,0.0,_Rate_,_Highlight_Transform_,Line_Vertex_Q135);vec3 Position=Pos_World_Q115;vec3 Normal=Dir_Q140;vec2 UV=Rect_UV_Q139;vec3 Tangent=Line_Vertex_Q135;vec3 Binormal=Nrm_World_Q128;vec4 Color=Out_Color_Q145;vec4 Extra1=Rect_Parms_Q139;vec4 Extra2=Blob_Info_Q180;vec4 Extra3=Blob_Info_Q181;gl_Position=viewProjection*vec4(Position,1);vPosition=Position;vNormal=Normal;vUV=UV;vTangent=Tangent;vBinormal=Binormal;vColor=Color;vExtra1=Extra1;vExtra2=Extra2;vExtra3=Extra3;}`;+br.ShadersStore[I4] || (br.ShadersStore[I4] = tF);+class rF extends hc {+ constructor() {+ super(), this.BLOB_ENABLE = !0, this.BLOB_ENABLE_2 = !0, this.SMOOTH_EDGES = !0, this.IRIDESCENT_MAP_ENABLE = !0, this._needNormals = !0, this.rebuild();+ }+}+class Dr extends uc {+ constructor(i, d) {+ super(i, d), this.radius = 0.03, this.lineWidth = 0.01, this.absoluteSizes = !1, this._filterWidth = 1, this.baseColor = new Gr(0.0392157, 0.0666667, 0.207843, 1), this.lineColor = new Gr(0.14902, 0.133333, 0.384314, 1), this.blobIntensity = 0.98, this.blobFarSize = 0.04, this.blobNearDistance = 0, this.blobFarDistance = 0.08, this.blobFadeLength = 0.08, this.blobNearSize = 0.22, this.blobPulse = 0, this.blobFade = 0, this.blobNearSize2 = 0.22, this.blobPulse2 = 0, this.blobFade2 = 0, this._rate = 0.135, this.highlightColor = new Gr(0.98, 0.98, 0.98, 1), this.highlightWidth = 0.25, this._highlightTransform = new fi(1, 1, 0, 0), this._highlight = 1, this.iridescenceIntensity = 0, this.iridescenceEdgeIntensity = 1, this._angle = -45, this.fadeOut = 1, this._reflected = !0, this._frequency = 1, this._verticalOffset = 0, this.globalLeftIndexTipPosition = Se.Zero(), this._globalLeftIndexTipPosition4 = fi.Zero(), this.globalRightIndexTipPosition = Se.Zero(), this._globalRightIndexTipPosition4 = fi.Zero(), this.alphaMode = Is.ALPHA_DISABLE, this.backFaceCulling = !1;+ const g = Lr.GetAssetUrl(Dr.BLOB_TEXTURE_URL), y = Lr.GetAssetUrl(Dr.IM_TEXTURE_URL);+ this._blobTexture = new Wr(g, this.getScene(), !0, !1, Wr.NEAREST_SAMPLINGMODE), this._iridescentMap = new Wr(y, this.getScene(), !0, !1, Wr.NEAREST_SAMPLINGMODE);+ }+ needAlphaBlending() {+ return !1;+ }+ needAlphaTesting() {+ return !1;+ }+ getAlphaTestTexture() {+ return null;+ }+ isReadyForSubMesh(i, d) {+ const g = d._drawWrapper;+ if (this.isFrozen && g.effect && g._wasPreviouslyReady)+ return !0;+ if (!this._blobTexture.isReady() || !this._iridescentMap.isReady())+ return !1;+ d.materialDefines || (d.materialDefines = new rF());+ const y = d.materialDefines, M = this.getScene();+ if (this._isReadyForSubMesh(d))+ return !0;+ const N = M.getEngine();+ if (vd(i, y, !1, !1), y.isDirty) {+ y.markAsProcessed(), M.resetCachedMaterial();+ const O = new _d();+ y.FOG && O.addFallback(1, "FOG"), wd(y, O), y.IMAGEPROCESSINGPOSTPROCESS = M.imageProcessingConfiguration.applyByPostProcess;+ const F = [Yt.PositionKind];+ y.NORMAL && F.push(Yt.NormalKind), y.UV1 && F.push(Yt.UVKind), y.UV2 && F.push(Yt.UV2Kind), y.VERTEXCOLOR && F.push(Yt.ColorKind), y.TANGENT && F.push(Yt.TangentKind), yd(F, y);+ const ne = "fluentBackplate", $ = y.toString(), Q = [+ "world",+ "viewProjection",+ "cameraPosition",+ "_Radius_",+ "_Line_Width_",+ "_Absolute_Sizes_",+ "_Filter_Width_",+ "_Base_Color_",+ "_Line_Color_",+ "_Radius_Top_Left_",+ "_Radius_Top_Right_",+ "_Radius_Bottom_Left_",+ "_Radius_Bottom_Right_",+ "_Blob_Position_",+ "_Blob_Intensity_",+ "_Blob_Near_Size_",+ "_Blob_Far_Size_",+ "_Blob_Near_Distance_",+ "_Blob_Far_Distance_",+ "_Blob_Fade_Length_",+ "_Blob_Pulse_",+ "_Blob_Fade_",+ "_Blob_Texture_",+ "_Blob_Position_2_",+ "_Blob_Near_Size_2_",+ "_Blob_Pulse_2_",+ "_Blob_Fade_2_",+ "_Rate_",+ "_Highlight_Color_",+ "_Highlight_Width_",+ "_Highlight_Transform_",+ "_Highlight_",+ "_Iridescence_Intensity_",+ "_Iridescence_Edge_Intensity_",+ "_Angle_",+ "_Fade_Out_",+ "_Reflected_",+ "_Frequency_",+ "_Vertical_Offset_",+ "_Iridescent_Map_",+ "_Use_Global_Left_Index_",+ "_Use_Global_Right_Index_",+ "Global_Left_Index_Tip_Position",+ "Global_Right_Index_Tip_Position"+ ], X = ["_Blob_Texture_", "_Iridescent_Map_"], he = [];+ fc({+ uniformsNames: Q,+ uniformBuffersNames: he,+ samplers: X,+ defines: y,+ maxSimultaneousLights: 4+ }), d.setEffect(M.getEngine().createEffect(ne, {+ attributes: F,+ uniformsNames: Q,+ uniformBuffersNames: he,+ samplers: X,+ defines: $,+ fallbacks: O,+ onCompiled: this.onCompiled,+ onError: this.onError,+ indexParameters: { maxSimultaneousLights: 4 }+ }, N), y, this._materialContext);+ }+ return !d.effect || !d.effect.isReady() ? !1 : (y._renderId = M.getRenderId(), g._wasPreviouslyReady = !0, !0);+ }+ bindForSubMesh(i, d, g) {+ if (!g.materialDefines)+ return;+ const M = g.effect;+ M && (this._activeEffect = M, this.bindOnlyWorldMatrix(i), this._activeEffect.setMatrix("viewProjection", this.getScene().getTransformMatrix()), this._activeEffect.setVector3("cameraPosition", this.getScene().activeCamera?.position ?? Se.ZeroReadOnly), this._activeEffect.setFloat("_Radius_", this.radius), this._activeEffect.setFloat("_Line_Width_", this.lineWidth), this._activeEffect.setFloat("_Absolute_Sizes_", this.absoluteSizes ? 1 : 0), this._activeEffect.setFloat("_Filter_Width_", this._filterWidth), this._activeEffect.setDirectColor4("_Base_Color_", this.baseColor), this._activeEffect.setDirectColor4("_Line_Color_", this.lineColor), this._activeEffect.setFloat("_Radius_Top_Left_", 1), this._activeEffect.setFloat("_Radius_Top_Right_", 1), this._activeEffect.setFloat("_Radius_Bottom_Left_", 1), this._activeEffect.setFloat("_Radius_Bottom_Right_", 1), this._activeEffect.setFloat("_Blob_Intensity_", this.blobIntensity), this._activeEffect.setFloat("_Blob_Near_Size_", this.blobNearSize), this._activeEffect.setFloat("_Blob_Far_Size_", this.blobFarSize), this._activeEffect.setFloat("_Blob_Near_Distance_", this.blobNearDistance), this._activeEffect.setFloat("_Blob_Far_Distance_", this.blobFarDistance), this._activeEffect.setFloat("_Blob_Fade_Length_", this.blobFadeLength), this._activeEffect.setFloat("_Blob_Pulse_", this.blobPulse), this._activeEffect.setFloat("_Blob_Fade_", this.blobFade), this._activeEffect.setTexture("_Blob_Texture_", this._blobTexture), this._activeEffect.setFloat("_Blob_Near_Size_2_", this.blobNearSize2), this._activeEffect.setFloat("_Blob_Pulse_2_", this.blobPulse2), this._activeEffect.setFloat("_Blob_Fade_2_", this.blobFade2), this._activeEffect.setFloat("_Rate_", this._rate), this._activeEffect.setDirectColor4("_Highlight_Color_", this.highlightColor), this._activeEffect.setFloat("_Highlight_Width_", this.highlightWidth), this._activeEffect.setVector4("_Highlight_Transform_", this._highlightTransform), this._activeEffect.setFloat("_Highlight_", this._highlight), this._activeEffect.setFloat("_Iridescence_Intensity_", this.iridescenceIntensity), this._activeEffect.setFloat("_Iridescence_Edge_Intensity_", this.iridescenceEdgeIntensity), this._activeEffect.setFloat("_Angle_", this._angle), this._activeEffect.setFloat("_Fade_Out_", this.fadeOut), this._activeEffect.setFloat("_Reflected_", this._reflected ? 1 : 0), this._activeEffect.setFloat("_Frequency_", this._frequency), this._activeEffect.setFloat("_Vertical_Offset_", this._verticalOffset), this._activeEffect.setTexture("_Iridescent_Map_", this._iridescentMap), this._activeEffect.setFloat("_Use_Global_Left_Index_", 1), this._activeEffect.setFloat("_Use_Global_Right_Index_", 1), this._globalLeftIndexTipPosition4.set(this.globalLeftIndexTipPosition.x, this.globalLeftIndexTipPosition.y, this.globalLeftIndexTipPosition.z, 1), this._activeEffect.setVector4("Global_Left_Index_Tip_Position", this._globalLeftIndexTipPosition4), this._globalRightIndexTipPosition4.set(this.globalRightIndexTipPosition.x, this.globalRightIndexTipPosition.y, this.globalRightIndexTipPosition.z, 1), this._activeEffect.setVector4("Global_Right_Index_Tip_Position", this._globalRightIndexTipPosition4), this._afterBind(d, this._activeEffect, g));+ }+ /**+ * Get the list of animatables in the material.+ * @returns the list of animatables object used in the material+ */+ getAnimatables() {+ return [];+ }+ dispose(i) {+ super.dispose(i), this._blobTexture.dispose(), this._iridescentMap.dispose();+ }+ clone(i) {+ return Eo.Clone(() => new Dr(i, this.getScene()), this);+ }+ serialize() {+ const i = super.serialize();+ return i.customType = "BABYLON.FluentBackplateMaterial", i;+ }+ getClassName() {+ return "FluentBackplateMaterial";+ }+ // Statics+ static Parse(i, d, g) {+ return Eo.Parse(() => new Dr(i.name, d), i, d, g);+ }+}+Dr.BLOB_TEXTURE_URL = "https://assets.babylonjs.com/core/MRTK/mrtk-fluent-backplate-blob.png";+Dr.IM_TEXTURE_URL = "https://assets.babylonjs.com/core/MRTK/mrtk-fluent-backplate-iridescence.png";+q([+ H()+], Dr.prototype, "radius", void 0);+q([+ H()+], Dr.prototype, "lineWidth", void 0);+q([+ H()+], Dr.prototype, "absoluteSizes", void 0);+q([+ H()+], Dr.prototype, "baseColor", void 0);+q([+ H()+], Dr.prototype, "lineColor", void 0);+q([+ H()+], Dr.prototype, "blobIntensity", void 0);+q([+ H()+], Dr.prototype, "blobFarSize", void 0);+q([+ H()+], Dr.prototype, "blobNearDistance", void 0);+q([+ H()+], Dr.prototype, "blobFarDistance", void 0);+q([+ H()+], Dr.prototype, "blobFadeLength", void 0);+q([+ H()+], Dr.prototype, "blobNearSize", void 0);+q([+ H()+], Dr.prototype, "blobPulse", void 0);+q([+ H()+], Dr.prototype, "blobFade", void 0);+q([+ H()+], Dr.prototype, "blobNearSize2", void 0);+q([+ H()+], Dr.prototype, "blobPulse2", void 0);+q([+ H()+], Dr.prototype, "blobFade2", void 0);+q([+ H()+], Dr.prototype, "highlightColor", void 0);+q([+ H()+], Dr.prototype, "highlightWidth", void 0);+q([+ H()+], Dr.prototype, "iridescenceIntensity", void 0);+q([+ H()+], Dr.prototype, "iridescenceEdgeIntensity", void 0);+q([+ H()+], Dr.prototype, "fadeOut", void 0);+q([+ ku()+], Dr.prototype, "globalLeftIndexTipPosition", void 0);+q([+ ku()+], Dr.prototype, "globalRightIndexTipPosition", void 0);+kr("BABYLON.GUI.FluentBackplateMaterial", Dr);+class Dh extends tm {+ /**+ * Rendering ground id of the backplate mesh.+ */+ set renderingGroupId(i) {+ this._model.renderingGroupId = i;+ }+ get renderingGroupId() {+ return this._model.renderingGroupId;+ }+ /**+ * Gets the material used by the backplate+ */+ get material() {+ return this._material;+ }+ /**+ * Gets a boolean indicating if this backplate shares its material with other HolographicBackplates+ */+ get shareMaterials() {+ return this._shareMaterials;+ }+ /**+ * Creates a new holographic backplate+ * @param name defines the control name+ * @param _shareMaterials+ */+ constructor(i, d = !0) {+ super(i), this._shareMaterials = d;+ }+ _getTypeName() {+ return "HolographicBackplate";+ }+ // Mesh association+ _createNode(i) {+ const d = Wi((this.name ?? "HolographicBackplate") + "_CollisionMesh", {+ width: 1,+ height: 1,+ depth: 1+ }, i);+ d.isPickable = !0, d.visibility = 0;+ const g = Lr.GetAssetUrl(Dh.MODEL_BASE_URL);+ return yu.ImportMeshAsync(void 0, g, Dh.MODEL_FILENAME, i).then((y) => {+ const M = y.meshes[1];+ M.name = `${this.name}_frontPlate`, M.isPickable = !1, M.parent = d, this._material && (M.material = this._material), this._model = M;+ }), d;+ }+ _createMaterial(i) {+ this._material = new Dr(this.name + " Material", i.getScene());+ }+ _affectMaterial(i) {+ this._shareMaterials ? this._host._touchSharedMaterials.fluentBackplateMaterial ? this._material = this._host._touchSharedMaterials.fluentBackplateMaterial : (this._createMaterial(i), this._host._touchSharedMaterials.fluentBackplateMaterial = this._material) : this._createMaterial(i);+ }+ /**+ * Releases all associated resources+ */+ dispose() {+ super.dispose(), this.shareMaterials || this._material.dispose(), this._model.dispose();+ }+}+Dh.MODEL_BASE_URL = "https://assets.babylonjs.com/core/MRTK/";+Dh.MODEL_FILENAME = "mrtk-fluent-backplate.glb";+class oF extends Bb {+ _disposeTooltip() {+ this._tooltipFade = null, this._tooltipTextBlock && this._tooltipTextBlock.dispose(), this._tooltipTexture && this._tooltipTexture.dispose(), this._tooltipMesh && this._tooltipMesh.dispose(), this.onPointerEnterObservable.remove(this._tooltipHoverObserver), this.onPointerOutObservable.remove(this._tooltipOutObserver);+ }+ /**+ * Rendering ground id of all the mesh in the button+ */+ set renderingGroupId(i) {+ this._backPlate.renderingGroupId = i, this._textPlate.renderingGroupId = i, this._frontPlate.renderingGroupId = i, this._tooltipMesh && (this._tooltipMesh.renderingGroupId = i);+ }+ get renderingGroupId() {+ return this._backPlate.renderingGroupId;+ }+ /**+ * Text to be displayed on the tooltip shown when hovering on the button. When set to null tooltip is disabled. (Default: null)+ */+ set tooltipText(i) {+ if (!i) {+ this._disposeTooltip();+ return;+ }+ if (!this._tooltipFade) {+ const d = this._backPlate._scene.useRightHandedSystem;+ this._tooltipMesh = sl("", { size: 1 }, this._backPlate._scene);+ const g = sl("", { size: 1, sideOrientation: Mb.DOUBLESIDE }, this._backPlate._scene), y = new xu("", this._backPlate._scene);+ y.diffuseColor = nr.FromHexString("#212121"), g.material = y, g.isPickable = !1, this._tooltipMesh.addChild(g), g.position = Se.Forward(d).scale(0.05), this._tooltipMesh.scaling.y = 1 / 3, this._tooltipMesh.position = Se.Up().scale(0.7).add(Se.Forward(d).scale(-0.15)), this._tooltipMesh.isPickable = !1, this._tooltipMesh.parent = this._backPlate, this._tooltipTexture = go.CreateForMesh(this._tooltipMesh), this._tooltipTextBlock = new zr(), this._tooltipTextBlock.scaleY = 3, this._tooltipTextBlock.color = "white", this._tooltipTextBlock.fontSize = 130, this._tooltipTexture.addControl(this._tooltipTextBlock), this._tooltipFade = new lw(), this._tooltipFade.delay = 500, this._tooltipMesh.addBehavior(this._tooltipFade), this._tooltipHoverObserver = this.onPointerEnterObservable.add(() => {+ this._tooltipFade && this._tooltipFade.fadeIn(!0);+ }), this._tooltipOutObserver = this.onPointerOutObservable.add(() => {+ this._tooltipFade && this._tooltipFade.fadeIn(!1);+ });+ }+ this._tooltipTextBlock && (this._tooltipTextBlock.text = i);+ }+ get tooltipText() {+ return this._tooltipTextBlock ? this._tooltipTextBlock.text : null;+ }+ /**+ * Gets or sets text for the button+ */+ get text() {+ return this._text;+ }+ set text(i) {+ this._text !== i && (this._text = i, this._rebuildContent());+ }+ /**+ * Gets or sets the image url for the button+ */+ get imageUrl() {+ return this._imageUrl;+ }+ set imageUrl(i) {+ this._imageUrl !== i && (this._imageUrl = i, this._rebuildContent());+ }+ /**+ * Gets the back material used by this button+ */+ get backMaterial() {+ return this._backMaterial;+ }+ /**+ * Gets the front material used by this button+ */+ get frontMaterial() {+ return this._frontMaterial;+ }+ /**+ * Gets the plate material used by this button+ */+ get plateMaterial() {+ return this._plateMaterial;+ }+ /**+ * Gets a boolean indicating if this button shares its material with other HolographicButtons+ */+ get shareMaterials() {+ return this._shareMaterials;+ }+ /**+ * Creates a new button+ * @param name defines the control name+ * @param shareMaterials+ */+ constructor(i, d = !0) {+ super(i), this._shareMaterials = !0, this._shareMaterials = d, this.pointerEnterAnimation = () => {+ this.mesh && this._frontPlate.setEnabled(!0);+ }, this.pointerOutAnimation = () => {+ this.mesh && this._frontPlate.setEnabled(!1);+ };+ }+ _getTypeName() {+ return "HolographicButton";+ }+ _rebuildContent() {+ this._disposeFacadeTexture();+ const i = new Gi();+ if (i.isVertical = !0, xb() && document.createElement && this._imageUrl) {+ const d = new Ft();+ d.source = this._imageUrl, d.paddingTop = "40px", d.height = "180px", d.width = "100px", d.paddingBottom = "40px", i.addControl(d);+ }+ if (this._text) {+ const d = new zr();+ d.text = this._text, d.color = "white", d.height = "30px", d.fontSize = 24, i.addControl(d);+ }+ this._frontPlate && (this.content = i);+ }+ // Mesh association+ _createNode(i) {+ return this._backPlate = Wi(this.name + "BackMesh", {+ width: 1,+ height: 1,+ depth: 0.08+ }, i), this._frontPlate = Wi(this.name + "FrontMesh", {+ width: 1,+ height: 1,+ depth: 0.08+ }, i), this._frontPlate.parent = this._backPlate, this._frontPlate.position = Se.Forward(i.useRightHandedSystem).scale(-0.08), this._frontPlate.isPickable = !1, this._frontPlate.setEnabled(!1), this._textPlate = super._createNode(i), this._textPlate.parent = this._backPlate, this._textPlate.position = Se.Forward(i.useRightHandedSystem).scale(-0.08), this._textPlate.isPickable = !1, this._backPlate;+ }+ _applyFacade(i) {+ this._plateMaterial.emissiveTexture = i, this._plateMaterial.opacityTexture = i;+ }+ _createBackMaterial(i) {+ this._backMaterial = new $o(this.name + "Back Material", i.getScene()), this._backMaterial.renderHoverLight = !0, this._pickedPointObserver = this._host.onPickedPointChangedObservable.add((d) => {+ d ? (this._backMaterial.hoverPosition = d, this._backMaterial.hoverColor.a = 1) : this._backMaterial.hoverColor.a = 0;+ });+ }+ _createFrontMaterial(i) {+ this._frontMaterial = new $o(this.name + "Front Material", i.getScene()), this._frontMaterial.innerGlowColorIntensity = 0, this._frontMaterial.alpha = 0.5, this._frontMaterial.renderBorders = !0;+ }+ _createPlateMaterial(i) {+ this._plateMaterial = new xu(this.name + "Plate Material", i.getScene()), this._plateMaterial.specularColor = nr.Black();+ }+ _affectMaterial(i) {+ this._shareMaterials ? (this._host._sharedMaterials.backFluentMaterial ? this._backMaterial = this._host._sharedMaterials.backFluentMaterial : (this._createBackMaterial(i), this._host._sharedMaterials.backFluentMaterial = this._backMaterial), this._host._sharedMaterials.frontFluentMaterial ? this._frontMaterial = this._host._sharedMaterials.frontFluentMaterial : (this._createFrontMaterial(i), this._host._sharedMaterials.frontFluentMaterial = this._frontMaterial)) : (this._createBackMaterial(i), this._createFrontMaterial(i)), this._createPlateMaterial(i), this._backPlate.material = this._backMaterial, this._frontPlate.material = this._frontMaterial, this._textPlate.material = this._plateMaterial, this._rebuildContent();+ }+ /**+ * Releases all associated resources+ */+ dispose() {+ super.dispose(), this._disposeTooltip(), this.shareMaterials || (this._backMaterial.dispose(), this._frontMaterial.dispose(), this._plateMaterial.dispose(), this._pickedPointObserver && (this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver), this._pickedPointObserver = null));+ }+}+const z4 = "fluentButtonPixelShader", iF = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;uniform float _Edge_Width_;uniform vec4 _Edge_Color_;uniform bool _Relative_Width_;uniform float _Proximity_Max_Intensity_;uniform float _Proximity_Far_Distance_;uniform float _Proximity_Near_Radius_;uniform float _Proximity_Anisotropy_;uniform float _Selection_Fuzz_;uniform float _Selected_;uniform float _Selection_Fade_;uniform float _Selection_Fade_Size_;uniform float _Selected_Distance_;uniform float _Selected_Fade_Length_;uniform bool _Blob_Enable_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Inner_Fade_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform bool _Blob_Enable_2_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Inner_Fade_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Active_Face_Dir_;uniform vec3 _Active_Face_Up_;uniform bool Enable_Fade;uniform float _Fade_Width_;uniform bool _Smooth_Active_Face_;uniform bool _Show_Frame_;uniform bool _Use_Blob_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;void Holo_Edge_Fragment_B35(+vec4 Edges,+float Edge_Width,+out float NotEdge)+{vec2 c=vec2(min(Edges.r,Edges.g),min(Edges.b,Edges.a));vec2 df=fwidth(c)*Edge_Width;vec2 g=clamp(c/df,0.0,1.0);NotEdge=g.x*g.y;}+void Blob_Fragment_B39(+vec2 UV,+vec3 Blob_Info,+sampler2D Blob_Texture,+out vec4 Blob_Color)+{float k=dot(UV,UV);Blob_Color=Blob_Info.y*texture(Blob_Texture,vec2(vec2(sqrt(k),Blob_Info.x).x,1.0-vec2(sqrt(k),Blob_Info.x).y))*(1.0-clamp(k,0.0,1.0));}+vec2 FilterStep(vec2 Edge,vec2 X)+{vec2 dX=max(fwidth(X),vec2(0.00001,0.00001));return clamp( (X+dX-max(Edge,X-dX))/(dX*2.0),0.0,1.0);}+void Wireframe_Fragment_B59(+vec3 Widths,+vec2 UV,+float Proximity,+vec4 Edge_Color,+out vec4 Wireframe)+{vec2 c=min(UV,vec2(1.0,1.0)-UV);vec2 g=FilterStep(Widths.xy*0.5,c); +Wireframe=(1.0-min(g.x,g.y))*Proximity*Edge_Color;}+void Proximity_B53(+vec3 Proximity_Center,+vec3 Proximity_Center_2,+float Proximity_Max_Intensity,+float Proximity_Near_Radius,+vec3 Position,+vec3 Show_Selection,+vec4 Extra1,+float Dist_To_Face,+float Intensity,+out float Proximity)+{vec2 delta1=Extra1.xy;vec2 delta2=Extra1.zw;float d2=sqrt(min(dot(delta1,delta1),dot(delta2,delta2))+Dist_To_Face*Dist_To_Face);Proximity=Intensity*Proximity_Max_Intensity*(1.0-clamp(d2/Proximity_Near_Radius,0.0,1.0))*(1.0-Show_Selection.x)+Show_Selection.x;}+void To_XYZ_B46(+vec3 Vec3,+out float X,+out float Y,+out float Z)+{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}+void main()+{float NotEdge_Q35;+#if ENABLE_FADE+Holo_Edge_Fragment_B35(vColor,_Fade_Width_,NotEdge_Q35);+#else+NotEdge_Q35=1.0;+#endif+vec4 Blob_Color_Q39;float k=dot(vUV,vUV);vec2 blobTextureCoord=vec2(vec2(sqrt(k),vTangent.x).x,1.0-vec2(sqrt(k),vTangent.x).y);vec4 blobColor=mix(vec4(1.0,1.0,1.0,1.0)*step(1.0-vTangent.x,clamp(sqrt(k)+0.1,0.0,1.0)),texture(_Blob_Texture_,blobTextureCoord),float(_Use_Blob_Texture_));Blob_Color_Q39=vTangent.y*blobColor*(1.0-clamp(k,0.0,1.0));float Is_Quad_Q24;Is_Quad_Q24=vNormal.z;vec3 Blob_Position_Q41= mix(_Blob_Position_,Global_Left_Index_Tip_Position.xyz,float(Use_Global_Left_Index));vec3 Blob_Position_Q42= mix(_Blob_Position_2_,Global_Right_Index_Tip_Position.xyz,float(Use_Global_Right_Index));float X_Q46;float Y_Q46;float Z_Q46;To_XYZ_B46(vBinormal,X_Q46,Y_Q46,Z_Q46);float Proximity_Q53;Proximity_B53(Blob_Position_Q41,Blob_Position_Q42,_Proximity_Max_Intensity_,_Proximity_Near_Radius_,vPosition,vBinormal,vExtra1,Y_Q46,Z_Q46,Proximity_Q53);vec4 Wireframe_Q59;Wireframe_Fragment_B59(vNormal,vUV,Proximity_Q53,_Edge_Color_,Wireframe_Q59);vec4 Wire_Or_Blob_Q23=mix(Wireframe_Q59,Blob_Color_Q39,Is_Quad_Q24);vec4 Result_Q22;Result_Q22=mix(Wire_Or_Blob_Q23,vec4(0.3,0.3,0.3,0.3),float(_Show_Frame_));vec4 Final_Color_Q37=NotEdge_Q35*Result_Q22;vec4 Out_Color=Final_Color_Q37;float Clip_Threshold=0.0;bool To_sRGB=false;gl_FragColor=Out_Color;}`;+br.ShadersStore[z4] || (br.ShadersStore[z4] = iF);+const D4 = "fluentButtonVertexShader", nF = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;attribute vec3 tangent;attribute vec4 color;uniform float _Edge_Width_;uniform vec4 _Edge_Color_;uniform float _Proximity_Max_Intensity_;uniform float _Proximity_Far_Distance_;uniform float _Proximity_Near_Radius_;uniform float _Proximity_Anisotropy_;uniform float _Selection_Fuzz_;uniform float _Selected_;uniform float _Selection_Fade_;uniform float _Selection_Fade_Size_;uniform float _Selected_Distance_;uniform float _Selected_Fade_Length_;uniform bool _Blob_Enable_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Inner_Fade_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform bool _Blob_Enable_2_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Inner_Fade_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Active_Face_Dir_;uniform vec3 _Active_Face_Up_;uniform bool _Enable_Fade_;uniform float _Fade_Width_;uniform bool _Smooth_Active_Face_;uniform bool _Show_Frame_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;void Blob_Vertex_B47(+vec3 Position,+vec3 Normal,+vec3 Tangent,+vec3 Bitangent,+vec3 Blob_Position,+float Intensity,+float Blob_Near_Size,+float Blob_Far_Size,+float Blob_Near_Distance,+float Blob_Far_Distance,+vec4 Vx_Color,+vec2 UV,+vec3 Face_Center,+vec2 Face_Size,+vec2 In_UV,+float Blob_Fade_Length,+float Selection_Fade,+float Selection_Fade_Size,+float Inner_Fade,+vec3 Active_Face_Center,+float Blob_Pulse,+float Blob_Fade,+float Blob_Enabled,+out vec3 Out_Position,+out vec2 Out_UV,+out vec3 Blob_Info)+{float blobSize,fadeIn;vec3 Hit_Position;Blob_Info=vec3(0.0,0.0,0.0);float Hit_Distance=dot(Blob_Position-Face_Center,Normal);Hit_Position=Blob_Position-Hit_Distance*Normal;float absD=abs(Hit_Distance);float lerpVal=clamp((absD-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);fadeIn=1.0-clamp((absD-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float innerFade=1.0-clamp(-Hit_Distance/Inner_Fade,0.0,1.0);float farClip=clamp(1.0-step(Blob_Far_Distance+Blob_Fade_Length,absD),0.0,1.0);float size=mix(Blob_Near_Size,Blob_Far_Size,lerpVal)*farClip;blobSize=mix(size,Selection_Fade_Size,Selection_Fade)*innerFade*Blob_Enabled;Blob_Info.x=lerpVal*0.5+0.5;Blob_Info.y=fadeIn*Intensity*(1.0-Selection_Fade)*Blob_Fade;Blob_Info.x*=(1.0-Blob_Pulse);vec3 delta=Hit_Position-Face_Center;vec2 blobCenterXY=vec2(dot(delta,Tangent),dot(delta,Bitangent));vec2 quadUVin=2.0*UV-1.0; +vec2 blobXY=blobCenterXY+quadUVin*blobSize;vec2 blobClipped=clamp(blobXY,-Face_Size*0.5,Face_Size*0.5);vec2 blobUV=(blobClipped-blobCenterXY)/max(blobSize,0.0001)*2.0;vec3 blobCorner=Face_Center+blobClipped.x*Tangent+blobClipped.y*Bitangent;Out_Position=mix(Position,blobCorner,Vx_Color.rrr);Out_UV=mix(In_UV,blobUV,Vx_Color.rr);}+vec2 ProjectProximity(+vec3 blobPosition,+vec3 position,+vec3 center,+vec3 dir,+vec3 xdir,+vec3 ydir,+out float vdistance+)+{vec3 delta=blobPosition-position;vec2 xy=vec2(dot(delta,xdir),dot(delta,ydir));vdistance=abs(dot(delta,dir));return xy;}+void Proximity_Vertex_B66(+vec3 Blob_Position,+vec3 Blob_Position_2,+vec3 Active_Face_Center,+vec3 Active_Face_Dir,+vec3 Position,+float Proximity_Far_Distance,+float Relative_Scale,+float Proximity_Anisotropy,+vec3 Up,+out vec4 Extra1,+out float Distance_To_Face,+out float Intensity)+{vec3 Active_Face_Dir_X=normalize(cross(Active_Face_Dir,Up));vec3 Active_Face_Dir_Y=cross(Active_Face_Dir,Active_Face_Dir_X);float distz1,distz2;Extra1.xy=ProjectProximity(Blob_Position,Position,Active_Face_Center,Active_Face_Dir,Active_Face_Dir_X*Proximity_Anisotropy,Active_Face_Dir_Y,distz1)/Relative_Scale;Extra1.zw=ProjectProximity(Blob_Position_2,Position,Active_Face_Center,Active_Face_Dir,Active_Face_Dir_X*Proximity_Anisotropy,Active_Face_Dir_Y,distz2)/Relative_Scale;Distance_To_Face=dot(Active_Face_Dir,Position-Active_Face_Center);Intensity=1.0-clamp(min(distz1,distz2)/Proximity_Far_Distance,0.0,1.0);}+void Holo_Edge_Vertex_B44(+vec3 Incident,+vec3 Normal,+vec2 UV,+vec3 Tangent,+vec3 Bitangent,+bool Smooth_Active_Face,+float Active,+out vec4 Holo_Edges)+{float NdotI=dot(Incident,Normal);vec2 flip=(UV-vec2(0.5,0.5));float udot=dot(Incident,Tangent)*flip.x*NdotI;float uval=1.0-float(udot>0.0);float vdot=-dot(Incident,Bitangent)*flip.y*NdotI;float vval=1.0-float(vdot>0.0);float Smooth_And_Active=step(1.0,float(Smooth_Active_Face && Active>0.0));uval=mix(uval,max(1.0,uval),Smooth_And_Active); +vval=mix(vval,max(1.0,vval),Smooth_And_Active);Holo_Edges=vec4(1.0,1.0,1.0,1.0)-vec4(uval*UV.x,uval*(1.0-UV.x),vval*UV.y,vval*(1.0-UV.y));}+void Object_To_World_Pos_B13(+vec3 Pos_Object,+out vec3 Pos_World)+{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}+void Choose_Blob_B38(+vec4 Vx_Color,+vec3 Position1,+vec3 Position2,+bool Blob_Enable_1,+bool Blob_Enable_2,+float Near_Size_1,+float Near_Size_2,+float Blob_Inner_Fade_1,+float Blob_Inner_Fade_2,+float Blob_Pulse_1,+float Blob_Pulse_2,+float Blob_Fade_1,+float Blob_Fade_2,+out vec3 Position,+out float Near_Size,+out float Inner_Fade,+out float Blob_Enable,+out float Fade,+out float Pulse)+{Position=Position1*(1.0-Vx_Color.g)+Vx_Color.g*Position2;float b1=float(Blob_Enable_1);float b2=float(Blob_Enable_2);Blob_Enable=b1+(b2-b1)*Vx_Color.g;Pulse=Blob_Pulse_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Pulse_2;Fade=Blob_Fade_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Fade_2;Near_Size=Near_Size_1*(1.0-Vx_Color.g)+Vx_Color.g*Near_Size_2;Inner_Fade=Blob_Inner_Fade_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Inner_Fade_2;}+void Wireframe_Vertex_B51(+vec3 Position,+vec3 Normal,+vec3 Tangent,+vec3 Bitangent,+float Edge_Width,+vec2 Face_Size,+out vec3 Wire_Vx_Pos,+out vec2 UV,+out vec2 Widths)+{Widths.xy=Edge_Width/Face_Size;float x=dot(Position,Tangent);float y=dot(Position,Bitangent);float dx=0.5-abs(x);float newx=(0.5-dx*Widths.x*2.0)*sign(x);float dy=0.5-abs(y);float newy=(0.5-dy*Widths.y*2.0)*sign(y);Wire_Vx_Pos=Normal*0.5+newx*Tangent+newy*Bitangent;UV.x=dot(Wire_Vx_Pos,Tangent)+0.5;UV.y=dot(Wire_Vx_Pos,Bitangent)+0.5;}+vec2 ramp2(vec2 start,vec2 end,vec2 x)+{return clamp((x-start)/(end-start),vec2(0.0,0.0),vec2(1.0,1.0));}+float computeSelection(+vec3 blobPosition,+vec3 normal,+vec3 tangent,+vec3 bitangent,+vec3 faceCenter,+vec2 faceSize,+float selectionFuzz,+float farDistance,+float fadeLength+)+{vec3 delta=blobPosition-faceCenter;float absD=abs(dot(delta,normal));float fadeIn=1.0-clamp((absD-farDistance)/fadeLength,0.0,1.0);vec2 blobCenterXY=vec2(dot(delta,tangent),dot(delta,bitangent));vec2 innerFace=faceSize*(1.0-selectionFuzz)*0.5;vec2 selectPulse=ramp2(-faceSize*0.5,-innerFace,blobCenterXY)-ramp2(innerFace,faceSize*0.5,blobCenterXY);return selectPulse.x*selectPulse.y*fadeIn;}+void Selection_Vertex_B48(+vec3 Blob_Position,+vec3 Blob_Position_2,+vec3 Face_Center,+vec2 Face_Size,+vec3 Normal,+vec3 Tangent,+vec3 Bitangent,+float Selection_Fuzz,+float Selected,+float Far_Distance,+float Fade_Length,+vec3 Active_Face_Dir,+out float Show_Selection)+{float select1=computeSelection(Blob_Position,Normal,Tangent,Bitangent,Face_Center,Face_Size,Selection_Fuzz,Far_Distance,Fade_Length);float select2=computeSelection(Blob_Position_2,Normal,Tangent,Bitangent,Face_Center,Face_Size,Selection_Fuzz,Far_Distance,Fade_Length);float Active=max(0.0,dot(Active_Face_Dir,Normal));Show_Selection=mix(max(select1,select2),1.0,Selected)*Active;}+void Proximity_Visibility_B54(+float Selection,+vec3 Proximity_Center,+vec3 Proximity_Center_2,+float Input_Width,+float Proximity_Far_Distance,+float Proximity_Radius,+vec3 Active_Face_Center,+vec3 Active_Face_Dir,+out float Width)+{vec3 boxEdges=(world*vec4(vec3(0.5,0.5,0.5),0.0)).xyz;float boxMaxSize=length(boxEdges);float d1=dot(Proximity_Center-Active_Face_Center,Active_Face_Dir);vec3 blob1=Proximity_Center-d1*Active_Face_Dir;float d2=dot(Proximity_Center_2-Active_Face_Center,Active_Face_Dir);vec3 blob2=Proximity_Center_2-d2*Active_Face_Dir;vec3 delta1=blob1-Active_Face_Center;vec3 delta2=blob2-Active_Face_Center;float dist1=dot(delta1,delta1);float dist2=dot(delta2,delta2);float nearestProxDist=sqrt(min(dist1,dist2));Width=Input_Width*(1.0-step(boxMaxSize+Proximity_Radius,nearestProxDist))*(1.0-step(Proximity_Far_Distance,min(d1,d2))*(1.0-step(0.0001,Selection)));}+void Object_To_World_Dir_B67(+vec3 Dir_Object,+out vec3 Dir_World)+{Dir_World=(world*vec4(Dir_Object,0.0)).xyz;}+void main()+{vec3 Active_Face_Center_Q49;Active_Face_Center_Q49=(world*vec4(_Active_Face_Dir_*0.5,1.0)).xyz;vec3 Blob_Position_Q41= mix(_Blob_Position_,Global_Left_Index_Tip_Position.xyz,float(Use_Global_Left_Index));vec3 Blob_Position_Q42= mix(_Blob_Position_2_,Global_Right_Index_Tip_Position.xyz,float(Use_Global_Right_Index));vec3 Active_Face_Dir_Q64=normalize((world*vec4(_Active_Face_Dir_,0.0)).xyz);float Relative_Scale_Q57;+#if RELATIVE_WIDTH+Relative_Scale_Q57=length((world*vec4(vec3(0,1,0),0.0)).xyz);+#else+Relative_Scale_Q57=1.0;+#endif+vec3 Tangent_World_Q30;Tangent_World_Q30=(world*vec4(tangent,0.0)).xyz;vec3 Binormal_World_Q31;Binormal_World_Q31=(world*vec4((cross(normal,tangent)),0.0)).xyz;vec3 Normal_World_Q60;Normal_World_Q60=(world*vec4(normal,0.0)).xyz;vec3 Result_Q18=0.5*normal;vec3 Dir_World_Q67;Object_To_World_Dir_B67(_Active_Face_Up_,Dir_World_Q67);float Product_Q56=_Edge_Width_*Relative_Scale_Q57;vec3 Normal_World_N_Q29=normalize(Normal_World_Q60);vec3 Tangent_World_N_Q28=normalize(Tangent_World_Q30);vec3 Binormal_World_N_Q32=normalize(Binormal_World_Q31);vec3 Position_Q38;float Near_Size_Q38;float Inner_Fade_Q38;float Blob_Enable_Q38;float Fade_Q38;float Pulse_Q38;Choose_Blob_B38(color,Blob_Position_Q41,Blob_Position_Q42,_Blob_Enable_,_Blob_Enable_2_,_Blob_Near_Size_,_Blob_Near_Size_2_,_Blob_Inner_Fade_,_Blob_Inner_Fade_2_,_Blob_Pulse_,_Blob_Pulse_2_,_Blob_Fade_,_Blob_Fade_2_,Position_Q38,Near_Size_Q38,Inner_Fade_Q38,Blob_Enable_Q38,Fade_Q38,Pulse_Q38);vec3 Face_Center_Q33;Face_Center_Q33=(world*vec4(Result_Q18,1.0)).xyz;vec2 Face_Size_Q50=vec2(length(Tangent_World_Q30),length(Binormal_World_Q31));float Show_Selection_Q48;Selection_Vertex_B48(Blob_Position_Q41,Blob_Position_Q42,Face_Center_Q33,Face_Size_Q50,Normal_World_N_Q29,Tangent_World_N_Q28,Binormal_World_N_Q32,_Selection_Fuzz_,_Selected_,_Selected_Distance_,_Selected_Fade_Length_,Active_Face_Dir_Q64,Show_Selection_Q48);vec3 Normalized_Q72=normalize(Dir_World_Q67);float Active_Q34=max(0.0,dot(Active_Face_Dir_Q64,Normal_World_N_Q29));float Width_Q54;Proximity_Visibility_B54(Show_Selection_Q48,Blob_Position_Q41,Blob_Position_Q42,Product_Q56,_Proximity_Far_Distance_,_Proximity_Near_Radius_,Active_Face_Center_Q49,Active_Face_Dir_Q64,Width_Q54);vec3 Wire_Vx_Pos_Q51;vec2 UV_Q51;vec2 Widths_Q51;Wireframe_Vertex_B51(position,normal,tangent,(cross(normal,tangent)),Width_Q54,Face_Size_Q50,Wire_Vx_Pos_Q51,UV_Q51,Widths_Q51);vec3 Vec3_Q27=vec3(Widths_Q51.x,Widths_Q51.y,color.r);vec3 Pos_World_Q13;Object_To_World_Pos_B13(Wire_Vx_Pos_Q51,Pos_World_Q13);vec3 Incident_Q36=normalize(Pos_World_Q13-cameraPosition);vec3 Out_Position_Q47;vec2 Out_UV_Q47;vec3 Blob_Info_Q47;Blob_Vertex_B47(Pos_World_Q13,Normal_World_N_Q29,Tangent_World_N_Q28,Binormal_World_N_Q32,Position_Q38,_Blob_Intensity_,Near_Size_Q38,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,color,uv,Face_Center_Q33,Face_Size_Q50,UV_Q51,_Blob_Fade_Length_,_Selection_Fade_,_Selection_Fade_Size_,Inner_Fade_Q38,Active_Face_Center_Q49,Pulse_Q38,Fade_Q38,Blob_Enable_Q38,Out_Position_Q47,Out_UV_Q47,Blob_Info_Q47);vec4 Extra1_Q66;float Distance_To_Face_Q66;float Intensity_Q66;Proximity_Vertex_B66(Blob_Position_Q41,Blob_Position_Q42,Active_Face_Center_Q49,Active_Face_Dir_Q64,Pos_World_Q13,_Proximity_Far_Distance_,Relative_Scale_Q57,_Proximity_Anisotropy_,Normalized_Q72,Extra1_Q66,Distance_To_Face_Q66,Intensity_Q66);vec4 Holo_Edges_Q44;Holo_Edge_Vertex_B44(Incident_Q36,Normal_World_N_Q29,uv,Tangent_World_Q30,Binormal_World_Q31,_Smooth_Active_Face_,Active_Q34,Holo_Edges_Q44);vec3 Vec3_Q19=vec3(Show_Selection_Q48,Distance_To_Face_Q66,Intensity_Q66);vec3 Position=Out_Position_Q47;vec2 UV=Out_UV_Q47;vec3 Tangent=Blob_Info_Q47;vec3 Binormal=Vec3_Q19;vec3 Normal=Vec3_Q27;vec4 Extra1=Extra1_Q66;vec4 Color=Holo_Edges_Q44;gl_Position=viewProjection*vec4(Position,1);vPosition=Position;vNormal=Normal;vUV=UV;vTangent=Tangent;vBinormal=Binormal;vColor=Color;vExtra1=Extra1;}`;+br.ShadersStore[D4] || (br.ShadersStore[D4] = nF);+class aF extends hc {+ constructor() {+ super(), this.RELATIVE_WIDTH = !0, this.ENABLE_FADE = !0, this._needNormals = !0, this._needUVs = !0, this.rebuild();+ }+}+class sr extends uc {+ constructor(i, d) {+ super(i, d), this.edgeWidth = 0.04, this.edgeColor = new Gr(0.592157, 0.592157, 0.592157, 1), this.proximityMaxIntensity = 0.45, this.proximityFarDistance = 0.16, this.proximityNearRadius = 1.5, this.proximityAnisotropy = 1, this.selectionFuzz = 0.5, this.selected = 0, this.selectionFade = 0, this.selectionFadeSize = 0.3, this.selectedDistance = 0.08, this.selectedFadeLength = 0.08, this.blobIntensity = 0.5, this.blobFarSize = 0.05, this.blobNearDistance = 0, this.blobFarDistance = 0.08, this.blobFadeLength = 0.08, this.leftBlobEnable = !0, this.leftBlobNearSize = 0.025, this.leftBlobPulse = 0, this.leftBlobFade = 1, this.leftBlobInnerFade = 0.01, this.rightBlobEnable = !0, this.rightBlobNearSize = 0.025, this.rightBlobPulse = 0, this.rightBlobFade = 1, this.rightBlobInnerFade = 0.01, this.activeFaceDir = new Se(0, 0, -1), this.activeFaceUp = new Se(0, 1, 0), this.enableFade = !0, this.fadeWidth = 1.5, this.smoothActiveFace = !0, this.showFrame = !1, this.useBlobTexture = !0, this.globalLeftIndexTipPosition = Se.Zero(), this.globalRightIndexTipPosition = Se.Zero(), this.alphaMode = Is.ALPHA_ADD, this.disableDepthWrite = !0, this.backFaceCulling = !1;+ const g = Lr.GetAssetUrl(sr.BLOB_TEXTURE_URL);+ this._blobTexture = new Wr(g, this.getScene(), !0, !1, Wr.NEAREST_SAMPLINGMODE);+ }+ needAlphaBlending() {+ return !0;+ }+ needAlphaTesting() {+ return !0;+ }+ getAlphaTestTexture() {+ return null;+ }+ // Methods+ isReadyForSubMesh(i, d) {+ const g = d._drawWrapper;+ if (this.isFrozen && g.effect && g._wasPreviouslyReady)+ return !0;+ d.materialDefines || (d.materialDefines = new aF());+ const y = d.materialDefines, M = this.getScene();+ if (!this._blobTexture.isReady())+ return !1;+ if (this._isReadyForSubMesh(d))+ return !0;+ const N = M.getEngine();+ if (vd(i, y, !0, !1), y.isDirty) {+ y.markAsProcessed(), M.resetCachedMaterial();+ const O = new _d();+ y.FOG && O.addFallback(1, "FOG"), wd(y, O), y.IMAGEPROCESSINGPOSTPROCESS = M.imageProcessingConfiguration.applyByPostProcess;+ const F = [Yt.PositionKind];+ y.NORMAL && F.push(Yt.NormalKind), y.UV1 && F.push(Yt.UVKind), y.UV2 && F.push(Yt.UV2Kind), y.VERTEXCOLOR && F.push(Yt.ColorKind), y.TANGENT && F.push(Yt.TangentKind), yd(F, y);+ const ne = "fluentButton", $ = y.toString(), Q = [+ "world",+ "viewProjection",+ "cameraPosition",+ "_Edge_Width_",+ "_Edge_Color_",+ "_Relative_Width_",+ "_Proximity_Max_Intensity_",+ "_Proximity_Far_Distance_",+ "_Proximity_Near_Radius_",+ "_Proximity_Anisotropy_",+ "_Selection_Fuzz_",+ "_Selected_",+ "_Selection_Fade_",+ "_Selection_Fade_Size_",+ "_Selected_Distance_",+ "_Selected_Fade_Length_",+ "_Blob_Enable_",+ "_Blob_Position_",+ "_Blob_Intensity_",+ "_Blob_Near_Size_",+ "_Blob_Far_Size_",+ "_Blob_Near_Distance_",+ "_Blob_Far_Distance_",+ "_Blob_Fade_Length_",+ "_Blob_Inner_Fade_",+ "_Blob_Pulse_",+ "_Blob_Fade_",+ "_Blob_Texture_",+ "_Blob_Enable_2_",+ "_Blob_Position_2_",+ "_Blob_Near_Size_2_",+ "_Blob_Inner_Fade_2_",+ "_Blob_Pulse_2_",+ "_Blob_Fade_2_",+ "_Active_Face_Dir_",+ "_Active_Face_Up_",+ "_Enable_Fade_",+ "_Fade_Width_",+ "_Smooth_Active_Face_",+ "_Show_Frame_",+ "_Use_Blob_Texture_",+ "Use_Global_Left_Index",+ "Use_Global_Right_Index",+ "Global_Left_Index_Tip_Position",+ "Global_Right_Index_Tip_Position",+ "Global_Left_Thumb_Tip_Position",+ "Global_Right_Thumb_Tip_Position",+ "Global_Left_Index_Tip_Proximity",+ "Global_Right_Index_Tip_Proximity"+ ], X = ["_Blob_Texture_"], he = [];+ fc({+ uniformsNames: Q,+ uniformBuffersNames: he,+ samplers: X,+ defines: y,+ maxSimultaneousLights: 4+ }), d.setEffect(M.getEngine().createEffect(ne, {+ attributes: F,+ uniformsNames: Q,+ uniformBuffersNames: he,+ samplers: X,+ defines: $,+ fallbacks: O,+ onCompiled: this.onCompiled,+ onError: this.onError,+ indexParameters: { maxSimultaneousLights: 4 }+ }, N), y, this._materialContext);+ }+ return !d.effect || !d.effect.isReady() ? !1 : (y._renderId = M.getRenderId(), g._wasPreviouslyReady = !0, !0);+ }+ bindForSubMesh(i, d, g) {+ const y = this.getScene();+ if (!g.materialDefines)+ return;+ const N = g.effect;+ N && (this._activeEffect = N, this.bindOnlyWorldMatrix(i), this._activeEffect.setMatrix("viewProjection", y.getTransformMatrix()), this._activeEffect.setVector3("cameraPosition", y.activeCamera.position), this._activeEffect.setTexture("_Blob_Texture_", this._blobTexture), this._activeEffect.setFloat("_Edge_Width_", this.edgeWidth), this._activeEffect.setColor4("_Edge_Color_", new nr(this.edgeColor.r, this.edgeColor.g, this.edgeColor.b), this.edgeColor.a), this._activeEffect.setFloat("_Proximity_Max_Intensity_", this.proximityMaxIntensity), this._activeEffect.setFloat("_Proximity_Far_Distance_", this.proximityFarDistance), this._activeEffect.setFloat("_Proximity_Near_Radius_", this.proximityNearRadius), this._activeEffect.setFloat("_Proximity_Anisotropy_", this.proximityAnisotropy), this._activeEffect.setFloat("_Selection_Fuzz_", this.selectionFuzz), this._activeEffect.setFloat("_Selected_", this.selected), this._activeEffect.setFloat("_Selection_Fade_", this.selectionFade), this._activeEffect.setFloat("_Selection_Fade_Size_", this.selectionFadeSize), this._activeEffect.setFloat("_Selected_Distance_", this.selectedDistance), this._activeEffect.setFloat("_Selected_Fade_Length_", this.selectedFadeLength), this._activeEffect.setFloat("_Blob_Enable_", this.leftBlobEnable ? 1 : 0), this._activeEffect.setFloat("_Blob_Intensity_", this.blobIntensity), this._activeEffect.setFloat("_Blob_Near_Size_", this.leftBlobNearSize), this._activeEffect.setFloat("_Blob_Far_Size_", this.blobFarSize), this._activeEffect.setFloat("_Blob_Near_Distance_", this.blobNearDistance), this._activeEffect.setFloat("_Blob_Far_Distance_", this.blobFarDistance), this._activeEffect.setFloat("_Blob_Fade_Length_", this.blobFadeLength), this._activeEffect.setFloat("_Blob_Inner_Fade_", this.leftBlobInnerFade), this._activeEffect.setFloat("_Blob_Pulse_", this.leftBlobPulse), this._activeEffect.setFloat("_Blob_Fade_", this.leftBlobFade), this._activeEffect.setFloat("_Blob_Enable_2_", this.rightBlobEnable ? 1 : 0), this._activeEffect.setFloat("_Blob_Near_Size_2_", this.rightBlobNearSize), this._activeEffect.setFloat("_Blob_Inner_Fade_2_", this.rightBlobInnerFade), this._activeEffect.setFloat("_Blob_Pulse_2_", this.rightBlobPulse), this._activeEffect.setFloat("_Blob_Fade_2_", this.rightBlobFade), this._activeEffect.setVector3("_Active_Face_Dir_", this.activeFaceDir), this._activeEffect.setVector3("_Active_Face_Up_", this.activeFaceUp), this._activeEffect.setFloat("_Fade_Width_", this.fadeWidth), this._activeEffect.setFloat("_Smooth_Active_Face_", this.smoothActiveFace ? 1 : 0), this._activeEffect.setFloat("_Show_Frame_", this.showFrame ? 1 : 0), this._activeEffect.setFloat("_Use_Blob_Texture_", this.useBlobTexture ? 1 : 0), this._activeEffect.setFloat("Use_Global_Left_Index", 1), this._activeEffect.setFloat("Use_Global_Right_Index", 1), this._activeEffect.setVector4("Global_Left_Index_Tip_Position", new fi(this.globalLeftIndexTipPosition.x, this.globalLeftIndexTipPosition.y, this.globalLeftIndexTipPosition.z, 1)), this._activeEffect.setVector4("Global_Right_Index_Tip_Position", new fi(this.globalRightIndexTipPosition.x, this.globalRightIndexTipPosition.y, this.globalRightIndexTipPosition.z, 1)), this._afterBind(d, this._activeEffect, g));+ }+ /**+ * Get the list of animatables in the material.+ * @returns the list of animatables object used in the material+ */+ getAnimatables() {+ return [];+ }+ dispose(i) {+ super.dispose(i);+ }+ clone(i) {+ return Eo.Clone(() => new sr(i, this.getScene()), this);+ }+ serialize() {+ const i = super.serialize();+ return i.customType = "BABYLON.FluentButtonMaterial", i;+ }+ getClassName() {+ return "FluentButtonMaterial";+ }+ // Statics+ static Parse(i, d, g) {+ return Eo.Parse(() => new sr(i.name, d), i, d, g);+ }+}+sr.BLOB_TEXTURE_URL = "https://assets.babylonjs.com/core/MRTK/mrtk-fluent-button-blob.png";+q([+ H()+], sr.prototype, "edgeWidth", void 0);+q([+ rS()+], sr.prototype, "edgeColor", void 0);+q([+ H()+], sr.prototype, "proximityMaxIntensity", void 0);+q([+ H()+], sr.prototype, "proximityFarDistance", void 0);+q([+ H()+], sr.prototype, "proximityNearRadius", void 0);+q([+ H()+], sr.prototype, "proximityAnisotropy", void 0);+q([+ H()+], sr.prototype, "selectionFuzz", void 0);+q([+ H()+], sr.prototype, "selected", void 0);+q([+ H()+], sr.prototype, "selectionFade", void 0);+q([+ H()+], sr.prototype, "selectionFadeSize", void 0);+q([+ H()+], sr.prototype, "selectedDistance", void 0);+q([+ H()+], sr.prototype, "selectedFadeLength", void 0);+q([+ H()+], sr.prototype, "blobIntensity", void 0);+q([+ H()+], sr.prototype, "blobFarSize", void 0);+q([+ H()+], sr.prototype, "blobNearDistance", void 0);+q([+ H()+], sr.prototype, "blobFarDistance", void 0);+q([+ H()+], sr.prototype, "blobFadeLength", void 0);+q([+ H()+], sr.prototype, "leftBlobEnable", void 0);+q([+ H()+], sr.prototype, "leftBlobNearSize", void 0);+q([+ H()+], sr.prototype, "leftBlobPulse", void 0);+q([+ H()+], sr.prototype, "leftBlobFade", void 0);+q([+ H()+], sr.prototype, "leftBlobInnerFade", void 0);+q([+ H()+], sr.prototype, "rightBlobEnable", void 0);+q([+ H()+], sr.prototype, "rightBlobNearSize", void 0);+q([+ H()+], sr.prototype, "rightBlobPulse", void 0);+q([+ H()+], sr.prototype, "rightBlobFade", void 0);+q([+ H()+], sr.prototype, "rightBlobInnerFade", void 0);+q([+ ku()+], sr.prototype, "activeFaceDir", void 0);+q([+ ku()+], sr.prototype, "activeFaceUp", void 0);+q([+ H()+], sr.prototype, "enableFade", void 0);+q([+ H()+], sr.prototype, "fadeWidth", void 0);+q([+ H()+], sr.prototype, "smoothActiveFace", void 0);+q([+ H()+], sr.prototype, "showFrame", void 0);+q([+ H()+], sr.prototype, "useBlobTexture", void 0);+q([+ ku()+], sr.prototype, "globalLeftIndexTipPosition", void 0);+q([+ ku()+], sr.prototype, "globalRightIndexTipPosition", void 0);+kr("BABYLON.GUI.FluentButtonMaterial", sr);+class Nb extends Bb {+ /**+ * Creates a new touchable button+ * @param name defines the control name+ * @param collisionMesh mesh to track collisions with+ */+ constructor(i, d) {+ super(i), this._isNearPressed = !1, this._interactionSurfaceHeight = 0, this._isToggleButton = !1, this._toggleState = !1, this._toggleButtonCallback = () => {+ this._onToggle(!this._toggleState);+ }, this.onToggleObservable = new qt(), this.collidableFrontDirection = Se.Zero(), d && (this.collisionMesh = d);+ }+ /**+ * Whether the current interaction is caused by near interaction or not+ */+ get isActiveNearInteraction() {+ return this._isNearPressed;+ }+ /**+ * Sets the front-facing direction of the button. Pass in Vector3.Zero to allow interactions from any direction+ * @param frontWorldDir the forward direction of the button+ */+ set collidableFrontDirection(i) {+ if (this._collidableFrontDirection = i.normalize(), this._collisionMesh) {+ const d = Jr.Matrix[0];+ d.copyFrom(this._collisionMesh.getWorldMatrix()), d.invert(), Se.TransformNormalToRef(this._collidableFrontDirection, d, this._collidableFrontDirection), this._collidableFrontDirection.normalize();+ }+ }+ /**+ * Returns the front-facing direction of the button, or Vector3.Zero if there is no 'front'+ */+ get collidableFrontDirection() {+ if (this._collisionMesh) {+ const i = Jr.Vector3[0];+ return Se.TransformNormalToRef(this._collidableFrontDirection, this._collisionMesh.getWorldMatrix(), i), i.normalize();+ }+ return this._collidableFrontDirection;+ }+ /**+ * Sets the mesh used for testing input collision+ * @param collisionMesh the new collision mesh for the button+ */+ set collisionMesh(i) {+ if (this._collisionMesh) {+ this._collisionMesh.isNearPickable = !1, this._collisionMesh.reservedDataStore?.GUI3D && (this._collisionMesh.reservedDataStore.GUI3D = {});+ const g = this._collisionMesh.getChildMeshes();+ for (const y of g)+ y.isNearPickable = !1, y.reservedDataStore?.GUI3D && (y.reservedDataStore.GUI3D = {});+ }+ this._collisionMesh = i, this._injectGUI3DReservedDataStore(this._collisionMesh).control = this, this._collisionMesh.isNearPickable = !0;+ const d = this._collisionMesh.getChildMeshes();+ for (const g of d)+ this._injectGUI3DReservedDataStore(g).control = this, g.isNearPickable = !0;+ this.collidableFrontDirection = i.forward;+ }+ /**+ * Setter for if this TouchButton3D should be treated as a toggle button+ * @param value If this TouchHolographicButton should act like a toggle button+ */+ set isToggleButton(i) {+ i !== this._isToggleButton && (this._isToggleButton = i, i ? this.onPointerUpObservable.add(this._toggleButtonCallback) : (this.onPointerUpObservable.removeCallback(this._toggleButtonCallback), this._toggleState && this._onToggle(!1)));+ }+ get isToggleButton() {+ return this._isToggleButton;+ }+ /**+ * A public entrypoint to set the toggle state of the TouchHolographicButton. Only works if 'isToggleButton' is true+ * @param newState The new state to set the TouchHolographicButton's toggle state to+ */+ set isToggled(i) {+ this._isToggleButton && this._toggleState !== i && this._onToggle(i);+ }+ get isToggled() {+ return this._toggleState;+ }+ _onToggle(i) {+ this._toggleState = i, this.onToggleObservable.notifyObservers(i);+ }+ // Returns true if the collidable is in front of the button, or if the button has no front direction+ _isInteractionInFrontOfButton(i) {+ return this._getInteractionHeight(i, this._collisionMesh.getAbsolutePosition()) > 0;+ }+ /**+ * Get the height of the touchPoint from the collidable part of the button+ * @param touchPoint the point to compare to the button, in absolute position+ * @returns the depth of the touch point into the front of the button+ */+ getPressDepth(i) {+ if (!this._isNearPressed)+ return 0;+ const d = this._getInteractionHeight(i, this._collisionMesh.getAbsolutePosition());+ return this._interactionSurfaceHeight - d;+ }+ // Returns true if the collidable is in front of the button, or if the button has no front direction+ _getInteractionHeight(i, d) {+ const g = this.collidableFrontDirection;+ if (g.length() === 0)+ return Se.Distance(i, d);+ const y = Se.Dot(d, g);+ return Se.Dot(i, g) - y;+ }+ /**+ * @internal+ */+ _generatePointerEventType(i, d, g) {+ if (i === Ir.POINTERDOWN || i === Ir.POINTERMOVE)+ if (this._isInteractionInFrontOfButton(d))+ this._isNearPressed = !0, this._interactionSurfaceHeight = this._getInteractionHeight(d, this._collisionMesh.getAbsolutePosition());+ else+ return Ir.POINTERMOVE;+ if (i === Ir.POINTERUP) {+ if (g == 0)+ return Ir.POINTERMOVE;+ this._isNearPressed = !1;+ }+ return i;+ }+ _getTypeName() {+ return "TouchButton3D";+ }+ // Mesh association+ _createNode(i) {+ return super._createNode(i);+ }+ /**+ * Releases all associated resources+ */+ dispose() {+ super.dispose(), this.onPointerUpObservable.removeCallback(this._toggleButtonCallback), this.onToggleObservable.clear(), this._collisionMesh && this._collisionMesh.dispose();+ }+}+let Th = class aw extends Nb {+ _disposeTooltip() {+ this._tooltipFade = null, this._tooltipTextBlock && this._tooltipTextBlock.dispose(), this._tooltipTexture && this._tooltipTexture.dispose(), this._tooltipMesh && this._tooltipMesh.dispose(), this.onPointerEnterObservable.remove(this._tooltipHoverObserver), this.onPointerOutObservable.remove(this._tooltipOutObserver);+ }+ /**+ * Rendering ground id of all the mesh in the button+ */+ set renderingGroupId(i) {+ this._backPlate.renderingGroupId = i, this._textPlate.renderingGroupId = i, this._frontPlate.renderingGroupId = i, this._tooltipMesh && (this._tooltipMesh.renderingGroupId = i);+ }+ get renderingGroupId() {+ return this._backPlate.renderingGroupId;+ }+ /**+ * Gets the mesh used to render this control+ */+ get mesh() {+ return this._backPlate;+ }+ /**+ * Text to be displayed on the tooltip shown when hovering on the button. When set to null tooltip is disabled. (Default: null)+ */+ set tooltipText(i) {+ if (!i) {+ this._disposeTooltip();+ return;+ }+ if (!this._tooltipFade) {+ const d = this._backPlate._scene.useRightHandedSystem;+ this._tooltipMesh = sl("", { size: 1 }, this._backPlate._scene);+ const g = sl("", { size: 1, sideOrientation: Mb.DOUBLESIDE }, this._backPlate._scene), y = new xu("", this._backPlate._scene);+ y.diffuseColor = nr.FromHexString("#212121"), g.material = y, g.isPickable = !1, this._tooltipMesh.addChild(g), g.position = Se.Forward(d).scale(0.05), this._tooltipMesh.scaling.y = 1 / 3, this._tooltipMesh.position = Se.Up().scale(0.7).add(Se.Forward(d).scale(-0.15)), this._tooltipMesh.isPickable = !1, this._tooltipMesh.parent = this._backPlate, this._tooltipTexture = go.CreateForMesh(this._tooltipMesh), this._tooltipTextBlock = new zr(), this._tooltipTextBlock.scaleY = 3, this._tooltipTextBlock.color = "white", this._tooltipTextBlock.fontSize = 130, this._tooltipTexture.addControl(this._tooltipTextBlock), this._tooltipFade = new lw(), this._tooltipFade.delay = 500, this._tooltipMesh.addBehavior(this._tooltipFade), this._tooltipHoverObserver = this.onPointerEnterObservable.add(() => {+ this._tooltipFade && this._tooltipFade.fadeIn(!0);+ }), this._tooltipOutObserver = this.onPointerOutObservable.add(() => {+ this._tooltipFade && this._tooltipFade.fadeIn(!1);+ });+ }+ this._tooltipTextBlock && (this._tooltipTextBlock.text = i);+ }+ get tooltipText() {+ return this._tooltipTextBlock ? this._tooltipTextBlock.text : null;+ }+ /**+ * Gets or sets text for the button+ */+ get text() {+ return this._text;+ }+ set text(i) {+ this._text !== i && (this._text = i, this._rebuildContent());+ }+ /**+ * Gets or sets the image url for the button+ */+ get imageUrl() {+ return this._imageUrl;+ }+ set imageUrl(i) {+ this._imageUrl !== i && (this._imageUrl = i, this._rebuildContent());+ }+ /**+ * Gets the back material used by this button+ */+ get backMaterial() {+ return this._backMaterial;+ }+ /**+ * Gets the front material used by this button+ */+ get frontMaterial() {+ return this._frontMaterial;+ }+ /**+ * Gets the plate material used by this button+ */+ get plateMaterial() {+ return this._plateMaterial;+ }+ /**+ * Gets a boolean indicating if this button shares its material with other HolographicButtons+ */+ get shareMaterials() {+ return this._shareMaterials;+ }+ /**+ * Sets whether the backplate is visible or hidden. Hiding the backplate is not recommended without some sort of replacement+ */+ set isBackplateVisible(i) {+ this.mesh && this._backMaterial && (i && !this._isBackplateVisible ? this._backPlate.visibility = 1 : !i && this._isBackplateVisible && (this._backPlate.visibility = 0)), this._isBackplateVisible = i;+ }+ /**+ * Creates a new button+ * @param name defines the control name+ * @param shareMaterials+ */+ constructor(i, d = !0) {+ super(i), this._shareMaterials = !0, this._isBackplateVisible = !0, this._frontPlateDepth = 0.5, this._backPlateDepth = 0.04, this._backplateColor = new nr(0.08, 0.15, 0.55), this._backplateToggledColor = new nr(0.25, 0.4, 0.95), this._shareMaterials = d, this.pointerEnterAnimation = () => {+ this._frontMaterial.leftBlobEnable = !0, this._frontMaterial.rightBlobEnable = !0;+ }, this.pointerOutAnimation = () => {+ this._frontMaterial.leftBlobEnable = !1, this._frontMaterial.rightBlobEnable = !1;+ }, this.pointerDownAnimation = () => {+ this._frontPlate && !this.isActiveNearInteraction && (this._frontPlate.scaling.z = this._frontPlateDepth * 0.2, this._frontPlate.position = Se.Forward(this._frontPlate._scene.useRightHandedSystem).scale((this._frontPlateDepth - 0.2 * this._frontPlateDepth) / 2), this._textPlate.position = Se.Forward(this._textPlate._scene.useRightHandedSystem).scale(-(this._backPlateDepth + 0.2 * this._frontPlateDepth) / 2));+ }, this.pointerUpAnimation = () => {+ this._frontPlate && (this._frontPlate.scaling.z = this._frontPlateDepth, this._frontPlate.position = Se.Forward(this._frontPlate._scene.useRightHandedSystem).scale((this._frontPlateDepth - this._frontPlateDepth) / 2), this._textPlate.position = Se.Forward(this._textPlate._scene.useRightHandedSystem).scale(-(this._backPlateDepth + this._frontPlateDepth) / 2));+ }, this.onPointerMoveObservable.add((g) => {+ if (this._frontPlate && this.isActiveNearInteraction) {+ const y = Se.Zero();+ if (this._backPlate.getWorldMatrix().decompose(y, void 0, void 0)) {+ let M = this._getInteractionHeight(g, this._backPlate.getAbsolutePosition()) / y.z;+ M = ow.Clamp(M - this._backPlateDepth / 2, 0.2 * this._frontPlateDepth, this._frontPlateDepth), this._frontPlate.scaling.z = M, this._frontPlate.position = Se.Forward(this._frontPlate._scene.useRightHandedSystem).scale((this._frontPlateDepth - M) / 2), this._textPlate.position = Se.Forward(this._textPlate._scene.useRightHandedSystem).scale(-(this._backPlateDepth + M) / 2);+ }+ }+ }), this._pointerHoverObserver = this.onPointerMoveObservable.add((g) => {+ this._frontMaterial.globalLeftIndexTipPosition = g;+ });+ }+ _getTypeName() {+ return "TouchHolographicButton";+ }+ _rebuildContent() {+ this._disposeFacadeTexture();+ const i = new Gi();+ if (i.isVertical = !0, xb() && document.createElement && this._imageUrl) {+ const d = new Ft();+ d.source = this._imageUrl, d.paddingTop = "40px", d.height = "180px", d.width = "100px", d.paddingBottom = "40px", i.addControl(d);+ }+ if (this._text) {+ const d = new zr();+ d.text = this._text, d.color = "white", d.height = "30px", d.fontSize = 24, i.addControl(d);+ }+ this.content = i;+ }+ // Mesh association+ _createNode(i) {+ this.name = this.name ?? "TouchHolographicButton";+ const d = Wi(`${this.name}_collisionMesh`, {+ width: 1,+ height: 1,+ depth: this._frontPlateDepth+ }, i);+ d.isPickable = !0, d.isNearPickable = !0, d.visibility = 0, d.position = Se.Forward(i.useRightHandedSystem).scale(-this._frontPlateDepth / 2);+ const g = Lr.GetAssetUrl(aw.MODEL_BASE_URL);+ yu.ImportMeshAsync(void 0, g, aw.MODEL_FILENAME, i).then((M) => {+ const N = Wi(`${this.name}_alphaMesh`, {+ width: 1,+ height: 1,+ depth: 1+ }, i);+ N.isPickable = !1, N.material = new xu(`${this.name}_alphaMesh_material`, i), N.material.alpha = 0.15;+ const O = M.meshes[1];+ O.name = `${this.name}_frontPlate`, O.isPickable = !1, O.scaling.z = this._frontPlateDepth, N.parent = O, O.parent = d, this._frontMaterial && (O.material = this._frontMaterial), this._frontPlate = O;+ }), this._backPlate = Wi(`${this.name}_backPlate`, {+ width: 1,+ height: 1,+ depth: this._backPlateDepth+ }, i), this._backPlate.position = Se.Forward(i.useRightHandedSystem).scale(this._backPlateDepth / 2), this._backPlate.isPickable = !1, this._textPlate = super._createNode(i), this._textPlate.name = `${this.name}_textPlate`, this._textPlate.isPickable = !1, this._textPlate.position = Se.Forward(i.useRightHandedSystem).scale(-this._frontPlateDepth / 2), this._backPlate.addChild(d), this._backPlate.addChild(this._textPlate);+ const y = new Mu(`${this.name}_root`, i);+ return this._backPlate.setParent(y), this.collisionMesh = d, this.collidableFrontDirection = this._backPlate.forward.negate(), y;+ }+ _applyFacade(i) {+ this._plateMaterial.emissiveTexture = i, this._plateMaterial.opacityTexture = i, this._plateMaterial.diffuseColor = new nr(0.4, 0.4, 0.4);+ }+ _createBackMaterial(i) {+ this._backMaterial = new $o(this.name + "backPlateMaterial", i.getScene()), this._backMaterial.albedoColor = this._backplateColor, this._backMaterial.renderBorders = !0, this._backMaterial.renderHoverLight = !1;+ }+ _createFrontMaterial(i) {+ this._frontMaterial = new sr(this.name + "Front Material", i.getScene());+ }+ _createPlateMaterial(i) {+ this._plateMaterial = new xu(this.name + "Plate Material", i.getScene()), this._plateMaterial.specularColor = nr.Black();+ }+ _onToggle(i) {+ this._backMaterial && (i ? this._backMaterial.albedoColor = this._backplateToggledColor : this._backMaterial.albedoColor = this._backplateColor), super._onToggle(i);+ }+ _affectMaterial(i) {+ this._shareMaterials ? (this._host._touchSharedMaterials.backFluentMaterial ? this._backMaterial = this._host._touchSharedMaterials.backFluentMaterial : (this._createBackMaterial(i), this._host._touchSharedMaterials.backFluentMaterial = this._backMaterial), this._host._touchSharedMaterials.frontFluentMaterial ? this._frontMaterial = this._host._touchSharedMaterials.frontFluentMaterial : (this._createFrontMaterial(i), this._host._touchSharedMaterials.frontFluentMaterial = this._frontMaterial)) : (this._createBackMaterial(i), this._createFrontMaterial(i)), this._createPlateMaterial(i), this._backPlate.material = this._backMaterial, this._textPlate.material = this._plateMaterial, this._isBackplateVisible || (this._backPlate.visibility = 0), this._frontPlate && (this._frontPlate.material = this._frontMaterial), this._rebuildContent();+ }+ /**+ * Releases all associated resources+ */+ dispose() {+ super.dispose(), this._disposeTooltip(), this.onPointerMoveObservable.remove(this._pointerHoverObserver), this.shareMaterials || (this._backMaterial.dispose(), this._frontMaterial.dispose(), this._plateMaterial.dispose(), this._pickedPointObserver && (this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver), this._pickedPointObserver = null));+ }+};+Th.MODEL_BASE_URL = "https://assets.babylonjs.com/core/MRTK/";+Th.MODEL_FILENAME = "mrtk-fluent-button.glb";+class mS {+ /**+ * Instantiates the default behavior+ */+ constructor() {+ this.followBehaviorEnabled = !1, this.sixDofDragBehaviorEnabled = !0, this.surfaceMagnetismBehaviorEnabled = !0, this._followBehavior = new N9(), this._sixDofDragBehavior = new I9(), this._surfaceMagnetismBehavior = new z9();+ }+ /**+ * The name of the behavior+ */+ get name() {+ return "Default";+ }+ /**+ * The follow behavior+ */+ get followBehavior() {+ return this._followBehavior;+ }+ /**+ * The six DoF drag behavior+ */+ get sixDofDragBehavior() {+ return this._sixDofDragBehavior;+ }+ /**+ * The surface magnetism behavior+ */+ get surfaceMagnetismBehavior() {+ return this._surfaceMagnetismBehavior;+ }+ /**+ * Initializes the behavior+ */+ init() {+ }+ /**+ * Attaches the default behavior+ * @param ownerMesh The top level mesh+ * @param draggablesMeshes Descendant meshes that can be used for dragging the owner mesh+ * @param sceneUnderstandingMeshes Meshes from the scene understanding that will be used for surface magnetism+ */+ attach(i, d, g) {+ this._scene = i.getScene(), this.attachedNode = i, this._addObservables(), this._followBehavior.attach(i), this._sixDofDragBehavior.attach(i), this._sixDofDragBehavior.draggableMeshes = d || null, this._sixDofDragBehavior.faceCameraOnDragStart = !0, this._surfaceMagnetismBehavior.attach(i, this._scene), g && (this._surfaceMagnetismBehavior.meshes = g), this._surfaceMagnetismBehavior.enabled = !1;+ }+ /**+ * Detaches the behavior from the mesh+ */+ detach() {+ this.attachedNode = null, this._removeObservables(), this._followBehavior.detach(), this._sixDofDragBehavior.detach(), this._surfaceMagnetismBehavior.detach();+ }+ _addObservables() {+ this._onBeforeRenderObserver = this._scene.onBeforeRenderObservable.add(() => {+ this._followBehavior._enabled = !this._sixDofDragBehavior.isMoving && this.followBehaviorEnabled;+ }), this._onDragObserver = this._sixDofDragBehavior.onDragObservable.add((i) => {+ this._sixDofDragBehavior.disableMovement = this._surfaceMagnetismBehavior.findAndUpdateTarget(i.pickInfo);+ });+ }+ _removeObservables() {+ this._scene.onBeforeRenderObservable.remove(this._onBeforeRenderObserver), this._sixDofDragBehavior.onDragObservable.remove(this._onDragObserver);+ }+}+const T4 = "handleVertexShader", sF = "precision highp float;attribute vec3 position;uniform vec3 positionOffset;uniform mat4 worldViewProjection;uniform float scale;void main(void) {vec4 vPos=vec4((vec3(position)+positionOffset)*scale,1.0);gl_Position=worldViewProjection*vPos;}";+br.ShadersStore[T4] || (br.ShadersStore[T4] = sF);+const E4 = "handlePixelShader", lF = "uniform vec3 color;void main(void) {gl_FragColor=vec4(color,1.0);}";+br.ShadersStore[E4] || (br.ShadersStore[E4] = lF);+class bS extends D9 {+ /**+ * Is the material indicating hovering state+ */+ get hover() {+ return this._hover;+ }+ set hover(i) {+ this._hover = i, this._updateInterpolationTarget();+ }+ /**+ * Is the material indicating drag state+ */+ get drag() {+ return this._drag;+ }+ set drag(i) {+ this._drag = i, this._updateInterpolationTarget();+ }+ /**+ * Creates a handle material+ * @param name Name of the material+ * @param scene Scene+ */+ constructor(i, d) {+ super(i, d, "handle", {+ attributes: ["position"],+ uniforms: ["worldViewProjection", "color", "scale", "positionOffset"],+ needAlphaBlending: !1,+ needAlphaTesting: !1+ }), this._hover = !1, this._drag = !1, this._color = new nr(), this._scale = 1, this._lastTick = -1, this.animationLength = 100, this.hoverColor = new nr(0, 0.467, 0.84), this.baseColor = new nr(1, 1, 1), this.hoverScale = 0.75, this.baseScale = 0.35, this.dragScale = 0.55, this._positionOffset = Se.Zero(), this._updateInterpolationTarget(), this._lastTick = Date.now(), this._onBeforeRender = this.getScene().onBeforeRenderObservable.add(() => {+ const g = Date.now(), y = g - this._lastTick, M = this._targetScale - this._scale, N = M4.Color3[0].copyFrom(this._targetColor).subtractToRef(this._color, M4.Color3[0]);+ this._scale = this._scale + M * y / this.animationLength, N.scaleToRef(y / this.animationLength, N), this._color.addToRef(N, this._color), this.setColor3("color", this._color), this.setFloat("scale", this._scale), this.setVector3("positionOffset", this._positionOffset), this._lastTick = g;+ });+ }+ _updateInterpolationTarget() {+ this.drag ? (this._targetColor = this.hoverColor, this._targetScale = this.dragScale) : this.hover ? (this._targetColor = this.hoverColor, this._targetScale = this.hoverScale) : (this._targetColor = this.baseColor, this._targetScale = this.baseScale);+ }+ /**+ * Disposes the handle material+ */+ dispose() {+ super.dispose(), this.getScene().onBeforeRenderObservable.remove(this._onBeforeRender);+ }+}+var sw;+(function($e) {+ $e[$e.IDLE = 0] = "IDLE", $e[$e.HOVER = 1] = "HOVER", $e[$e.DRAG = 2] = "DRAG";+})(sw || (sw = {}));+class fw {+ /**+ * The current state of the handle+ */+ get state() {+ return this._state;+ }+ /**+ * Returns the gizmo carrying this handle+ */+ get gizmo() {+ return this._gizmo;+ }+ /**+ * Sets hover state+ */+ set hover(i) {+ i ? this._state |= 1 : this._state &= -2, this._updateMaterial();+ }+ /**+ * Sets drag state+ */+ set drag(i) {+ i ? this._state |= 2 : this._state &= -3, this._updateMaterial();+ }+ /**+ * Creates a handle for a SlateGizmo+ * @param gizmo associated SlateGizmo+ * @param scene scene+ */+ constructor(i, d) {+ this._state = 0, this._materials = [], this._scene = d, this._gizmo = i, this.node = this.createNode(), this.node.reservedDataStore = {+ handle: this+ };+ }+ _createMaterial(i) {+ const d = new bS("handle", this._scene);+ return i && (d._positionOffset = i), d;+ }+ _updateMaterial() {+ const i = this._state;+ for (const d of this._materials)+ d.hover = !1, d.drag = !1;+ if (i & 2)+ for (const d of this._materials)+ d.drag = !0;+ else if (i & 1)+ for (const d of this._materials)+ d.hover = !0;+ }+ /**+ * Binds callbacks from dragging interaction+ * @param dragStartFn Function to call on drag start+ * @param dragFn Function to call on drag+ * @param dragEndFn Function to call on drag end+ */+ setDragBehavior(i, d, g) {+ const y = new T9();+ this._dragBehavior = y, this._dragStartObserver = y.onDragStartObservable.add(i), this._draggingObserver = y.onDragObservable.add(d), this._dragEndObserver = y.onDragEndObservable.add(g), this._dragBehavior.attach(this.node);+ }+ /**+ * Disposes the handle+ */+ dispose() {+ this._dragBehavior.onDragStartObservable.remove(this._dragStartObserver), this._dragBehavior.onDragObservable.remove(this._draggingObserver), this._dragBehavior.onDragEndObservable.remove(this._dragEndObserver), this._dragBehavior.detach();+ for (const i of this._materials)+ i.dispose();+ this.node.dispose();+ }+}+class vS extends fw {+ /**+ * Creates the meshes and parent node of the handle+ * @returns created node+ */+ createNode() {+ const i = Wi("sideVert", { width: 1, height: 10, depth: 0.1 }, this._scene), d = new Mu("side", this._scene);+ i.parent = d;+ const g = this._createMaterial();+ return i.material = g, i.isNearGrabbable = !0, this._materials.push(g), d;+ }+}+class _S extends fw {+ /**+ * Creates the meshes and parent node of the handle+ * @returns created node+ */+ createNode() {+ const i = Wi("angleHor", { width: 3, height: 1, depth: 0.1 }, this._scene), d = Wi("angleVert", { width: 1, height: 3, depth: 0.1 }, this._scene), g = new Mu("angle", this._scene);+ return i.parent = g, d.parent = g, i.material = this._createMaterial(new Se(1, 0, 0)), d.material = this._createMaterial(new Se(0, 1, 0)), d.isNearGrabbable = !0, i.isNearGrabbable = !0, this._materials.push(i.material), this._materials.push(d.material), g;+ }+}+class wS extends E9 {+ /**+ * The slate attached to this gizmo+ */+ set attachedSlate(i) {+ i ? (this.attachedMesh = i.mesh, this.updateBoundingBox(), this._pickedPointObserver = i._host.onPickingObservable.add((d) => {+ if (this._handleHovered && (!d || d.parent !== this._handleHovered.node) && (this._handleHovered.hover = !1, this._handleHovered = null), d && d.parent && d.parent.reservedDataStore && d.parent.reservedDataStore.handle) {+ const g = d.parent.reservedDataStore.handle;+ g.gizmo === this && (this._handleHovered = g, this._handleHovered.hover = !0);+ }+ })) : this._attachedSlate && this._attachedSlate._host.onPickingObservable.remove(this._pickedPointObserver), this._attachedSlate = i;+ }+ get attachedSlate() {+ return this._attachedSlate;+ }+ constructor(i) {+ super(i), this._boundingDimensions = new Se(0, 0, 0), this._renderObserver = null, this._tmpQuaternion = new wu(), this._tmpVector = new Se(0, 0, 0), this._corners = [], this._sides = [], this._boundingBoxGizmo = {+ min: new Se(),+ max: new Se()+ }, this._margin = 0.35, this._handleSize = 0.075, this._attachedSlate = null, this._existingSlateScale = new Se(), this.fixedScreenSize = !1, this.fixedScreenSizeDistanceFactor = 10, this._createNode(), this.updateScale = !1, this._renderObserver = this.gizmoLayer.originalScene.onBeforeRenderObservable.add(() => {+ this.attachedMesh && !this._existingSlateScale.equals(this.attachedMesh.scaling) && this.updateBoundingBox();+ });+ }+ _createNode() {+ this._handlesParent = new Mu("handlesParent", this.gizmoLayer.utilityLayerScene), this._handlesParent.rotationQuaternion = wu.Identity();+ const i = [+ {+ dimensions: new Se(-1, -1, 0),+ origin: new Se(1, 0, 0)+ },+ {+ dimensions: new Se(1, -1, 0),+ origin: new Se(0, 0, 0)+ },+ {+ dimensions: new Se(1, 1, 0),+ origin: new Se(0, 1, 0)+ },+ {+ dimensions: new Se(-1, 1, 0),+ origin: new Se(1, 1, 0)+ }+ ];+ for (let d = 0; d < 4; d++) {+ const g = new _S(this, this.gizmoLayer.utilityLayerScene);+ this._corners.push(g), g.node.rotation.z = Math.PI / 2 * d, g.node.parent = this._handlesParent, this._assignDragBehaviorCorners(g, (y, M, N, O) => this._moveHandle(y, M, N, O, !0), i[d]);+ }+ for (let d = 0; d < 4; d++) {+ const g = new vS(this, this.gizmoLayer.utilityLayerScene);+ this._sides.push(g), g.node.rotation.z = Math.PI / 2 * d, g.node.parent = this._handlesParent, this._assignDragBehaviorSides(g, d % 2 === 0 ? new Se(0, 1, 0) : new Se(1, 0, 0));+ }+ this._handlesParent.parent = this._rootMesh;+ }+ _keepAspectRatio(i, d, g = !1) {+ const y = Jr.Vector3[0];+ y.copyFromFloats(d, 1, 0).normalize(), g && (y.y *= -1);+ const M = Se.Dot(i, y);+ i.copyFrom(y).scaleInPlace(M);+ }+ _clampDimensions(i, d, g, y = !1) {+ const M = Jr.Vector3[0];+ M.copyFrom(i).multiplyInPlace(g);+ const N = Jr.Vector3[1];+ if (N.copyFromFloats(Math.max(this._attachedSlate.minDimensions.x, M.x + d.x), Math.max(this._attachedSlate.minDimensions.y, M.y + d.y), 0), y) {+ const O = d.x / d.y;+ N.x = Math.max(N.x, N.y * O), N.y = Math.max(N.y, N.x / O);+ }+ M.copyFrom(N).subtractInPlace(d), i.x = Math.sign(i.x) * Math.abs(M.x), i.y = Math.sign(i.y) * Math.abs(M.y);+ }+ _moveHandle(i, d, g, y, M) {+ if (!this._attachedSlate)+ return;+ if (M) {+ const F = d.x / d.y;+ this._keepAspectRatio(g, F, y.dimensions.x * y.dimensions.y < 0);+ }+ this._clampDimensions(g, d, y.dimensions, M);+ const N = Jr.Vector3[0], O = Jr.Vector3[1];+ N.copyFrom(g).multiplyInPlace(y.origin), O.copyFrom(g).multiplyInPlace(y.dimensions), this._attachedSlate.origin.copyFrom(i).addInPlace(N), this._attachedSlate.dimensions.set(d.x + O.x, d.y + O.y);+ }+ _assignDragBehaviorCorners(i, d, g) {+ const y = new Se(), M = new Se(), N = new Se(), O = new Oh(), F = new Se(), ne = (he, Me, p, De) => {+ he.subtractToRef(p, Jr.Vector3[0]);+ const Ke = Se.Dot(Jr.Vector3[0], Me);+ Jr.Vector3[1].copyFrom(Me).scaleInPlace(Ke), Jr.Vector3[0].subtractInPlace(Jr.Vector3[1]), Jr.Vector3[0].addToRef(p, De);+ }, $ = (he) => {+ this.attachedSlate && this.attachedMesh && (y.set(this.attachedSlate.dimensions.x, this.attachedSlate.dimensions.y, hn), M.copyFrom(this.attachedSlate.origin), N.copyFrom(he.position), O.copyFrom(this.attachedMesh.computeWorldMatrix(!0)), O.invert(), this.attachedSlate._followButton.isToggled = !1, Se.TransformNormalToRef(Se.Forward(), this.attachedMesh.getWorldMatrix(), F), F.normalize(), this._handleHovered && (this._handleDragged = this._handleHovered, this._handleDragged.drag = !0));+ }, Q = (he) => {+ this.attachedSlate && this.attachedMesh && (ne(he.position, F, N, this._tmpVector), this._tmpVector.subtractInPlace(N), Se.TransformNormalToRef(this._tmpVector, O, this._tmpVector), d(M, y, this._tmpVector, g), this.attachedSlate._positionElements(), this.updateBoundingBox());+ }, X = () => {+ this.attachedSlate && this.attachedNode && (this.attachedSlate._updatePivot(), this._handleDragged && (this._handleDragged.drag = !1, this._handleDragged = null));+ };+ i.setDragBehavior($, Q, X);+ }+ _assignDragBehaviorSides(i, d) {+ const g = new wu(), y = new Se(), M = new Se(), N = new Se(), O = new Se(), F = (Q) => {+ this.attachedSlate && this.attachedMesh && (g.copyFrom(this.attachedMesh.rotationQuaternion), y.copyFrom(Q.position), N.copyFrom(this.attachedMesh.getAbsolutePivotPoint()), M.copyFrom(y).subtractInPlace(N).normalize(), this.attachedSlate._followButton.isToggled = !1, Se.TransformNormalToRef(d, this.attachedMesh.getWorldMatrix(), O), O.normalize(), this._handleHovered && (this._handleDragged = this._handleHovered, this._handleDragged.drag = !0));+ }, ne = (Q) => {+ if (this.attachedSlate && this.attachedMesh) {+ this._tmpVector.copyFrom(Q.position), this._tmpVector.subtractInPlace(N), this._tmpVector.normalize();+ const X = -Se.GetAngleBetweenVectorsOnPlane(this._tmpVector, M, O);+ wu.RotationAxisToRef(d, X, this._tmpQuaternion), g.multiplyToRef(this._tmpQuaternion, this.attachedMesh.rotationQuaternion);+ }+ }, $ = () => {+ this.attachedSlate && this.attachedNode && (this.attachedSlate._updatePivot(), this._handleDragged && (this._handleDragged.drag = !1, this._handleDragged = null));+ };+ i.setDragBehavior(F, ne, $);+ }+ _attachedNodeChanged(i) {+ i && this.updateBoundingBox();+ }+ /**+ * Updates the bounding box information for the gizmo+ */+ updateBoundingBox() {+ if (this.attachedMesh) {+ k4._RemoveAndStorePivotPoint(this.attachedMesh);+ const i = this.attachedMesh.parent;+ this.attachedMesh.setParent(null), this._update(), this.attachedMesh.rotationQuaternion || (this.attachedMesh.rotationQuaternion = wu.RotationYawPitchRoll(this.attachedMesh.rotation.y, this.attachedMesh.rotation.x, this.attachedMesh.rotation.z)), this._tmpQuaternion.copyFrom(this.attachedMesh.rotationQuaternion), this._tmpVector.copyFrom(this.attachedMesh.position), this.attachedMesh.rotationQuaternion.set(0, 0, 0, 1), this.attachedMesh.position.set(0, 0, 0);+ const d = this.attachedMesh.getHierarchyBoundingVectors();+ d.max.subtractToRef(d.min, this._boundingDimensions), this._boundingBoxGizmo.min = d.min, this._boundingBoxGizmo.max = d.max, this._updateHandlesPosition(), this._updateHandlesScaling(), this.attachedMesh.rotationQuaternion.copyFrom(this._tmpQuaternion), this.attachedMesh.position.copyFrom(this._tmpVector), k4._RestorePivotPoint(this.attachedMesh), this.attachedMesh.setParent(i), this.attachedMesh.computeWorldMatrix(!0), this._existingSlateScale.copyFrom(this.attachedMesh.scaling);+ }+ }+ _updateHandlesPosition() {+ const i = this._boundingBoxGizmo.min.clone(), d = this._boundingBoxGizmo.max.clone(), g = this._corners[0].node.scaling.length();+ i.x -= this._margin * g, i.y -= this._margin * g, d.x += this._margin * g, d.y += this._margin * g;+ const y = i.add(d).scaleInPlace(0.5);+ this._corners[0].node.position.copyFromFloats(i.x, i.y, 0), this._corners[1].node.position.copyFromFloats(d.x, i.y, 0), this._corners[2].node.position.copyFromFloats(d.x, d.y, 0), this._corners[3].node.position.copyFromFloats(i.x, d.y, 0), this._sides[0].node.position.copyFromFloats(i.x, y.y, 0), this._sides[1].node.position.copyFromFloats(y.x, i.y, 0), this._sides[2].node.position.copyFromFloats(d.x, y.y, 0), this._sides[3].node.position.copyFromFloats(y.x, d.y, 0);+ }+ _updateHandlesScaling() {+ if (this._attachedSlate && this._attachedSlate.mesh) {+ const i = this._attachedSlate.mesh.scaling.x * this._attachedSlate.dimensions.x, d = this._attachedSlate.mesh.scaling.y * this._attachedSlate.dimensions.y, g = Math.min(i, d) * this._handleSize;+ for (let y = 0; y < this._corners.length; y++)+ this._corners[y].node.scaling.setAll(g);+ for (let y = 0; y < this._sides.length; y++)+ this._sides[y].node.scaling.setAll(g);+ }+ }+ _update() {+ if (super._update(), !!this.gizmoLayer.utilityLayerScene.activeCamera && this._attachedSlate && this._attachedSlate.mesh) {+ if (this.fixedScreenSize) {+ this._attachedSlate.mesh.absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);+ const i = this._handleSize * this._tmpVector.length() / this.fixedScreenSizeDistanceFactor;+ for (let d = 0; d < this._corners.length; d++)+ this._corners[d].node.scaling.set(i, i, i);+ for (let d = 0; d < this._sides.length; d++)+ this._sides[d].node.scaling.set(i, i, i);+ }+ this._updateHandlesPosition();+ }+ }+ dispose() {+ this.gizmoLayer.originalScene.onBeforeRenderObservable.remove(this._renderObserver), super.dispose();+ for (const i of this._corners)+ i.dispose();+ for (const i of this._sides)+ i.dispose();+ }+}+class Na extends hS {+ /**+ * Regroups all mesh behaviors for the slate+ */+ get defaultBehavior() {+ return this._defaultBehavior;+ }+ /**+ * 2D dimensions of the slate+ */+ get dimensions() {+ return this._dimensions;+ }+ set dimensions(i) {+ let d = 1;+ if (i.x < this.minDimensions.x || i.y < this.minDimensions.y) {+ const g = i.x / i.y;+ this.minDimensions.x / this.minDimensions.y > g ? d = this.minDimensions.x / i.x : d = this.minDimensions.y / i.y;+ }+ this._dimensions.copyFrom(i).scaleInPlace(d), this._updatePivot(), this._positionElements();+ }+ /**+ * Height of the title bar component+ */+ get titleBarHeight() {+ return this._titleBarHeight;+ }+ set titleBarHeight(i) {+ this._titleBarHeight = i;+ }+ /**+ * Rendering ground id of all the meshes+ */+ set renderingGroupId(i) {+ this._titleBar.renderingGroupId = i, this._titleBarTitle.renderingGroupId = i, this._contentPlate.renderingGroupId = i, this._backPlate.renderingGroupId = i;+ }+ get renderingGroupId() {+ return this._titleBar.renderingGroupId;+ }+ /**+ * The title text displayed at the top of the slate+ */+ set title(i) {+ this._titleText = i, this._titleTextComponent && (this._titleTextComponent.text = i);+ }+ get title() {+ return this._titleText;+ }+ /**+ * Creates a new slate+ * @param name defines the control name+ */+ constructor(i) {+ super(i), this.titleBarMargin = 5e-3, this.origin = new Se(0, 0, 0), this._dimensions = new mo(21.875, 12.5), this._titleBarHeight = 0.625, this._titleText = "", this.fitContentToDimensions = !1, this._contentScaleRatio = 1, this.minDimensions = new mo(15.625, 6.25), this.defaultDimensions = this._dimensions.clone(), this._followButton = new Th("followButton" + this.name), this._followButton.isToggleButton = !0, this._closeButton = new Th("closeButton" + this.name), this._contentViewport = new Kg(0, 0, 1, 1), this._contentDragBehavior = new oS({+ dragPlaneNormal: new Se(0, 0, -1)+ });+ }+ /**+ * Apply the facade texture (created from the content property).+ * This function can be overloaded by child classes+ * @param facadeTexture defines the AdvancedDynamicTexture to use+ */+ _applyFacade(i) {+ this._contentMaterial.albedoTexture = i, this._resetContentPositionAndZoom(), this._applyContentViewport(), i.attachToMesh(this._contentPlate, !0);+ }+ _addControl(i) {+ i._host = this._host, this._host.utilityLayer && i._prepareNode(this._host.utilityLayer.utilityLayerScene);+ }+ _getTypeName() {+ return "HolographicSlate";+ }+ /**+ * @internal+ */+ _positionElements() {+ const i = this._followButton, d = this._closeButton, g = this._titleBar, y = this._titleBarTitle, M = this._contentPlate, N = this._backPlate;+ if (i && d && g) {+ d.scaling.setAll(this.titleBarHeight), i.scaling.setAll(this.titleBarHeight), d.position.copyFromFloats(this.dimensions.x - this.titleBarHeight / 2, -this.titleBarHeight / 2, 0).addInPlace(this.origin), i.position.copyFromFloats(this.dimensions.x - 3 * this.titleBarHeight / 2, -this.titleBarHeight / 2, 0).addInPlace(this.origin);+ const O = this.dimensions.y - this.titleBarHeight - this.titleBarMargin, F = M.getScene().useRightHandedSystem;+ g.scaling.set(this.dimensions.x, this.titleBarHeight, hn), y.scaling.set(this.dimensions.x - 2 * this.titleBarHeight, this.titleBarHeight, hn), M.scaling.copyFromFloats(this.dimensions.x, O, hn), N.scaling.copyFromFloats(this.dimensions.x, O, hn), g.position.copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight / 2), 0).addInPlace(this.origin), y.position.copyFromFloats(this.dimensions.x / 2 - this.titleBarHeight, -(this.titleBarHeight / 2), F ? hn : -hn).addInPlace(this.origin), M.position.copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight + this.titleBarMargin + O / 2), 0).addInPlace(this.origin), N.position.copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight + this.titleBarMargin + O / 2), F ? -hn : hn).addInPlace(this.origin), this._titleTextComponent.host.scaleTo(Na._DEFAULT_TEXT_RESOLUTION_Y * y.scaling.x / y.scaling.y, Na._DEFAULT_TEXT_RESOLUTION_Y);+ const ne = this.dimensions.x / O;+ this._contentViewport.width = this._contentScaleRatio, this._contentViewport.height = this._contentScaleRatio / ne, this._applyContentViewport(), this._gizmo && this._gizmo.updateBoundingBox();+ }+ }+ _applyContentViewport() {+ if (this._contentPlate?.material && this._contentPlate.material.albedoTexture) {+ const i = this._contentPlate.material.albedoTexture;+ i.uScale = this._contentScaleRatio, i.vScale = this.fitContentToDimensions ? this._contentScaleRatio : this._contentScaleRatio / this._contentViewport.width * this._contentViewport.height, i.uOffset = this._contentViewport.x, i.vOffset = this._contentViewport.y;+ }+ }+ _resetContentPositionAndZoom() {+ this._contentViewport.x = 0, this._contentViewport.y = 0, this._contentScaleRatio = 1;+ }+ /**+ * @internal+ */+ _updatePivot() {+ if (!this.mesh)+ return;+ const i = new Se(this.dimensions.x * 0.5, -this.dimensions.y * 0.5, hn);+ i.addInPlace(this.origin), i.z = 0;+ const d = new Se(0, 0, 0);+ Se.TransformCoordinatesToRef(d, this.mesh.computeWorldMatrix(!0), d), this.mesh.setPivotPoint(i);+ const g = new Se(0, 0, 0);+ Se.TransformCoordinatesToRef(g, this.mesh.computeWorldMatrix(!0), g), this.mesh.position.addInPlace(d).subtractInPlace(g);+ }+ // Mesh association+ _createNode(i) {+ const d = new Mb("slate_" + this.name, i);+ this._titleBar = Wi("titleBar_" + this.name, { size: 1 }, i), this._titleBarTitle = sl("titleText_" + this.name, { size: 1 }, i), this._titleBarTitle.parent = d, this._titleBarTitle.isPickable = !1;+ const g = go.CreateForMesh(this._titleBarTitle);+ if (this._titleTextComponent = new zr("titleText_" + this.name, this._titleText), this._titleTextComponent.textWrapping = 2, this._titleTextComponent.textHorizontalAlignment = pe.HORIZONTAL_ALIGNMENT_LEFT, this._titleTextComponent.color = "white", this._titleTextComponent.fontSize = Na._DEFAULT_TEXT_RESOLUTION_Y / 2, this._titleTextComponent.paddingLeft = Na._DEFAULT_TEXT_RESOLUTION_Y / 4, g.addControl(this._titleTextComponent), i.useRightHandedSystem) {+ const O = new fi(0, 0, 1, 1);+ this._contentPlate = sl("contentPlate_" + this.name, { size: 1, sideOrientation: _b.BACKSIDE, frontUVs: O }, i), this._backPlate = sl("backPlate_" + this.name, { size: 1, sideOrientation: _b.FRONTSIDE }, i);+ } else {+ const O = new fi(0, 0, 1, 1);+ this._contentPlate = sl("contentPlate_" + this.name, { size: 1, sideOrientation: _b.FRONTSIDE, frontUVs: O }, i), this._backPlate = sl("backPlate_" + this.name, { size: 1, sideOrientation: _b.BACKSIDE }, i);+ }+ this._titleBar.parent = d, this._titleBar.isNearGrabbable = !0, this._contentPlate.parent = d, this._backPlate.parent = d, this._attachContentPlateBehavior(), this._addControl(this._followButton), this._addControl(this._closeButton);+ const y = this._followButton, M = this._closeButton;+ y.node.parent = d, M.node.parent = d, this._positionElements();+ const N = Lr.GetAssetUrl(Na.ASSETS_BASE_URL);+ return this._followButton.imageUrl = N + Na.FOLLOW_ICON_FILENAME, this._closeButton.imageUrl = N + Na.CLOSE_ICON_FILENAME, this._followButton.isBackplateVisible = !1, this._closeButton.isBackplateVisible = !1, this._followButton.onToggleObservable.add((O) => {+ this._defaultBehavior.followBehaviorEnabled = O, this._defaultBehavior.followBehaviorEnabled && this._defaultBehavior.followBehavior.recenter();+ }), this._closeButton.onPointerClickObservable.add(() => {+ this.dispose();+ }), d.rotationQuaternion = wu.Identity(), d.isVisible = !1, d;+ }+ _attachContentPlateBehavior() {+ this._contentDragBehavior.attach(this._contentPlate), this._contentDragBehavior.moveAttached = !1, this._contentDragBehavior.useObjectOrientationForDragging = !0, this._contentDragBehavior.updateDragPlane = !1;+ const i = new Se(), d = new Se(), g = new Se(), y = new Se(), M = new mo();+ let N, O;+ this._contentDragBehavior.onDragStartObservable.add((ne) => {+ this.node && (N = this._contentViewport.clone(), O = this.node.computeWorldMatrix(!0), i.copyFrom(ne.dragPlanePoint), d.set(this.dimensions.x, this.dimensions.y, hn), d.y -= this.titleBarHeight + this.titleBarMargin, Se.TransformNormalToRef(d, O, d), g.copyFromFloats(0, 1, 0), Se.TransformNormalToRef(g, O, g), y.copyFromFloats(1, 0, 0), Se.TransformNormalToRef(y, O, y), g.normalize(), g.scaleInPlace(1 / Se.Dot(g, d)), y.normalize(), y.scaleInPlace(1 / Se.Dot(y, d)));+ });+ const F = new Se();+ this._contentDragBehavior.onDragObservable.add((ne) => {+ this.fitContentToDimensions || (F.copyFrom(ne.dragPlanePoint), F.subtractInPlace(i), M.copyFromFloats(Se.Dot(F, y), Se.Dot(F, g)), this._contentViewport.x = ow.Clamp(N.x - F.x, 0, 1 - this._contentViewport.width * this._contentScaleRatio), this._contentViewport.y = ow.Clamp(N.y - F.y, 0, 1 - this._contentViewport.height * this._contentScaleRatio), this._applyContentViewport());+ });+ }+ _affectMaterial(i) {+ this._titleBarMaterial = new Dr(`${this.name} plateMaterial`, i.getScene()), this._contentMaterial = new $o(`${this.name} contentMaterial`, i.getScene()), this._contentMaterial.renderBorders = !0, this._backMaterial = new Dr(`${this.name} backPlate`, i.getScene()), this._backMaterial.lineWidth = hn, this._backMaterial.radius = 5e-3, this._backMaterial.backFaceCulling = !0, this._titleBar.material = this._titleBarMaterial, this._contentPlate.material = this._contentMaterial, this._backPlate.material = this._backMaterial, this._resetContent(), this._applyContentViewport();+ }+ /**+ * @internal+ */+ _prepareNode(i) {+ super._prepareNode(i), this._gizmo = new wS(this._host.utilityLayer), this._gizmo.attachedSlate = this, this._defaultBehavior = new mS(), this._defaultBehavior.attach(this.node, [this._titleBar]), this._defaultBehavior.sixDofDragBehavior.onDragStartObservable.add(() => {+ this._followButton.isToggled = !1;+ }), this._positionChangedObserver = this._defaultBehavior.sixDofDragBehavior.onPositionChangedObservable.add(() => {+ this._gizmo.updateBoundingBox();+ }), this._updatePivot(), this.resetDefaultAspectAndPose(!1);+ }+ /**+ * Resets the aspect and pose of the slate so it is right in front of the active camera, facing towards it.+ * @param resetAspect Should the slate's dimensions/aspect ratio be reset as well+ */+ resetDefaultAspectAndPose(i = !0) {+ if (!this._host || !this._host.utilityLayer || !this.node)+ return;+ const d = this._host.utilityLayer.utilityLayerScene, g = d.activeCamera;+ if (g) {+ const y = g.getWorldMatrix(), M = Se.TransformNormal(Se.Backward(d.useRightHandedSystem), y);+ this.origin.setAll(0), this._gizmo.updateBoundingBox();+ const N = this.node.getAbsolutePivotPoint();+ this.node.position.equalsToFloats(0, 0, 0) && this.node.position.copyFrom(g.position).subtractInPlace(M).subtractInPlace(N), this.node.rotationQuaternion = wu.FromLookDirectionLH(M, new Se(0, 1, 0)), i && (this.dimensions = this.defaultDimensions);+ }+ }+ /**+ * Releases all associated resources+ */+ dispose() {+ super.dispose(), this._titleBarMaterial.dispose(), this._contentMaterial.dispose(), this._titleBar.dispose(), this._titleBarTitle.dispose(), this._contentPlate.dispose(), this._backPlate.dispose(), this._followButton.dispose(), this._closeButton.dispose(), this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver), this._defaultBehavior.sixDofDragBehavior.onPositionChangedObservable.remove(this._positionChangedObserver), this._defaultBehavior.detach(), this._gizmo.dispose(), this._contentDragBehavior.detach();+ }+}+Na.ASSETS_BASE_URL = "https://assets.babylonjs.com/core/MRTK/";+Na.CLOSE_ICON_FILENAME = "IconClose.png";+Na.FOLLOW_ICON_FILENAME = "IconFollowMe.png";+Na._DEFAULT_TEXT_RESOLUTION_Y = 102.4;+class cF extends Bb {+ /**+ * Creates a new 3D button based on a mesh+ * @param mesh mesh to become a 3D button+ * @param name defines the control name+ */+ constructor(i, d) {+ super(d), this._currentMesh = i, this.pointerEnterAnimation = () => {+ this.mesh && this.mesh.scaling.scaleInPlace(1.1);+ }, this.pointerOutAnimation = () => {+ this.mesh && this.mesh.scaling.scaleInPlace(1 / 1.1);+ }, this.pointerDownAnimation = () => {+ this.mesh && this.mesh.scaling.scaleInPlace(0.95);+ }, this.pointerUpAnimation = () => {+ this.mesh && this.mesh.scaling.scaleInPlace(1 / 0.95);+ };+ }+ _getTypeName() {+ return "MeshButton3D";+ }+ // Mesh association+ // eslint-disable-next-line @typescript-eslint/no-unused-vars+ _createNode(i) {+ const d = this._currentMesh.getChildMeshes();+ for (const g of d)+ this._injectGUI3DReservedDataStore(g).control = this;+ return this._currentMesh;+ }+ // eslint-disable-next-line @typescript-eslint/no-unused-vars+ _affectMaterial(i) {+ }+}+class Eh extends bd {+ /**+ * Regroups all mesh behaviors for the near menu+ */+ get defaultBehavior() {+ return this._defaultBehavior;+ }+ /**+ * Indicates if the near menu is world-pinned+ */+ get isPinned() {+ return this._isPinned;+ }+ set isPinned(i) {+ if (this._pinButton.isToggled !== i) {+ this._pinButton.isToggled = i;+ return;+ }+ this._isPinned = i, i ? this._defaultBehavior.followBehaviorEnabled = !1 : this._defaultBehavior.followBehaviorEnabled = !0;+ }+ _createPinButton(i) {+ const d = new Th("pin" + this.name, !1), g = Lr.GetAssetUrl(Eh._ASSETS_BASE_URL);+ return d.imageUrl = g + Eh._PIN_ICON_FILENAME, d.parent = this, d._host = this._host, d.isToggleButton = !0, d.onToggleObservable.add((y) => {+ this.isPinned = y;+ }), this._host.utilityLayer && (d._prepareNode(this._host.utilityLayer.utilityLayerScene), d.scaling.scaleInPlace(bd.MENU_BUTTON_SCALE), d.node && (d.node.parent = i)), d;+ }+ _createNode(i) {+ const d = super._createNode(i);+ return this._pinButton = this._createPinButton(d), this.isPinned = !1, this._defaultBehavior.attach(d, [this._backPlate]), this._defaultBehavior.followBehavior.ignoreCameraPitchAndRoll = !0, this._defaultBehavior.followBehavior.pitchOffset = -15, this._defaultBehavior.followBehavior.minimumDistance = 0.3, this._defaultBehavior.followBehavior.defaultDistance = 0.4, this._defaultBehavior.followBehavior.maximumDistance = 0.6, this._backPlate.isNearGrabbable = !0, d.isVisible = !1, d;+ }+ _finalProcessing() {+ super._finalProcessing(), this._pinButton.position.copyFromFloats((this._backPlate.scaling.x + bd.MENU_BUTTON_SCALE) / 2, this._backPlate.scaling.y / 2, 0);+ }+ /**+ * Creates a near menu GUI 3D control+ * @param name name of the near menu+ */+ constructor(i) {+ super(i), this._isPinned = !1, this._defaultBehavior = new mS(), this._dragObserver = this._defaultBehavior.sixDofDragBehavior.onDragObservable.add(() => {+ this.isPinned = !0;+ }), this.backPlateMargin = 1;+ }+ /**+ * Disposes the near menu+ */+ dispose() {+ super.dispose(), this._defaultBehavior.sixDofDragBehavior.onDragObservable.remove(this._dragObserver), this._defaultBehavior.detach();+ }+}+Eh._ASSETS_BASE_URL = "https://assets.babylonjs.com/core/MRTK/";+Eh._PIN_ICON_FILENAME = "IconPin.png";+class dF extends Rh {+ _mapGridNode(i, d) {+ const g = i.mesh;+ if (!g)+ return;+ i.position = d.clone();+ const y = Jr.Vector3[0];+ switch (y.copyFrom(d), this.orientation) {+ case No.FACEORIGIN_ORIENTATION:+ case No.FACEFORWARD_ORIENTATION:+ y.addInPlace(new Se(0, 0, 1)), g.lookAt(y);+ break;+ case No.FACEFORWARDREVERSED_ORIENTATION:+ case No.FACEORIGINREVERSED_ORIENTATION:+ y.addInPlace(new Se(0, 0, -1)), g.lookAt(y);+ break;+ }+ }+}+class uF extends Rh {+ constructor() {+ super(...arguments), this._iteration = 100;+ }+ /**+ * Gets or sets the number of iteration to use to scatter the controls (100 by default)+ */+ get iteration() {+ return this._iteration;+ }+ set iteration(i) {+ this._iteration !== i && (this._iteration = i, Lr.SetImmediate(() => {+ this._arrangeChildren();+ }));+ }+ _mapGridNode(i, d) {+ const g = i.mesh, y = this._scatterMapping(d);+ if (g) {+ switch (this.orientation) {+ case No.FACEORIGIN_ORIENTATION:+ case No.FACEFORWARD_ORIENTATION:+ g.lookAt(new Se(0, 0, 1));+ break;+ case No.FACEFORWARDREVERSED_ORIENTATION:+ case No.FACEORIGINREVERSED_ORIENTATION:+ g.lookAt(new Se(0, 0, -1));+ break;+ }+ i.position = y;+ }+ }+ _scatterMapping(i) {+ return i.x = (1 - Math.random() * 2) * this._cellWidth, i.y = (1 - Math.random() * 2) * this._cellHeight, i;+ }+ _finalProcessing() {+ const i = [];+ for (const d of this._children)+ d.mesh && i.push(d.mesh);+ for (let d = 0; d < this._iteration; d++) {+ i.sort((O, F) => {+ const ne = O.position.lengthSquared(), $ = F.position.lengthSquared();+ return ne < $ ? 1 : ne > $ ? -1 : 0;+ });+ const g = Math.pow(this.margin, 2), y = Math.max(this._cellWidth, this._cellHeight), M = Jr.Vector2[0], N = Jr.Vector3[0];+ for (let O = 0; O < i.length - 1; O++)+ for (let F = O + 1; F < i.length; F++)+ if (O != F) {+ i[F].position.subtractToRef(i[O].position, N), M.x = N.x, M.y = N.y;+ const ne = y;+ let $ = M.lengthSquared() - g;+ const Q = Math.min($, g);+ $ -= Q, $ < Math.pow(ne, 2) && (M.normalize(), N.scaleInPlace((ne - Math.sqrt($)) * 0.5), i[F].position.addInPlace(N), i[O].position.subtractInPlace(N));+ }+ }+ }+}+const P4 = "mrdlSliderBarPixelShader", fF = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;uniform float _Radius_;uniform float _Bevel_Front_;uniform float _Bevel_Front_Stretch_;uniform float _Bevel_Back_;uniform float _Bevel_Back_Stretch_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform bool _Bulge_Enabled_;uniform float _Bulge_Height_;uniform float _Bulge_Radius_;uniform float _Sun_Intensity_;uniform float _Sun_Theta_;uniform float _Sun_Phi_;uniform float _Indirect_Diffuse_;uniform vec4 _Albedo_;uniform float _Specular_;uniform float _Shininess_;uniform float _Sharpness_;uniform float _Subsurface_;uniform vec4 _Left_Color_;uniform vec4 _Right_Color_;uniform float _Reflection_;uniform float _Front_Reflect_;uniform float _Edge_Reflect_;uniform float _Power_;uniform vec4 _Sky_Color_;uniform vec4 _Horizon_Color_;uniform vec4 _Ground_Color_;uniform float _Horizon_Power_;uniform sampler2D _Reflection_Map_;uniform sampler2D _Indirect_Environment_;uniform float _Width_;uniform float _Fuzz_;uniform float _Min_Fuzz_;uniform float _Clip_Fade_;uniform float _Hue_Shift_;uniform float _Saturation_Shift_;uniform float _Value_Shift_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Left_Index_Pos_;uniform vec3 _Right_Index_Pos_;uniform vec3 _Left_Index_Middle_Pos_;uniform vec3 _Right_Index_Middle_Pos_;uniform sampler2D _Decal_;uniform vec2 _Decal_Scale_XY_;uniform bool _Decal_Front_Only_;uniform float _Rim_Intensity_;uniform sampler2D _Rim_Texture_;uniform float _Rim_Hue_Shift_;uniform float _Rim_Saturation_Shift_;uniform float _Rim_Value_Shift_;uniform float _Iridescence_Intensity_;uniform sampler2D _Iridescence_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform vec4 Global_Left_Index_Middle_Position;uniform vec4 Global_Right_Index_Middle_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;void Blob_Fragment_B30(+sampler2D Blob_Texture,+vec4 Blob_Info1,+vec4 Blob_Info2,+out vec4 Blob_Color)+{float k1=dot(Blob_Info1.xy,Blob_Info1.xy);float k2=dot(Blob_Info2.xy,Blob_Info2.xy);vec3 closer=k1<k2 ? vec3(k1,Blob_Info1.z,Blob_Info1.w) : vec3(k2,Blob_Info2.z,Blob_Info2.w);Blob_Color=closer.z*texture(Blob_Texture,vec2(vec2(sqrt(closer.x),closer.y).x,1.0-vec2(sqrt(closer.x),closer.y).y))*clamp(1.0-closer.x,0.0,1.0);}+void FastLinearTosRGB_B42(+vec4 Linear,+out vec4 sRGB)+{sRGB.rgb=sqrt(clamp(Linear.rgb,0.0,1.0));sRGB.a=Linear.a;}+void Scale_RGB_B59(+vec4 Color,+float Scalar,+out vec4 Result)+{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}+void Fragment_Main_B121(+float Sun_Intensity,+float Sun_Theta,+float Sun_Phi,+vec3 Normal,+vec4 Albedo,+float Fresnel_Reflect,+float Shininess,+vec3 Incident,+vec4 Horizon_Color,+vec4 Sky_Color,+vec4 Ground_Color,+float Indirect_Diffuse,+float Specular,+float Horizon_Power,+float Reflection,+vec4 Reflection_Sample,+vec4 Indirect_Sample,+float Sharpness,+float SSS,+float Subsurface,+vec4 Translucence,+vec4 Rim_Light,+vec4 Iridescence,+out vec4 Result)+{float theta=Sun_Theta*2.0*3.14159;float phi=Sun_Phi*3.14159;vec3 lightDir= vec3(cos(phi)*cos(theta),sin(phi),cos(phi)*sin(theta));float NdotL=max(dot(lightDir,Normal),0.0);vec3 R=reflect(Incident,Normal);float RdotL=max(0.0,dot(R,lightDir));float specular=pow(RdotL,Shininess);specular=mix(specular,smoothstep(0.495*Sharpness,1.0-0.495*Sharpness,specular),Sharpness);vec4 gi=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);Result=((Sun_Intensity*NdotL+Indirect_Sample*Indirect_Diffuse+Translucence)*(1.0+SSS*Subsurface))*Albedo*(1.0-Fresnel_Reflect)+(Sun_Intensity*specular*Specular+Fresnel_Reflect*Reflection*Reflection_Sample)+Fresnel_Reflect*Rim_Light+Iridescence;}+void Bulge_B79(+bool Enabled,+vec3 Normal,+vec3 Tangent,+float Bulge_Height,+vec4 UV,+float Bulge_Radius,+vec3 ButtonN,+out vec3 New_Normal)+{vec2 xy=clamp(UV.xy*2.0,vec2(-1,-1),vec2(1,1));vec3 B=(cross(Normal,Tangent));float k=-clamp(1.0-length(xy)/Bulge_Radius,0.0,1.0)*Bulge_Height;k=sin(k*3.14159*0.5);k*=smoothstep(0.9998,0.9999,abs(dot(ButtonN,Normal)));New_Normal=Normal*sqrt(1.0-k*k)+(xy.x*Tangent+xy.y*B)*k;New_Normal=Enabled ? New_Normal : Normal;}+void SSS_B77(+vec3 ButtonN,+vec3 Normal,+vec3 Incident,+out float Result)+{float NdotI=abs(dot(Normal,Incident));float BdotI=abs(dot(ButtonN,Incident));Result=(abs(NdotI-BdotI)); }+void FingerOcclusion_B67(+float Width,+float DistToCenter,+float Fuzz,+float Min_Fuzz,+vec3 Position,+vec3 Forward,+vec3 Nearest,+float Fade_Out,+out float NotInShadow)+{float d=dot((Nearest-Position),Forward);float sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);NotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);}+void FingerOcclusion_B68(+float Width,+float DistToCenter,+float Fuzz,+float Min_Fuzz,+vec3 Position,+vec3 Forward,+vec3 Nearest,+float Fade_Out,+out float NotInShadow)+{float d=dot((Nearest-Position),Forward);float sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);NotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);}+void Scale_Color_B91(+vec4 Color,+float Scalar,+out vec4 Result)+{Result=Scalar*Color;}+void From_HSV_B73(+float Hue,+float Saturation,+float Value,+float Alpha,+out vec4 Color)+{vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(vec3(Hue,Hue,Hue)+K.xyz)*6.0-K.www);Color.rgb=Value*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),Saturation);Color.a=Alpha;}+void Fast_Fresnel_B122(+float Front_Reflect,+float Edge_Reflect,+float Power,+vec3 Normal,+vec3 Incident,+out float Transmit,+out float Reflect)+{float d=max(-dot(Incident,Normal),0.0);Reflect=Front_Reflect+(Edge_Reflect-Front_Reflect)*pow(.01-d,Power);Transmit=1.0-Reflect;}+void Mapped_Environment_B51(+sampler2D Reflected_Environment,+sampler2D Indirect_Environment,+vec3 Dir,+out vec4 Reflected_Color,+out vec4 Indirect_Diffuse)+{Reflected_Color=texture(Reflected_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));Indirect_Diffuse=texture(Indirect_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));}+vec4 SampleEnv_Bid50(vec3 D,vec4 S,vec4 H,vec4 G,float exponent)+{float k=pow(abs(D.y),exponent);vec4 C;if (D.y>0.0) {C=mix(H,S,k);} else {C=mix(H,G,k); }+return C;}+void Sky_Environment_B50(+vec3 Normal,+vec3 Reflected,+vec4 Sky_Color,+vec4 Horizon_Color,+vec4 Ground_Color,+float Horizon_Power,+out vec4 Reflected_Color,+out vec4 Indirect_Color)+{Reflected_Color=SampleEnv_Bid50(Reflected,Sky_Color,Horizon_Color,Ground_Color,Horizon_Power);Indirect_Color=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);}+void Min_Segment_Distance_B65(+vec3 P0,+vec3 P1,+vec3 Q0,+vec3 Q1,+out vec3 NearP,+out vec3 NearQ,+out float Distance)+{vec3 u=P1-P0;vec3 v=Q1-Q0;vec3 w=P0-Q0;float a=dot(u,u);float b=dot(u,v);float c=dot(v,v);float d=dot(u,w);float e=dot(v,w);float D=a*c-b*b;float sD=D;float tD=D;float sc,sN,tc,tN;if (D<0.00001) {sN=0.0;sD=1.0;tN=e;tD=c;} else {sN=(b*e-c*d);tN=(a*e-b*d);if (sN<0.0) {sN=0.0;tN=e;tD=c;} else if (sN>sD) {sN=sD;tN=e+b;tD=c;}}+if (tN<0.0) {tN=0.0;if (-d<0.0) {sN=0.0;} else if (-d>a) {sN=sD;} else {sN=-d;sD=a;}} else if (tN>tD) {tN=tD;if ((-d+b)<0.0) {sN=0.0;} else if ((-d+b)>a) {sN=sD;} else {sN=(-d+b);sD=a;}}+sc=abs(sN)<0.000001 ? 0.0 : sN/sD;tc=abs(tN)<0.000001 ? 0.0 : tN/tD;NearP=P0+sc*u;NearQ=Q0+tc*v;Distance=distance(NearP,NearQ);}+void To_XYZ_B74(+vec3 Vec3,+out float X,+out float Y,+out float Z)+{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}+void Finger_Positions_B64(+vec3 Left_Index_Pos,+vec3 Right_Index_Pos,+vec3 Left_Index_Middle_Pos,+vec3 Right_Index_Middle_Pos,+out vec3 Left_Index,+out vec3 Right_Index,+out vec3 Left_Index_Middle,+out vec3 Right_Index_Middle)+{Left_Index= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Left_Index_Pos);Right_Index= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Right_Index_Pos);Left_Index_Middle= (Use_Global_Left_Index ? Global_Left_Index_Middle_Position.xyz : Left_Index_Middle_Pos);Right_Index_Middle= (Use_Global_Right_Index ? Global_Right_Index_Middle_Position.xyz : Right_Index_Middle_Pos);}+void VaryHSV_B108(+vec3 HSV_In,+float Hue_Shift,+float Saturation_Shift,+float Value_Shift,+out vec3 HSV_Out)+{HSV_Out=vec3(fract(HSV_In.x+Hue_Shift),clamp(HSV_In.y+Saturation_Shift,0.0,1.0),clamp(HSV_In.z+Value_Shift,0.0,1.0));}+void Remap_Range_B114(+float In_Min,+float In_Max,+float Out_Min,+float Out_Max,+float In,+out float Out)+{Out=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));}+void To_HSV_B75(+vec4 Color,+out float Hue,+out float Saturation,+out float Value,+out float Alpha,+out vec3 HSV)+{vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=Color.g<Color.b ? vec4(Color.bg,K.wz) : vec4(Color.gb,K.xy);vec4 q=Color.r<p.x ? vec4(p.xyw,Color.r) : vec4(Color.r,p.yzx);float d=q.x-min(q.w,q.y);float e=1.0e-10;Hue=abs(q.z+(q.w-q.y)/(6.0*d+e));Saturation=d/(q.x+e);Value=q.x;Alpha=Color.a;HSV=vec3(Hue,Saturation,Value);}+void Code_B110(+float X,+out float Result)+{Result=(acos(X)/3.14159-0.5)*2.0;}+void Rim_Light_B132(+vec3 Front,+vec3 Normal,+vec3 Incident,+float Rim_Intensity,+sampler2D Texture,+out vec4 Result)+{vec3 R=reflect(Incident,Normal);float RdotF=dot(R,Front);float RdotL=sqrt(1.0-RdotF*RdotF);vec2 UV=vec2(R.y*0.5+0.5,0.5);vec4 Color=texture(Texture,UV);Result=Color;}+void main()+{vec4 Blob_Color_Q30;+#if BLOB_ENABLE+Blob_Fragment_B30(_Blob_Texture_,vExtra2,vExtra3,Blob_Color_Q30);+#else+Blob_Color_Q30=vec4(0,0,0,0);+#endif+vec3 Incident_Q39=normalize(vPosition-cameraPosition);vec3 Normalized_Q38=normalize(vNormal);vec3 Normalized_Q71=normalize(vTangent);vec4 Color_Q83;+#if DECAL_ENABLE+Color_Q83=texture(_Decal_,vUV);+#else+Color_Q83=vec4(0,0,0,0);+#endif+float X_Q90;float Y_Q90;float Z_Q90;float W_Q90;X_Q90=vExtra1.x;Y_Q90=vExtra1.y;Z_Q90=vExtra1.z;W_Q90=vExtra1.w;vec4 Linear_Q43;Linear_Q43.rgb=clamp(_Sky_Color_.rgb*_Sky_Color_.rgb,0.0,1.0);Linear_Q43.a=_Sky_Color_.a;vec4 Linear_Q44;Linear_Q44.rgb=clamp(_Horizon_Color_.rgb*_Horizon_Color_.rgb,0.0,1.0);Linear_Q44.a=_Horizon_Color_.a;vec4 Linear_Q45;Linear_Q45.rgb=clamp(_Ground_Color_.rgb*_Ground_Color_.rgb,0.0,1.0);Linear_Q45.a=_Ground_Color_.a;vec3 Left_Index_Q64;vec3 Right_Index_Q64;vec3 Left_Index_Middle_Q64;vec3 Right_Index_Middle_Q64;Finger_Positions_B64(_Left_Index_Pos_,_Right_Index_Pos_,_Left_Index_Middle_Pos_,_Right_Index_Middle_Pos_,Left_Index_Q64,Right_Index_Q64,Left_Index_Middle_Q64,Right_Index_Middle_Q64);vec4 Linear_Q46;Linear_Q46.rgb=clamp(_Albedo_.rgb*_Albedo_.rgb,0.0,1.0);Linear_Q46.a=_Albedo_.a;vec3 Normalized_Q107=normalize(vBinormal);vec3 Incident_Q70=normalize(vPosition-cameraPosition);vec3 New_Normal_Q79;Bulge_B79(_Bulge_Enabled_,Normalized_Q38,Normalized_Q71,_Bulge_Height_,vColor,_Bulge_Radius_,vBinormal,New_Normal_Q79);float Result_Q77;SSS_B77(vBinormal,New_Normal_Q79,Incident_Q39,Result_Q77);vec4 Result_Q91;Scale_Color_B91(Color_Q83,X_Q90,Result_Q91);float Transmit_Q122;float Reflect_Q122;Fast_Fresnel_B122(_Front_Reflect_,_Edge_Reflect_,_Power_,New_Normal_Q79,Incident_Q39,Transmit_Q122,Reflect_Q122);float Product_Q125=Y_Q90*Y_Q90;vec3 NearP_Q65;vec3 NearQ_Q65;float Distance_Q65;Min_Segment_Distance_B65(Left_Index_Q64,Left_Index_Middle_Q64,vPosition,cameraPosition,NearP_Q65,NearQ_Q65,Distance_Q65);vec3 NearP_Q63;vec3 NearQ_Q63;float Distance_Q63;Min_Segment_Distance_B65(Right_Index_Q64,Right_Index_Middle_Q64,vPosition,cameraPosition,NearP_Q63,NearQ_Q63,Distance_Q63);vec3 Reflected_Q47=reflect(Incident_Q39,New_Normal_Q79);vec4 Product_Q103=Linear_Q46*vec4(1,1,1,1);vec4 Result_Q132;Rim_Light_B132(Normalized_Q107,Normalized_Q38,Incident_Q70,_Rim_Intensity_,_Rim_Texture_,Result_Q132);float Dot_Q72=dot(Incident_Q70, Normalized_Q71);float MaxAB_Q123=max(Reflect_Q122,Product_Q125);float NotInShadow_Q67;+#if OCCLUSION_ENABLED+FingerOcclusion_B67(_Width_,Distance_Q65,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q65,_Clip_Fade_,NotInShadow_Q67);+#else+NotInShadow_Q67=1.0;+#endif+float NotInShadow_Q68;+#if OCCLUSION_ENABLED+FingerOcclusion_B68(_Width_,Distance_Q63,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q63,_Clip_Fade_,NotInShadow_Q68);+#else+NotInShadow_Q68=1.0;+#endif+vec4 Reflected_Color_Q51;vec4 Indirect_Diffuse_Q51;+#if ENV_ENABLE+Mapped_Environment_B51(_Reflection_Map_,_Indirect_Environment_,Reflected_Q47,Reflected_Color_Q51,Indirect_Diffuse_Q51);+#else+Reflected_Color_Q51=vec4(0,0,0,1);Indirect_Diffuse_Q51=vec4(0,0,0,1);+#endif+vec4 Reflected_Color_Q50;vec4 Indirect_Color_Q50;+#if SKY_ENABLED+Sky_Environment_B50(New_Normal_Q79,Reflected_Q47,Linear_Q43,Linear_Q44,Linear_Q45,_Horizon_Power_,Reflected_Color_Q50,Indirect_Color_Q50);+#else+Reflected_Color_Q50=vec4(0,0,0,1);Indirect_Color_Q50=vec4(0,0,0,1);+#endif+float Hue_Q75;float Saturation_Q75;float Value_Q75;float Alpha_Q75;vec3 HSV_Q75;To_HSV_B75(Product_Q103,Hue_Q75,Saturation_Q75,Value_Q75,Alpha_Q75,HSV_Q75);float Hue_Q127;float Saturation_Q127;float Value_Q127;float Alpha_Q127;vec3 HSV_Q127;To_HSV_B75(Result_Q132,Hue_Q127,Saturation_Q127,Value_Q127,Alpha_Q127,HSV_Q127);float Result_Q110;Code_B110(Dot_Q72,Result_Q110);float AbsA_Q76=abs(Result_Q110);float MinAB_Q58=min(NotInShadow_Q67,NotInShadow_Q68);vec4 Sum_Q48=Reflected_Color_Q51+Reflected_Color_Q50;vec4 Sum_Q49=Indirect_Diffuse_Q51+Indirect_Color_Q50;vec3 HSV_Out_Q126;VaryHSV_B108(HSV_Q127,_Rim_Hue_Shift_,_Rim_Saturation_Shift_,_Rim_Value_Shift_,HSV_Out_Q126);float Out_Q114;Remap_Range_B114(-1.0,1.0,0.0,1.0,Result_Q110,Out_Q114);float Product_Q106;Product_Q106=AbsA_Q76*_Hue_Shift_;float X_Q128;float Y_Q128;float Z_Q128;To_XYZ_B74(HSV_Out_Q126,X_Q128,Y_Q128,Z_Q128);vec2 Vec2_Q112=vec2(Out_Q114,0.5);vec3 HSV_Out_Q108;VaryHSV_B108(HSV_Q75,Product_Q106,_Saturation_Shift_,_Value_Shift_,HSV_Out_Q108);vec4 Color_Q129;From_HSV_B73(X_Q128,Y_Q128,Z_Q128,0.0,Color_Q129);vec4 Color_Q111;+#if IRIDESCENCE_ENABLED+Color_Q111=texture(_Iridescence_Texture_,Vec2_Q112);+#else+Color_Q111=vec4(0,0,0,0);+#endif+float X_Q74;float Y_Q74;float Z_Q74;To_XYZ_B74(HSV_Out_Q108,X_Q74,Y_Q74,Z_Q74);vec4 Result_Q131=_Rim_Intensity_*Color_Q129;vec4 Result_Q113=_Iridescence_Intensity_*Color_Q111;vec4 Color_Q73;From_HSV_B73(X_Q74,Y_Q74,Z_Q74,0.0,Color_Q73);vec4 Result_Q84=Result_Q91+(1.0-Result_Q91.a)*Color_Q73;vec4 Result_Q121;Fragment_Main_B121(_Sun_Intensity_,_Sun_Theta_,_Sun_Phi_,New_Normal_Q79,Result_Q84,MaxAB_Q123,_Shininess_,Incident_Q39,_Horizon_Color_,_Sky_Color_,_Ground_Color_,_Indirect_Diffuse_,_Specular_,_Horizon_Power_,_Reflection_,Sum_Q48,Sum_Q49,_Sharpness_,Result_Q77,_Subsurface_,vec4(0,0,0,0),Result_Q131,Result_Q113,Result_Q121);vec4 Result_Q59;Scale_RGB_B59(Result_Q121,MinAB_Q58,Result_Q59);vec4 sRGB_Q42;FastLinearTosRGB_B42(Result_Q59,sRGB_Q42);vec4 Result_Q31=Blob_Color_Q30+(1.0-Blob_Color_Q30.a)*sRGB_Q42;vec4 Result_Q40=Result_Q31; Result_Q40.a=1.0;vec4 Out_Color=Result_Q40;float Clip_Threshold=0.001;bool To_sRGB=false;gl_FragColor=Out_Color;}`;+br.ShadersStore[P4] || (br.ShadersStore[P4] = fF);+const O4 = "mrdlSliderBarVertexShader", hF = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;+#ifdef TANGENT+attribute vec3 tangent;+#else+const vec3 tangent=vec3(0.);+#endif+uniform float _Radius_;uniform float _Bevel_Front_;uniform float _Bevel_Front_Stretch_;uniform float _Bevel_Back_;uniform float _Bevel_Back_Stretch_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform bool _Bulge_Enabled_;uniform float _Bulge_Height_;uniform float _Bulge_Radius_;uniform float _Sun_Intensity_;uniform float _Sun_Theta_;uniform float _Sun_Phi_;uniform float _Indirect_Diffuse_;uniform vec4 _Albedo_;uniform float _Specular_;uniform float _Shininess_;uniform float _Sharpness_;uniform float _Subsurface_;uniform vec4 _Left_Color_;uniform vec4 _Right_Color_;uniform float _Reflection_;uniform float _Front_Reflect_;uniform float _Edge_Reflect_;uniform float _Power_;uniform vec4 _Sky_Color_;uniform vec4 _Horizon_Color_;uniform vec4 _Ground_Color_;uniform float _Horizon_Power_;uniform sampler2D _Reflection_Map_;uniform sampler2D _Indirect_Environment_;uniform float _Width_;uniform float _Fuzz_;uniform float _Min_Fuzz_;uniform float _Clip_Fade_;uniform float _Hue_Shift_;uniform float _Saturation_Shift_;uniform float _Value_Shift_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Left_Index_Pos_;uniform vec3 _Right_Index_Pos_;uniform vec3 _Left_Index_Middle_Pos_;uniform vec3 _Right_Index_Middle_Pos_;uniform sampler2D _Decal_;uniform vec2 _Decal_Scale_XY_;uniform bool _Decal_Front_Only_;uniform float _Rim_Intensity_;uniform sampler2D _Rim_Texture_;uniform float _Rim_Hue_Shift_;uniform float _Rim_Saturation_Shift_;uniform float _Rim_Value_Shift_;uniform float _Iridescence_Intensity_;uniform sampler2D _Iridescence_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;void Object_To_World_Pos_B12(+vec3 Pos_Object,+out vec3 Pos_World)+{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}+void Object_To_World_Normal_B32(+vec3 Nrm_Object,+out vec3 Nrm_World)+{Nrm_World=(vec4(Nrm_Object,0.0)).xyz;}+void Blob_Vertex_B23(+vec3 Position,+vec3 Normal,+vec3 Tangent,+vec3 Bitangent,+vec3 Blob_Position,+float Intensity,+float Blob_Near_Size,+float Blob_Far_Size,+float Blob_Near_Distance,+float Blob_Far_Distance,+float Blob_Fade_Length,+float Blob_Pulse,+float Blob_Fade,+out vec4 Blob_Info)+{vec3 blob= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Blob_Position);vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}+void Blob_Vertex_B24(+vec3 Position,+vec3 Normal,+vec3 Tangent,+vec3 Bitangent,+vec3 Blob_Position,+float Intensity,+float Blob_Near_Size,+float Blob_Far_Size,+float Blob_Near_Distance,+float Blob_Far_Distance,+float Blob_Fade_Length,+float Blob_Pulse,+float Blob_Fade,+out vec4 Blob_Info)+{vec3 blob= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Blob_Position);vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}+void Move_Verts_B130(+float Anisotropy,+vec3 P,+float Radius,+float Bevel,+vec3 Normal_Object,+float ScaleZ,+float Stretch,+out vec3 New_P,+out vec2 New_UV,+out float Radial_Gradient,+out vec3 Radial_Dir,+out vec3 New_Normal)+{vec2 UV=P.xy*2.0+0.5;vec2 center=clamp(UV,0.0,1.0);vec2 delta=UV-center;float deltad=(length(delta)*2.0);float f=(Bevel+(Radius-Bevel)*Stretch)/Radius;float innerd=clamp(deltad*2.0,0.0,1.0);float outerd=clamp(deltad*2.0-1.0,0.0,1.0);float bevelAngle=outerd*3.14159*0.5;float sinb=sin(bevelAngle);float cosb=cos(bevelAngle);float beveld=(1.0-f)*innerd+f*sinb;float br=outerd;vec2 r2=2.0*vec2(Radius/Anisotropy,Radius);float dir=P.z<0.0001 ? 1.0 : -1.0;New_UV=center+r2*((0.5-center)+normalize(delta+vec2(0.0,0.000001))*beveld*0.5);New_P=vec3(New_UV-0.5,P.z+dir*(1.0-cosb)*Bevel*ScaleZ);Radial_Gradient=clamp((deltad-0.5)*2.0,0.0,1.0);Radial_Dir=vec3(delta*r2,0.0);vec3 beveledNormal=cosb*Normal_Object+sinb*vec3(delta.x,delta.y,0.0);New_Normal=Normal_Object.z==0.0 ? Normal_Object : beveledNormal;}+void Object_To_World_Dir_B60(+vec3 Dir_Object,+out vec3 Normal_World,+out vec3 Normal_World_N,+out float Normal_Length)+{Normal_World=(world*vec4(Dir_Object,0.0)).xyz;Normal_Length=length(Normal_World);Normal_World_N=Normal_World/Normal_Length;}+void To_XYZ_B78(+vec3 Vec3,+out float X,+out float Y,+out float Z)+{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}+void Conditional_Float_B93(+bool Which,+float If_True,+float If_False,+out float Result)+{Result=Which ? If_True : If_False;}+void Object_To_World_Dir_B28(+vec3 Dir_Object,+out vec3 Binormal_World,+out vec3 Binormal_World_N,+out float Binormal_Length)+{Binormal_World=(world*vec4(Dir_Object,0.0)).xyz;Binormal_Length=length(Binormal_World);Binormal_World_N=Binormal_World/Binormal_Length;}+void Pick_Radius_B69(+float Radius,+float Radius_Top_Left,+float Radius_Top_Right,+float Radius_Bottom_Left,+float Radius_Bottom_Right,+vec3 Position,+out float Result)+{bool whichY=Position.y>0.0;Result=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);Result*=Radius;}+void Conditional_Float_B36(+bool Which,+float If_True,+float If_False,+out float Result)+{Result=Which ? If_True : If_False;}+void Greater_Than_B37(+float Left,+float Right,+out bool Not_Greater_Than,+out bool Greater_Than)+{Greater_Than=Left>Right;Not_Greater_Than=!Greater_Than;}+void Remap_Range_B105(+float In_Min,+float In_Max,+float Out_Min,+float Out_Max,+float In,+out float Out)+{Out=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));}+void main()+{vec2 XY_Q85;XY_Q85=(uv-vec2(0.5,0.5))*_Decal_Scale_XY_+vec2(0.5,0.5);vec3 Tangent_World_Q27;vec3 Tangent_World_N_Q27;float Tangent_Length_Q27;Tangent_World_Q27=(world*vec4(vec3(1,0,0),0.0)).xyz;Tangent_Length_Q27=length(Tangent_World_Q27);Tangent_World_N_Q27=Tangent_World_Q27/Tangent_Length_Q27;vec3 Normal_World_Q60;vec3 Normal_World_N_Q60;float Normal_Length_Q60;Object_To_World_Dir_B60(vec3(0,0,1),Normal_World_Q60,Normal_World_N_Q60,Normal_Length_Q60);float X_Q78;float Y_Q78;float Z_Q78;To_XYZ_B78(position,X_Q78,Y_Q78,Z_Q78);vec3 Nrm_World_Q26;Nrm_World_Q26=normalize((world*vec4(normal,0.0)).xyz);vec3 Binormal_World_Q28;vec3 Binormal_World_N_Q28;float Binormal_Length_Q28;Object_To_World_Dir_B28(vec3(0,1,0),Binormal_World_Q28,Binormal_World_N_Q28,Binormal_Length_Q28);float Anisotropy_Q29=Tangent_Length_Q27/Binormal_Length_Q28;float Result_Q69;Pick_Radius_B69(_Radius_,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q69);float Anisotropy_Q53=Binormal_Length_Q28/Normal_Length_Q60;bool Not_Greater_Than_Q37;bool Greater_Than_Q37;Greater_Than_B37(Z_Q78,0.0,Not_Greater_Than_Q37,Greater_Than_Q37);vec4 Linear_Q101;Linear_Q101.rgb=clamp(_Left_Color_.rgb*_Left_Color_.rgb,0.0,1.0);Linear_Q101.a=_Left_Color_.a;vec4 Linear_Q102;Linear_Q102.rgb=clamp(_Right_Color_.rgb*_Right_Color_.rgb,0.0,1.0);Linear_Q102.a=_Right_Color_.a;vec3 Difference_Q61=vec3(0,0,0)-Normal_World_N_Q60;vec4 Out_Color_Q34=vec4(X_Q78,Y_Q78,Z_Q78,1);float Result_Q36;Conditional_Float_B36(Greater_Than_Q37,_Bevel_Back_,_Bevel_Front_,Result_Q36);float Result_Q94;Conditional_Float_B36(Greater_Than_Q37,_Bevel_Back_Stretch_,_Bevel_Front_Stretch_,Result_Q94);vec3 New_P_Q130;vec2 New_UV_Q130;float Radial_Gradient_Q130;vec3 Radial_Dir_Q130;vec3 New_Normal_Q130;Move_Verts_B130(Anisotropy_Q29,position,Result_Q69,Result_Q36,normal,Anisotropy_Q53,Result_Q94,New_P_Q130,New_UV_Q130,Radial_Gradient_Q130,Radial_Dir_Q130,New_Normal_Q130);float X_Q98;float Y_Q98;X_Q98=New_UV_Q130.x;Y_Q98=New_UV_Q130.y;vec3 Pos_World_Q12;Object_To_World_Pos_B12(New_P_Q130,Pos_World_Q12);vec3 Nrm_World_Q32;Object_To_World_Normal_B32(New_Normal_Q130,Nrm_World_Q32);vec4 Blob_Info_Q23;+#if BLOB_ENABLE+Blob_Vertex_B23(Pos_World_Q12,Nrm_World_Q26,Tangent_World_N_Q27,Binormal_World_N_Q28,_Blob_Position_,_Blob_Intensity_,_Blob_Near_Size_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_,_Blob_Fade_,Blob_Info_Q23);+#else+Blob_Info_Q23=vec4(0,0,0,0);+#endif+vec4 Blob_Info_Q24;+#if BLOB_ENABLE_2+Blob_Vertex_B24(Pos_World_Q12,Nrm_World_Q26,Tangent_World_N_Q27,Binormal_World_N_Q28,_Blob_Position_2_,_Blob_Intensity_,_Blob_Near_Size_2_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_2_,_Blob_Fade_2_,Blob_Info_Q24);+#else+Blob_Info_Q24=vec4(0,0,0,0);+#endif+float Out_Q105;Remap_Range_B105(0.0,1.0,0.0,1.0,X_Q98,Out_Q105);float X_Q86;float Y_Q86;float Z_Q86;To_XYZ_B78(Nrm_World_Q32,X_Q86,Y_Q86,Z_Q86);vec4 Color_At_T_Q97=mix(Linear_Q101,Linear_Q102,Out_Q105);float Minus_F_Q87=-Z_Q86;float R_Q99;float G_Q99;float B_Q99;float A_Q99;R_Q99=Color_At_T_Q97.r; G_Q99=Color_At_T_Q97.g; B_Q99=Color_At_T_Q97.b; A_Q99=Color_At_T_Q97.a;float ClampF_Q88=clamp(0.0,Minus_F_Q87,1.0);float Result_Q93;Conditional_Float_B93(_Decal_Front_Only_,ClampF_Q88,1.0,Result_Q93);vec4 Vec4_Q89=vec4(Result_Q93,Radial_Gradient_Q130,G_Q99,B_Q99);vec3 Position=Pos_World_Q12;vec3 Normal=Nrm_World_Q32;vec2 UV=XY_Q85;vec3 Tangent=Tangent_World_N_Q27;vec3 Binormal=Difference_Q61;vec4 Color=Out_Color_Q34;vec4 Extra1=Vec4_Q89;vec4 Extra2=Blob_Info_Q23;vec4 Extra3=Blob_Info_Q24;gl_Position=viewProjection*vec4(Position,1);vPosition=Position;vNormal=Normal;vUV=UV;vTangent=Tangent;vBinormal=Binormal;vColor=Color;vExtra1=Extra1;vExtra2=Extra2;vExtra3=Extra3;}`;+br.ShadersStore[O4] || (br.ShadersStore[O4] = hF);+class pF extends hc {+ constructor() {+ super(), this.SKY_ENABLED = !0, this.BLOB_ENABLE_2 = !0, this.IRIDESCENCE_ENABLED = !0, this._needNormals = !0, this._needUVs = !0, this.rebuild();+ }+}+class At extends uc {+ constructor(i, d) {+ super(i, d), this.radius = 0.6, this.bevelFront = 0.6, this.bevelFrontStretch = 0.077, this.bevelBack = 0, this.bevelBackStretch = 0, this.radiusTopLeft = 1, this.radiusTopRight = 1, this.radiusBottomLeft = 1, this.radiusBottomRight = 1, this.bulgeEnabled = !1, this.bulgeHeight = -0.323, this.bulgeRadius = 0.73, this.sunIntensity = 1.102, this.sunTheta = 0.76, this.sunPhi = 0.526, this.indirectDiffuse = 0.658, this.albedo = new Gr(0.0117647, 0.505882, 0.996078, 1), this.specular = 0, this.shininess = 10, this.sharpness = 0, this.subsurface = 0, this.leftGradientColor = new Gr(0.0117647, 0.505882, 0.996078, 1), this.rightGradientColor = new Gr(0.0117647, 0.505882, 0.996078, 1), this.reflection = 0.749, this.frontReflect = 0, this.edgeReflect = 0.09, this.power = 8.13, this.skyColor = new Gr(0.0117647, 0.964706, 0.996078, 1), this.horizonColor = new Gr(0.0117647, 0.333333, 0.996078, 1), this.groundColor = new Gr(0, 0.254902, 0.996078, 1), this.horizonPower = 1, this.width = 0.02, this.fuzz = 0.5, this.minFuzz = 1e-3, this.clipFade = 0.01, this.hueShift = 0, this.saturationShift = 0, this.valueShift = 0, this.blobPosition = new Se(0, 0, 0.1), this.blobIntensity = 0.5, this.blobNearSize = 0.01, this.blobFarSize = 0.03, this.blobNearDistance = 0, this.blobFarDistance = 0.08, this.blobFadeLength = 0.576, this.blobPulse = 0, this.blobFade = 1, this.blobPosition2 = new Se(0.2, 0, 0.1), this.blobNearSize2 = 0.01, this.blobPulse2 = 0, this.blobFade2 = 1, this.blobTexture = new Wr("", this.getScene()), this.leftIndexPosition = new Se(0, 0, 1), this.rightIndexPosition = new Se(-1, -1, -1), this.leftIndexMiddlePosition = new Se(0, 0, 0), this.rightIndexMiddlePosition = new Se(0, 0, 0), this.decalScaleXY = new mo(1.5, 1.5), this.decalFrontOnly = !0, this.rimIntensity = 0.287, this.rimHueShift = 0, this.rimSaturationShift = 0, this.rimValueShift = -1, this.iridescenceIntensity = 0, this.useGlobalLeftIndex = 1, this.useGlobalRightIndex = 1, this.globalLeftIndexTipProximity = 0, this.globalRightIndexTipProximity = 0, this.globalLeftIndexTipPosition = new fi(0.5, 0, -0.55, 1), this.globaRightIndexTipPosition = new fi(0, 0, 0, 1), this.globalLeftThumbTipPosition = new fi(0.5, 0, -0.55, 1), this.globalRightThumbTipPosition = new fi(0, 0, 0, 1), this.globalLeftIndexMiddlePosition = new fi(0.5, 0, -0.55, 1), this.globalRightIndexMiddlePosition = new fi(0, 0, 0, 1), this.alphaMode = Is.ALPHA_DISABLE, this.backFaceCulling = !1;+ const g = Lr.GetAssetUrl(At.BLUE_GRADIENT_TEXTURE_URL);+ this._blueGradientTexture = new Wr(g, this.getScene(), !0, !1, Wr.NEAREST_SAMPLINGMODE), this._decalTexture = new Wr("", this.getScene()), this._reflectionMapTexture = new Wr("", this.getScene()), this._indirectEnvTexture = new Wr("", this.getScene());+ }+ needAlphaBlending() {+ return !1;+ }+ needAlphaTesting() {+ return !1;+ }+ getAlphaTestTexture() {+ return null;+ }+ // Methods+ isReadyForSubMesh(i, d) {+ const g = d._drawWrapper;+ if (this.isFrozen && g.effect && g._wasPreviouslyReady)+ return !0;+ d.materialDefines || (d.materialDefines = new pF());+ const y = d.materialDefines, M = this.getScene();+ if (!this._blueGradientTexture.isReady())+ return !1;+ if (this._isReadyForSubMesh(d))+ return !0;+ const N = M.getEngine();+ if (vd(i, y, !1, !1), y.isDirty) {+ y.markAsProcessed(), M.resetCachedMaterial();+ const O = new _d();+ y.FOG && O.addFallback(1, "FOG"), wd(y, O), y.IMAGEPROCESSINGPOSTPROCESS = M.imageProcessingConfiguration.applyByPostProcess;+ const F = [Yt.PositionKind];+ y.NORMAL && F.push(Yt.NormalKind), y.UV1 && F.push(Yt.UVKind), y.UV2 && F.push(Yt.UV2Kind), y.VERTEXCOLOR && F.push(Yt.ColorKind), y.TANGENT && F.push(Yt.TangentKind), yd(F, y);+ const ne = "mrdlSliderBar", $ = y.toString(), Q = [+ "world",+ "viewProjection",+ "cameraPosition",+ "_Radius_",+ "_Bevel_Front_",+ "_Bevel_Front_Stretch_",+ "_Bevel_Back_",+ "_Bevel_Back_Stretch_",+ "_Radius_Top_Left_",+ "_Radius_Top_Right_",+ "_Radius_Bottom_Left_",+ "_Radius_Bottom_Right_",+ "_Bulge_Enabled_",+ "_Bulge_Height_",+ "_Bulge_Radius_",+ "_Sun_Intensity_",+ "_Sun_Theta_",+ "_Sun_Phi_",+ "_Indirect_Diffuse_",+ "_Albedo_",+ "_Specular_",+ "_Shininess_",+ "_Sharpness_",+ "_Subsurface_",+ "_Left_Color_",+ "_Right_Color_",+ "_Reflection_",+ "_Front_Reflect_",+ "_Edge_Reflect_",+ "_Power_",+ "_Sky_Color_",+ "_Horizon_Color_",+ "_Ground_Color_",+ "_Horizon_Power_",+ "_Reflection_Map_",+ "_Indirect_Environment_",+ "_Width_",+ "_Fuzz_",+ "_Min_Fuzz_",+ "_Clip_Fade_",+ "_Hue_Shift_",+ "_Saturation_Shift_",+ "_Value_Shift_",+ "_Blob_Position_",+ "_Blob_Intensity_",+ "_Blob_Near_Size_",+ "_Blob_Far_Size_",+ "_Blob_Near_Distance_",+ "_Blob_Far_Distance_",+ "_Blob_Fade_Length_",+ "_Blob_Pulse_",+ "_Blob_Fade_",+ "_Blob_Texture_",+ "_Blob_Position_2_",+ "_Blob_Near_Size_2_",+ "_Blob_Pulse_2_",+ "_Blob_Fade_2_",+ "_Left_Index_Pos_",+ "_Right_Index_Pos_",+ "_Left_Index_Middle_Pos_",+ "_Right_Index_Middle_Pos_",+ "_Decal_",+ "_Decal_Scale_XY_",+ "_Decal_Front_Only_",+ "_Rim_Intensity_",+ "_Rim_Texture_",+ "_Rim_Hue_Shift_",+ "_Rim_Saturation_Shift_",+ "_Rim_Value_Shift_",+ "_Iridescence_Intensity_",+ "_Iridescence_Texture_",+ "Use_Global_Left_Index",+ "Use_Global_Right_Index",+ "Global_Left_Index_Tip_Position",+ "Global_Right_Index_Tip_Position",+ "Global_Left_Thumb_Tip_Position",+ "Global_Right_Thumb_Tip_Position",+ "Global_Left_Index_Middle_Position;",+ "Global_Right_Index_Middle_Position",+ "Global_Left_Index_Tip_Proximity",+ "Global_Right_Index_Tip_Proximity"+ ], X = ["_Rim_Texture_", "_Iridescence_Texture_"], he = [];+ fc({+ uniformsNames: Q,+ uniformBuffersNames: he,+ samplers: X,+ defines: y,+ maxSimultaneousLights: 4+ }), d.setEffect(M.getEngine().createEffect(ne, {+ attributes: F,+ uniformsNames: Q,+ uniformBuffersNames: he,+ samplers: X,+ defines: $,+ fallbacks: O,+ onCompiled: this.onCompiled,+ onError: this.onError,+ indexParameters: { maxSimultaneousLights: 4 }+ }, N), y, this._materialContext);+ }+ return !d.effect || !d.effect.isReady() ? !1 : (y._renderId = M.getRenderId(), g._wasPreviouslyReady = !0, !0);+ }+ bindForSubMesh(i, d, g) {+ if (!g.materialDefines)+ return;+ const M = g.effect;+ M && (this._activeEffect = M, this.bindOnlyWorldMatrix(i), this._activeEffect.setMatrix("viewProjection", this.getScene().getTransformMatrix()), this._activeEffect.setVector3("cameraPosition", this.getScene().activeCamera.position), this._activeEffect.setFloat("_Radius_", this.radius), this._activeEffect.setFloat("_Bevel_Front_", this.bevelFront), this._activeEffect.setFloat("_Bevel_Front_Stretch_", this.bevelFrontStretch), this._activeEffect.setFloat("_Bevel_Back_", this.bevelBack), this._activeEffect.setFloat("_Bevel_Back_Stretch_", this.bevelBackStretch), this._activeEffect.setFloat("_Radius_Top_Left_", this.radiusTopLeft), this._activeEffect.setFloat("_Radius_Top_Right_", this.radiusTopRight), this._activeEffect.setFloat("_Radius_Bottom_Left_", this.radiusBottomLeft), this._activeEffect.setFloat("_Radius_Bottom_Right_", this.radiusBottomRight), this._activeEffect.setFloat("_Bulge_Enabled_", this.bulgeEnabled ? 1 : 0), this._activeEffect.setFloat("_Bulge_Height_", this.bulgeHeight), this._activeEffect.setFloat("_Bulge_Radius_", this.bulgeRadius), this._activeEffect.setFloat("_Sun_Intensity_", this.sunIntensity), this._activeEffect.setFloat("_Sun_Theta_", this.sunTheta), this._activeEffect.setFloat("_Sun_Phi_", this.sunPhi), this._activeEffect.setFloat("_Indirect_Diffuse_", this.indirectDiffuse), this._activeEffect.setDirectColor4("_Albedo_", this.albedo), this._activeEffect.setFloat("_Specular_", this.specular), this._activeEffect.setFloat("_Shininess_", this.shininess), this._activeEffect.setFloat("_Sharpness_", this.sharpness), this._activeEffect.setFloat("_Subsurface_", this.subsurface), this._activeEffect.setDirectColor4("_Left_Color_", this.leftGradientColor), this._activeEffect.setDirectColor4("_Right_Color_", this.rightGradientColor), this._activeEffect.setFloat("_Reflection_", this.reflection), this._activeEffect.setFloat("_Front_Reflect_", this.frontReflect), this._activeEffect.setFloat("_Edge_Reflect_", this.edgeReflect), this._activeEffect.setFloat("_Power_", this.power), this._activeEffect.setDirectColor4("_Sky_Color_", this.skyColor), this._activeEffect.setDirectColor4("_Horizon_Color_", this.horizonColor), this._activeEffect.setDirectColor4("_Ground_Color_", this.groundColor), this._activeEffect.setFloat("_Horizon_Power_", this.horizonPower), this._activeEffect.setTexture("_Reflection_Map_", this._reflectionMapTexture), this._activeEffect.setTexture("_Indirect_Environment_", this._indirectEnvTexture), this._activeEffect.setFloat("_Width_", this.width), this._activeEffect.setFloat("_Fuzz_", this.fuzz), this._activeEffect.setFloat("_Min_Fuzz_", this.minFuzz), this._activeEffect.setFloat("_Clip_Fade_", this.clipFade), this._activeEffect.setFloat("_Hue_Shift_", this.hueShift), this._activeEffect.setFloat("_Saturation_Shift_", this.saturationShift), this._activeEffect.setFloat("_Value_Shift_", this.valueShift), this._activeEffect.setVector3("_Blob_Position_", this.blobPosition), this._activeEffect.setFloat("_Blob_Intensity_", this.blobIntensity), this._activeEffect.setFloat("_Blob_Near_Size_", this.blobNearSize), this._activeEffect.setFloat("_Blob_Far_Size_", this.blobFarSize), this._activeEffect.setFloat("_Blob_Near_Distance_", this.blobNearDistance), this._activeEffect.setFloat("_Blob_Far_Distance_", this.blobFarDistance), this._activeEffect.setFloat("_Blob_Fade_Length_", this.blobFadeLength), this._activeEffect.setFloat("_Blob_Pulse_", this.blobPulse), this._activeEffect.setFloat("_Blob_Fade_", this.blobFade), this._activeEffect.setTexture("_Blob_Texture_", this.blobTexture), this._activeEffect.setVector3("_Blob_Position_2_", this.blobPosition2), this._activeEffect.setFloat("_Blob_Near_Size_2_", this.blobNearSize2), this._activeEffect.setFloat("_Blob_Pulse_2_", this.blobPulse2), this._activeEffect.setFloat("_Blob_Fade_2_", this.blobFade2), this._activeEffect.setVector3("_Left_Index_Pos_", this.leftIndexPosition), this._activeEffect.setVector3("_Right_Index_Pos_", this.rightIndexPosition), this._activeEffect.setVector3("_Left_Index_Middle_Pos_", this.leftIndexMiddlePosition), this._activeEffect.setVector3("_Right_Index_Middle_Pos_", this.rightIndexMiddlePosition), this._activeEffect.setTexture("_Decal_", this._decalTexture), this._activeEffect.setVector2("_Decal_Scale_XY_", this.decalScaleXY), this._activeEffect.setFloat("_Decal_Front_Only_", this.decalFrontOnly ? 1 : 0), this._activeEffect.setFloat("_Rim_Intensity_", this.rimIntensity), this._activeEffect.setTexture("_Rim_Texture_", this._blueGradientTexture), this._activeEffect.setFloat("_Rim_Hue_Shift_", this.rimHueShift), this._activeEffect.setFloat("_Rim_Saturation_Shift_", this.rimSaturationShift), this._activeEffect.setFloat("_Rim_Value_Shift_", this.rimValueShift), this._activeEffect.setFloat("_Iridescence_Intensity_", this.iridescenceIntensity), this._activeEffect.setTexture("_Iridescence_Texture_", this._blueGradientTexture), this._activeEffect.setFloat("Use_Global_Left_Index", this.useGlobalLeftIndex), this._activeEffect.setFloat("Use_Global_Right_Index", this.useGlobalRightIndex), this._activeEffect.setVector4("Global_Left_Index_Tip_Position", this.globalLeftIndexTipPosition), this._activeEffect.setVector4("Global_Right_Index_Tip_Position", this.globaRightIndexTipPosition), this._activeEffect.setVector4("Global_Left_Thumb_Tip_Position", this.globalLeftThumbTipPosition), this._activeEffect.setVector4("Global_Right_Thumb_Tip_Position", this.globalRightThumbTipPosition), this._activeEffect.setVector4("Global_Left_Index_Middle_Position", this.globalLeftIndexMiddlePosition), this._activeEffect.setVector4("Global_Right_Index_Middle_Position", this.globalRightIndexMiddlePosition), this._activeEffect.setFloat("Global_Left_Index_Tip_Proximity", this.globalLeftIndexTipProximity), this._activeEffect.setFloat("Global_Right_Index_Tip_Proximity", this.globalRightIndexTipProximity), this._afterBind(d, this._activeEffect, g));+ }+ /**+ * Get the list of animatables in the material.+ * @returns the list of animatables object used in the material+ */+ getAnimatables() {+ return [];+ }+ dispose(i) {+ super.dispose(i), this._reflectionMapTexture.dispose(), this._indirectEnvTexture.dispose(), this._blueGradientTexture.dispose(), this._decalTexture.dispose();+ }+ clone(i) {+ return Eo.Clone(() => new At(i, this.getScene()), this);+ }+ serialize() {+ const i = super.serialize();+ return i.customType = "BABYLON.MRDLSliderBarMaterial", i;+ }+ getClassName() {+ return "MRDLSliderBarMaterial";+ }+ // Statics+ static Parse(i, d, g) {+ return Eo.Parse(() => new At(i.name, d), i, d, g);+ }+}+At.BLUE_GRADIENT_TEXTURE_URL = "https://assets.babylonjs.com/core/MRTK/MRDL/mrtk-mrdl-blue-gradient.png";+q([+ H()+], At.prototype, "radius", void 0);+q([+ H()+], At.prototype, "bevelFront", void 0);+q([+ H()+], At.prototype, "bevelFrontStretch", void 0);+q([+ H()+], At.prototype, "bevelBack", void 0);+q([+ H()+], At.prototype, "bevelBackStretch", void 0);+q([+ H()+], At.prototype, "radiusTopLeft", void 0);+q([+ H()+], At.prototype, "radiusTopRight", void 0);+q([+ H()+], At.prototype, "radiusBottomLeft", void 0);+q([+ H()+], At.prototype, "radiusBottomRight", void 0);+q([+ H()+], At.prototype, "bulgeEnabled", void 0);+q([+ H()+], At.prototype, "bulgeHeight", void 0);+q([+ H()+], At.prototype, "bulgeRadius", void 0);+q([+ H()+], At.prototype, "sunIntensity", void 0);+q([+ H()+], At.prototype, "sunTheta", void 0);+q([+ H()+], At.prototype, "sunPhi", void 0);+q([+ H()+], At.prototype, "indirectDiffuse", void 0);+q([+ H()+], At.prototype, "albedo", void 0);+q([+ H()+], At.prototype, "specular", void 0);+q([+ H()+], At.prototype, "shininess", void 0);+q([+ H()+], At.prototype, "sharpness", void 0);+q([+ H()+], At.prototype, "subsurface", void 0);+q([+ H()+], At.prototype, "leftGradientColor", void 0);+q([+ H()+], At.prototype, "rightGradientColor", void 0);+q([+ H()+], At.prototype, "reflection", void 0);+q([+ H()+], At.prototype, "frontReflect", void 0);+q([+ H()+], At.prototype, "edgeReflect", void 0);+q([+ H()+], At.prototype, "power", void 0);+q([+ H()+], At.prototype, "skyColor", void 0);+q([+ H()+], At.prototype, "horizonColor", void 0);+q([+ H()+], At.prototype, "groundColor", void 0);+q([+ H()+], At.prototype, "horizonPower", void 0);+q([+ H()+], At.prototype, "width", void 0);+q([+ H()+], At.prototype, "fuzz", void 0);+q([+ H()+], At.prototype, "minFuzz", void 0);+q([+ H()+], At.prototype, "clipFade", void 0);+q([+ H()+], At.prototype, "hueShift", void 0);+q([+ H()+], At.prototype, "saturationShift", void 0);+q([+ H()+], At.prototype, "valueShift", void 0);+q([+ H()+], At.prototype, "blobPosition", void 0);+q([+ H()+], At.prototype, "blobIntensity", void 0);+q([+ H()+], At.prototype, "blobNearSize", void 0);+q([+ H()+], At.prototype, "blobFarSize", void 0);+q([+ H()+], At.prototype, "blobNearDistance", void 0);+q([+ H()+], At.prototype, "blobFarDistance", void 0);+q([+ H()+], At.prototype, "blobFadeLength", void 0);+q([+ H()+], At.prototype, "blobPulse", void 0);+q([+ H()+], At.prototype, "blobFade", void 0);+q([+ H()+], At.prototype, "blobPosition2", void 0);+q([+ H()+], At.prototype, "blobNearSize2", void 0);+q([+ H()+], At.prototype, "blobPulse2", void 0);+q([+ H()+], At.prototype, "blobFade2", void 0);+q([+ H()+], At.prototype, "blobTexture", void 0);+q([+ H()+], At.prototype, "leftIndexPosition", void 0);+q([+ H()+], At.prototype, "rightIndexPosition", void 0);+q([+ H()+], At.prototype, "leftIndexMiddlePosition", void 0);+q([+ H()+], At.prototype, "rightIndexMiddlePosition", void 0);+q([+ H()+], At.prototype, "decalScaleXY", void 0);+q([+ H()+], At.prototype, "decalFrontOnly", void 0);+q([+ H()+], At.prototype, "rimIntensity", void 0);+q([+ H()+], At.prototype, "rimHueShift", void 0);+q([+ H()+], At.prototype, "rimSaturationShift", void 0);+q([+ H()+], At.prototype, "rimValueShift", void 0);+q([+ H()+], At.prototype, "iridescenceIntensity", void 0);+kr("BABYLON.GUI.MRDLSliderBarMaterial", At);+const R4 = "mrdlSliderThumbPixelShader", gF = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;uniform float _Radius_;uniform float _Bevel_Front_;uniform float _Bevel_Front_Stretch_;uniform float _Bevel_Back_;uniform float _Bevel_Back_Stretch_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform bool _Bulge_Enabled_;uniform float _Bulge_Height_;uniform float _Bulge_Radius_;uniform float _Sun_Intensity_;uniform float _Sun_Theta_;uniform float _Sun_Phi_;uniform float _Indirect_Diffuse_;uniform vec4 _Albedo_;uniform float _Specular_;uniform float _Shininess_;uniform float _Sharpness_;uniform float _Subsurface_;uniform vec4 _Left_Color_;uniform vec4 _Right_Color_;uniform float _Reflection_;uniform float _Front_Reflect_;uniform float _Edge_Reflect_;uniform float _Power_;uniform vec4 _Sky_Color_;uniform vec4 _Horizon_Color_;uniform vec4 _Ground_Color_;uniform float _Horizon_Power_;uniform sampler2D _Reflection_Map_;uniform sampler2D _Indirect_Environment_;uniform float _Width_;uniform float _Fuzz_;uniform float _Min_Fuzz_;uniform float _Clip_Fade_;uniform float _Hue_Shift_;uniform float _Saturation_Shift_;uniform float _Value_Shift_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Left_Index_Pos_;uniform vec3 _Right_Index_Pos_;uniform vec3 _Left_Index_Middle_Pos_;uniform vec3 _Right_Index_Middle_Pos_;uniform sampler2D _Decal_;uniform vec2 _Decal_Scale_XY_;uniform bool _Decal_Front_Only_;uniform float _Rim_Intensity_;uniform sampler2D _Rim_Texture_;uniform float _Rim_Hue_Shift_;uniform float _Rim_Saturation_Shift_;uniform float _Rim_Value_Shift_;uniform float _Iridescence_Intensity_;uniform sampler2D _Iridescence_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform vec4 Global_Left_Index_Middle_Position;uniform vec4 Global_Right_Index_Middle_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;void Blob_Fragment_B180(+sampler2D Blob_Texture,+vec4 Blob_Info1,+vec4 Blob_Info2,+out vec4 Blob_Color)+{float k1=dot(Blob_Info1.xy,Blob_Info1.xy);float k2=dot(Blob_Info2.xy,Blob_Info2.xy);vec3 closer=k1<k2 ? vec3(k1,Blob_Info1.z,Blob_Info1.w) : vec3(k2,Blob_Info2.z,Blob_Info2.w);Blob_Color=closer.z*texture(Blob_Texture,vec2(vec2(sqrt(closer.x),closer.y).x,1.0-vec2(sqrt(closer.x),closer.y).y))*clamp(1.0-closer.x,0.0,1.0);}+void FastLinearTosRGB_B192(+vec4 Linear,+out vec4 sRGB)+{sRGB.rgb=sqrt(clamp(Linear.rgb,0.0,1.0));sRGB.a=Linear.a;}+void Scale_RGB_B209(+vec4 Color,+float Scalar,+out vec4 Result)+{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}+void Fragment_Main_B271(+float Sun_Intensity,+float Sun_Theta,+float Sun_Phi,+vec3 Normal,+vec4 Albedo,+float Fresnel_Reflect,+float Shininess,+vec3 Incident,+vec4 Horizon_Color,+vec4 Sky_Color,+vec4 Ground_Color,+float Indirect_Diffuse,+float Specular,+float Horizon_Power,+float Reflection,+vec4 Reflection_Sample,+vec4 Indirect_Sample,+float Sharpness,+float SSS,+float Subsurface,+vec4 Translucence,+vec4 Rim_Light,+vec4 Iridescence,+out vec4 Result)+{float theta=Sun_Theta*2.0*3.14159;float phi=Sun_Phi*3.14159;vec3 lightDir= vec3(cos(phi)*cos(theta),sin(phi),cos(phi)*sin(theta));float NdotL=max(dot(lightDir,Normal),0.0);vec3 R=reflect(Incident,Normal);float RdotL=max(0.0,dot(R,lightDir));float specular=pow(RdotL,Shininess);specular=mix(specular,smoothstep(0.495*Sharpness,1.0-0.495*Sharpness,specular),Sharpness);vec4 gi=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);Result=((Sun_Intensity*NdotL+Indirect_Sample*Indirect_Diffuse+Translucence)*(1.0+SSS*Subsurface))*Albedo*(1.0-Fresnel_Reflect)+(Sun_Intensity*specular*Specular+Fresnel_Reflect*Reflection*Reflection_Sample)+Fresnel_Reflect*Rim_Light+Iridescence;}+void Bulge_B229(+bool Enabled,+vec3 Normal,+vec3 Tangent,+float Bulge_Height,+vec4 UV,+float Bulge_Radius,+vec3 ButtonN,+out vec3 New_Normal)+{vec2 xy=clamp(UV.xy*2.0,vec2(-1,-1),vec2(1,1));vec3 B=(cross(Normal,Tangent));float k=-clamp(1.0-length(xy)/Bulge_Radius,0.0,1.0)*Bulge_Height;k=sin(k*3.14159*0.5);k*=smoothstep(0.9998,0.9999,abs(dot(ButtonN,Normal)));New_Normal=Normal*sqrt(1.0-k*k)+(xy.x*Tangent+xy.y*B)*k;New_Normal=Enabled ? New_Normal : Normal;}+void SSS_B227(+vec3 ButtonN,+vec3 Normal,+vec3 Incident,+out float Result)+{float NdotI=abs(dot(Normal,Incident));float BdotI=abs(dot(ButtonN,Incident));Result=(abs(NdotI-BdotI)); }+void FingerOcclusion_B217(+float Width,+float DistToCenter,+float Fuzz,+float Min_Fuzz,+vec3 Position,+vec3 Forward,+vec3 Nearest,+float Fade_Out,+out float NotInShadow)+{float d=dot((Nearest-Position),Forward);float sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);NotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);}+void FingerOcclusion_B218(+float Width,+float DistToCenter,+float Fuzz,+float Min_Fuzz,+vec3 Position,+vec3 Forward,+vec3 Nearest,+float Fade_Out,+out float NotInShadow)+{float d=dot((Nearest-Position),Forward);float sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);NotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);}+void Scale_Color_B241(+vec4 Color,+float Scalar,+out vec4 Result)+{Result=Scalar*Color;}+void From_HSV_B223(+float Hue,+float Saturation,+float Value,+float Alpha,+out vec4 Color)+{vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(vec3(Hue,Hue,Hue)+K.xyz)*6.0-K.www);Color.rgb=Value*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),Saturation);Color.a=Alpha;}+void Fast_Fresnel_B272(+float Front_Reflect,+float Edge_Reflect,+float Power,+vec3 Normal,+vec3 Incident,+out float Transmit,+out float Reflect)+{float d=max(-dot(Incident,Normal),0.0);Reflect=Front_Reflect+(Edge_Reflect-Front_Reflect)*pow(1.0-d,Power);Transmit=1.0-Reflect;}+void Mapped_Environment_B201(+sampler2D Reflected_Environment,+sampler2D Indirect_Environment,+vec3 Dir,+out vec4 Reflected_Color,+out vec4 Indirect_Diffuse)+{Reflected_Color=texture(Reflected_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));Indirect_Diffuse=texture(Indirect_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));}+vec4 SampleEnv_Bid200(vec3 D,vec4 S,vec4 H,vec4 G,float exponent)+{float k=pow(abs(D.y),exponent);vec4 C;if (D.y>0.0) {C=mix(H,S,k);} else {C=mix(H,G,k); }+return C;}+void Sky_Environment_B200(+vec3 Normal,+vec3 Reflected,+vec4 Sky_Color,+vec4 Horizon_Color,+vec4 Ground_Color,+float Horizon_Power,+out vec4 Reflected_Color,+out vec4 Indirect_Color)+{Reflected_Color=SampleEnv_Bid200(Reflected,Sky_Color,Horizon_Color,Ground_Color,Horizon_Power);Indirect_Color=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);}+void Min_Segment_Distance_B215(+vec3 P0,+vec3 P1,+vec3 Q0,+vec3 Q1,+out vec3 NearP,+out vec3 NearQ,+out float Distance)+{vec3 u=P1-P0;vec3 v=Q1-Q0;vec3 w=P0-Q0;float a=dot(u,u);float b=dot(u,v);float c=dot(v,v);float d=dot(u,w);float e=dot(v,w);float D=a*c-b*b;float sD=D;float tD=D;float sc,sN,tc,tN;if (D<0.00001) {sN=0.0;sD=1.0;tN=e;tD=c;} else {sN=(b*e-c*d);tN=(a*e-b*d);if (sN<0.0) {sN=0.0;tN=e;tD=c;} else if (sN>sD) {sN=sD;tN=e+b;tD=c;}}+if (tN<0.0) {tN=0.0;if (-d<0.0) {sN=0.0;} else if (-d>a) {sN=sD;} else {sN=-d;sD=a;}} else if (tN>tD) {tN=tD;if ((-d+b)<0.0) {sN=0.0;} else if ((-d+b)>a) {sN=sD;} else {sN=(-d+b);sD=a;}}+sc=abs(sN)<0.000001 ? 0.0 : sN/sD;tc=abs(tN)<0.000001 ? 0.0 : tN/tD;NearP=P0+sc*u;NearQ=Q0+tc*v;Distance=distance(NearP,NearQ);}+void To_XYZ_B224(+vec3 Vec3,+out float X,+out float Y,+out float Z)+{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}+void Finger_Positions_B214(+vec3 Left_Index_Pos,+vec3 Right_Index_Pos,+vec3 Left_Index_Middle_Pos,+vec3 Right_Index_Middle_Pos,+out vec3 Left_Index,+out vec3 Right_Index,+out vec3 Left_Index_Middle,+out vec3 Right_Index_Middle)+{Left_Index= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Left_Index_Pos);Right_Index= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Right_Index_Pos);Left_Index_Middle= (Use_Global_Left_Index ? Global_Left_Index_Middle_Position.xyz : Left_Index_Middle_Pos);Right_Index_Middle= (Use_Global_Right_Index ? Global_Right_Index_Middle_Position.xyz : Right_Index_Middle_Pos);}+void VaryHSV_B258(+vec3 HSV_In,+float Hue_Shift,+float Saturation_Shift,+float Value_Shift,+out vec3 HSV_Out)+{HSV_Out=vec3(fract(HSV_In.x+Hue_Shift),clamp(HSV_In.y+Saturation_Shift,0.0,1.0),clamp(HSV_In.z+Value_Shift,0.0,1.0));}+void Remap_Range_B264(+float In_Min,+float In_Max,+float Out_Min,+float Out_Max,+float In,+out float Out)+{Out=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));}+void To_HSV_B225(+vec4 Color,+out float Hue,+out float Saturation,+out float Value,+out float Alpha,+out vec3 HSV)+{vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=Color.g<Color.b ? vec4(Color.bg,K.wz) : vec4(Color.gb,K.xy);vec4 q=Color.r<p.x ? vec4(p.xyw,Color.r) : vec4(Color.r,p.yzx);float d=q.x-min(q.w,q.y);float e=1.0e-10;Hue=abs(q.z+(q.w-q.y)/(6.0*d+e));Saturation=d/(q.x+e);Value=q.x;Alpha=Color.a;HSV=vec3(Hue,Saturation,Value);}+void Code_B260(+float X,+out float Result)+{Result=(acos(X)/3.14159-0.5)*2.0;}+void Rim_Light_B282(+vec3 Front,+vec3 Normal,+vec3 Incident,+float Rim_Intensity,+sampler2D Texture,+out vec4 Result)+{vec3 R=reflect(Incident,Normal);float RdotF=dot(R,Front);float RdotL=sqrt(1.0-RdotF*RdotF);vec2 UV=vec2(R.y*0.5+0.5,0.5);vec4 Color=texture(Texture,UV);Result=Color;}+void main()+{vec4 Blob_Color_Q180;+#if BLOB_ENABLE+Blob_Fragment_B180(_Blob_Texture_,vExtra2,vExtra3,Blob_Color_Q180);+#else+Blob_Color_Q180=vec4(0,0,0,0);+#endif+vec3 Incident_Q189=normalize(vPosition-cameraPosition);vec3 Normalized_Q188=normalize(vNormal);vec3 Normalized_Q221=normalize(vTangent);vec4 Color_Q233;+#if DECAL_ENABLE+Color_Q233=texture(_Decal_,vUV);+#else+Color_Q233=vec4(0,0,0,0);+#endif+float X_Q240;float Y_Q240;float Z_Q240;float W_Q240;X_Q240=vExtra1.x;Y_Q240=vExtra1.y;Z_Q240=vExtra1.z;W_Q240=vExtra1.w;vec4 Linear_Q193;Linear_Q193.rgb=clamp(_Sky_Color_.rgb*_Sky_Color_.rgb,0.0,1.0);Linear_Q193.a=_Sky_Color_.a;vec4 Linear_Q194;Linear_Q194.rgb=clamp(_Horizon_Color_.rgb*_Horizon_Color_.rgb,0.0,1.0);Linear_Q194.a=_Horizon_Color_.a;vec4 Linear_Q195;Linear_Q195.rgb=clamp(_Ground_Color_.rgb*_Ground_Color_.rgb,0.0,1.0);Linear_Q195.a=_Ground_Color_.a;vec3 Left_Index_Q214;vec3 Right_Index_Q214;vec3 Left_Index_Middle_Q214;vec3 Right_Index_Middle_Q214;Finger_Positions_B214(_Left_Index_Pos_,_Right_Index_Pos_,_Left_Index_Middle_Pos_,_Right_Index_Middle_Pos_,Left_Index_Q214,Right_Index_Q214,Left_Index_Middle_Q214,Right_Index_Middle_Q214);vec4 Linear_Q196;Linear_Q196.rgb=clamp(_Albedo_.rgb*_Albedo_.rgb,0.0,1.0);Linear_Q196.a=_Albedo_.a;vec3 Normalized_Q257=normalize(vBinormal);vec3 Incident_Q220=normalize(vPosition-cameraPosition);vec3 New_Normal_Q229;Bulge_B229(_Bulge_Enabled_,Normalized_Q188,Normalized_Q221,_Bulge_Height_,vColor,_Bulge_Radius_,vBinormal,New_Normal_Q229);float Result_Q227;SSS_B227(vBinormal,New_Normal_Q229,Incident_Q189,Result_Q227);vec4 Result_Q241;Scale_Color_B241(Color_Q233,X_Q240,Result_Q241);float Transmit_Q272;float Reflect_Q272;Fast_Fresnel_B272(_Front_Reflect_,_Edge_Reflect_,_Power_,New_Normal_Q229,Incident_Q189,Transmit_Q272,Reflect_Q272);float Product_Q275=Y_Q240*Y_Q240;vec3 NearP_Q215;vec3 NearQ_Q215;float Distance_Q215;Min_Segment_Distance_B215(Left_Index_Q214,Left_Index_Middle_Q214,vPosition,cameraPosition,NearP_Q215,NearQ_Q215,Distance_Q215);vec3 NearP_Q213;vec3 NearQ_Q213;float Distance_Q213;Min_Segment_Distance_B215(Right_Index_Q214,Right_Index_Middle_Q214,vPosition,cameraPosition,NearP_Q213,NearQ_Q213,Distance_Q213);vec3 Reflected_Q197=reflect(Incident_Q189,New_Normal_Q229);vec4 Product_Q253=Linear_Q196*vec4(1,1,1,1);vec4 Result_Q282;Rim_Light_B282(Normalized_Q257,Normalized_Q188,Incident_Q220,_Rim_Intensity_,_Rim_Texture_,Result_Q282);float Dot_Q222=dot(Incident_Q220, Normalized_Q221);float MaxAB_Q273=max(Reflect_Q272,Product_Q275);float NotInShadow_Q217;+#if OCCLUSION_ENABLED+FingerOcclusion_B217(_Width_,Distance_Q215,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q215,_Clip_Fade_,NotInShadow_Q217);+#else+NotInShadow_Q217=1.0;+#endif+float NotInShadow_Q218;+#if OCCLUSION_ENABLED+FingerOcclusion_B218(_Width_,Distance_Q213,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q213,_Clip_Fade_,NotInShadow_Q218);+#else+NotInShadow_Q218=1.0;+#endif+vec4 Reflected_Color_Q201;vec4 Indirect_Diffuse_Q201;+#if ENV_ENABLE+Mapped_Environment_B201(_Reflection_Map_,_Indirect_Environment_,Reflected_Q197,Reflected_Color_Q201,Indirect_Diffuse_Q201);+#else+Reflected_Color_Q201=vec4(0,0,0,1);Indirect_Diffuse_Q201=vec4(0,0,0,1);+#endif+vec4 Reflected_Color_Q200;vec4 Indirect_Color_Q200;+#if SKY_ENABLED+Sky_Environment_B200(New_Normal_Q229,Reflected_Q197,Linear_Q193,Linear_Q194,Linear_Q195,_Horizon_Power_,Reflected_Color_Q200,Indirect_Color_Q200);+#else+Reflected_Color_Q200=vec4(0,0,0,1);Indirect_Color_Q200=vec4(0,0,0,1);+#endif+float Hue_Q225;float Saturation_Q225;float Value_Q225;float Alpha_Q225;vec3 HSV_Q225;To_HSV_B225(Product_Q253,Hue_Q225,Saturation_Q225,Value_Q225,Alpha_Q225,HSV_Q225);float Hue_Q277;float Saturation_Q277;float Value_Q277;float Alpha_Q277;vec3 HSV_Q277;To_HSV_B225(Result_Q282,Hue_Q277,Saturation_Q277,Value_Q277,Alpha_Q277,HSV_Q277);float Result_Q260;Code_B260(Dot_Q222,Result_Q260);float AbsA_Q226=abs(Result_Q260);float MinAB_Q208=min(NotInShadow_Q217,NotInShadow_Q218);vec4 Sum_Q198=Reflected_Color_Q201+Reflected_Color_Q200;vec4 Sum_Q199=Indirect_Diffuse_Q201+Indirect_Color_Q200;vec3 HSV_Out_Q276;VaryHSV_B258(HSV_Q277,_Rim_Hue_Shift_,_Rim_Saturation_Shift_,_Rim_Value_Shift_,HSV_Out_Q276);float Out_Q264;Remap_Range_B264(-1.0,1.0,0.0,1.0,Result_Q260,Out_Q264);float Product_Q256;Product_Q256=AbsA_Q226*_Hue_Shift_;float X_Q278;float Y_Q278;float Z_Q278;To_XYZ_B224(HSV_Out_Q276,X_Q278,Y_Q278,Z_Q278);vec2 Vec2_Q262=vec2(Out_Q264,0.5);vec3 HSV_Out_Q258;VaryHSV_B258(HSV_Q225,Product_Q256,_Saturation_Shift_,_Value_Shift_,HSV_Out_Q258);vec4 Color_Q279;From_HSV_B223(X_Q278,Y_Q278,Z_Q278,0.0,Color_Q279);vec4 Color_Q261;+#if IRIDESCENCE_ENABLED+Color_Q261=texture(_Iridescence_Texture_,Vec2_Q262);+#else+Color_Q261=vec4(0,0,0,0);+#endif+float X_Q224;float Y_Q224;float Z_Q224;To_XYZ_B224(HSV_Out_Q258,X_Q224,Y_Q224,Z_Q224);vec4 Result_Q281=_Rim_Intensity_*Color_Q279;vec4 Result_Q263=_Iridescence_Intensity_*Color_Q261;vec4 Color_Q223;From_HSV_B223(X_Q224,Y_Q224,Z_Q224,0.0,Color_Q223);vec4 Result_Q234=Result_Q241+(1.0-Result_Q241.a)*Color_Q223;vec4 Result_Q271;Fragment_Main_B271(_Sun_Intensity_,_Sun_Theta_,_Sun_Phi_,New_Normal_Q229,Result_Q234,MaxAB_Q273,_Shininess_,Incident_Q189,_Horizon_Color_,_Sky_Color_,_Ground_Color_,_Indirect_Diffuse_,_Specular_,_Horizon_Power_,_Reflection_,Sum_Q198,Sum_Q199,_Sharpness_,Result_Q227,_Subsurface_,vec4(0,0,0,0),Result_Q281,Result_Q263,Result_Q271);vec4 Result_Q209;Scale_RGB_B209(Result_Q271,MinAB_Q208,Result_Q209);vec4 sRGB_Q192;FastLinearTosRGB_B192(Result_Q209,sRGB_Q192);vec4 Result_Q181=Blob_Color_Q180+(1.0-Blob_Color_Q180.a)*sRGB_Q192;vec4 Result_Q190=Result_Q181; Result_Q190.a=1.0;vec4 Out_Color=Result_Q190;float Clip_Threshold=0.001;bool To_sRGB=false;gl_FragColor=Out_Color;}`;+br.ShadersStore[R4] || (br.ShadersStore[R4] = gF);+const F4 = "mrdlSliderThumbVertexShader", mF = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;+#ifdef TANGENT+attribute vec3 tangent;+#else+const vec3 tangent=vec3(0.);+#endif+uniform float _Radius_;uniform float _Bevel_Front_;uniform float _Bevel_Front_Stretch_;uniform float _Bevel_Back_;uniform float _Bevel_Back_Stretch_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform bool _Bulge_Enabled_;uniform float _Bulge_Height_;uniform float _Bulge_Radius_;uniform float _Sun_Intensity_;uniform float _Sun_Theta_;uniform float _Sun_Phi_;uniform float _Indirect_Diffuse_;uniform vec4 _Albedo_;uniform float _Specular_;uniform float _Shininess_;uniform float _Sharpness_;uniform float _Subsurface_;uniform vec4 _Left_Color_;uniform vec4 _Right_Color_;uniform float _Reflection_;uniform float _Front_Reflect_;uniform float _Edge_Reflect_;uniform float _Power_;uniform vec4 _Sky_Color_;uniform vec4 _Horizon_Color_;uniform vec4 _Ground_Color_;uniform float _Horizon_Power_;uniform sampler2D _Reflection_Map_;uniform sampler2D _Indirect_Environment_;uniform float _Width_;uniform float _Fuzz_;uniform float _Min_Fuzz_;uniform float _Clip_Fade_;uniform float _Hue_Shift_;uniform float _Saturation_Shift_;uniform float _Value_Shift_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Left_Index_Pos_;uniform vec3 _Right_Index_Pos_;uniform vec3 _Left_Index_Middle_Pos_;uniform vec3 _Right_Index_Middle_Pos_;uniform sampler2D _Decal_;uniform vec2 _Decal_Scale_XY_;uniform bool _Decal_Front_Only_;uniform float _Rim_Intensity_;uniform sampler2D _Rim_Texture_;uniform float _Rim_Hue_Shift_;uniform float _Rim_Saturation_Shift_;uniform float _Rim_Value_Shift_;uniform float _Iridescence_Intensity_;uniform sampler2D _Iridescence_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;void Object_To_World_Pos_B162(+vec3 Pos_Object,+out vec3 Pos_World)+{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}+void Object_To_World_Normal_B182(+vec3 Nrm_Object,+out vec3 Nrm_World)+{Nrm_World=(vec4(Nrm_Object,0.0)).xyz;}+void Blob_Vertex_B173(+vec3 Position,+vec3 Normal,+vec3 Tangent,+vec3 Bitangent,+vec3 Blob_Position,+float Intensity,+float Blob_Near_Size,+float Blob_Far_Size,+float Blob_Near_Distance,+float Blob_Far_Distance,+float Blob_Fade_Length,+float Blob_Pulse,+float Blob_Fade,+out vec4 Blob_Info)+{vec3 blob= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Blob_Position);vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}+void Blob_Vertex_B174(+vec3 Position,+vec3 Normal,+vec3 Tangent,+vec3 Bitangent,+vec3 Blob_Position,+float Intensity,+float Blob_Near_Size,+float Blob_Far_Size,+float Blob_Near_Distance,+float Blob_Far_Distance,+float Blob_Fade_Length,+float Blob_Pulse,+float Blob_Fade,+out vec4 Blob_Info)+{vec3 blob= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Blob_Position);vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}+void Move_Verts_B280(+float Anisotropy,+vec3 P,+float Radius,+float Bevel,+vec3 Normal_Object,+float ScaleZ,+float Stretch,+out vec3 New_P,+out vec2 New_UV,+out float Radial_Gradient,+out vec3 Radial_Dir,+out vec3 New_Normal)+{vec2 UV=P.xy*2.0+0.5;vec2 center=clamp(UV,0.0,1.0);vec2 delta=UV-center;float deltad=(length(delta)*2.0);float f=(Bevel+(Radius-Bevel)*Stretch)/Radius;float innerd=clamp(deltad*2.0,0.0,1.0);float outerd=clamp(deltad*2.0-1.0,0.0,1.0);float bevelAngle=outerd*3.14159*0.5;float sinb=sin(bevelAngle);float cosb=cos(bevelAngle);float beveld=(1.0-f)*innerd+f*sinb;float br=outerd;vec2 r2=2.0*vec2(Radius/Anisotropy,Radius);float dir=P.z<0.0001 ? 1.0 : -1.0;New_UV=center+r2*((0.5-center)+normalize(delta+vec2(0.0,0.000001))*beveld*0.5);New_P=vec3(New_UV-0.5,P.z+dir*(1.0-cosb)*Bevel*ScaleZ);Radial_Gradient=clamp((deltad-0.5)*2.0,0.0,1.0);Radial_Dir=vec3(delta*r2,0.0);vec3 beveledNormal=cosb*Normal_Object+sinb*vec3(delta.x,delta.y,0.0);New_Normal=Normal_Object.z==0.0 ? Normal_Object : beveledNormal;}+void Object_To_World_Dir_B210(+vec3 Dir_Object,+out vec3 Normal_World,+out vec3 Normal_World_N,+out float Normal_Length)+{Normal_World=(world*vec4(Dir_Object,0.0)).xyz;Normal_Length=length(Normal_World);Normal_World_N=Normal_World/Normal_Length;}+void To_XYZ_B228(+vec3 Vec3,+out float X,+out float Y,+out float Z)+{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}+void Conditional_Float_B243(+bool Which,+float If_True,+float If_False,+out float Result)+{Result=Which ? If_True : If_False;}+void Object_To_World_Dir_B178(+vec3 Dir_Object,+out vec3 Binormal_World,+out vec3 Binormal_World_N,+out float Binormal_Length)+{Binormal_World=(world*vec4(Dir_Object,0.0)).xyz;Binormal_Length=length(Binormal_World);Binormal_World_N=Binormal_World/Binormal_Length;}+void Pick_Radius_B219(+float Radius,+float Radius_Top_Left,+float Radius_Top_Right,+float Radius_Bottom_Left,+float Radius_Bottom_Right,+vec3 Position,+out float Result)+{bool whichY=Position.y>0.0;Result=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);Result*=Radius;}+void Conditional_Float_B186(+bool Which,+float If_True,+float If_False,+out float Result)+{Result=Which ? If_True : If_False;}+void Greater_Than_B187(+float Left,+float Right,+out bool Not_Greater_Than,+out bool Greater_Than)+{Greater_Than=Left>Right;Not_Greater_Than=!Greater_Than;}+void Remap_Range_B255(+float In_Min,+float In_Max,+float Out_Min,+float Out_Max,+float In,+out float Out)+{Out=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));}+void main()+{vec2 XY_Q235;XY_Q235=(uv-vec2(0.5,0.5))*_Decal_Scale_XY_+vec2(0.5,0.5);vec3 Tangent_World_Q177;vec3 Tangent_World_N_Q177;float Tangent_Length_Q177;Tangent_World_Q177=(world*vec4(vec3(1,0,0),0.0)).xyz;Tangent_Length_Q177=length(Tangent_World_Q177);Tangent_World_N_Q177=Tangent_World_Q177/Tangent_Length_Q177;vec3 Normal_World_Q210;vec3 Normal_World_N_Q210;float Normal_Length_Q210;Object_To_World_Dir_B210(vec3(0,0,1),Normal_World_Q210,Normal_World_N_Q210,Normal_Length_Q210);float X_Q228;float Y_Q228;float Z_Q228;To_XYZ_B228(position,X_Q228,Y_Q228,Z_Q228);vec3 Nrm_World_Q176;Nrm_World_Q176=normalize((world*vec4(normal,0.0)).xyz);vec3 Binormal_World_Q178;vec3 Binormal_World_N_Q178;float Binormal_Length_Q178;Object_To_World_Dir_B178(vec3(0,1,0),Binormal_World_Q178,Binormal_World_N_Q178,Binormal_Length_Q178);float Anisotropy_Q179=Tangent_Length_Q177/Binormal_Length_Q178;float Result_Q219;Pick_Radius_B219(_Radius_,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q219);float Anisotropy_Q203=Binormal_Length_Q178/Normal_Length_Q210;bool Not_Greater_Than_Q187;bool Greater_Than_Q187;Greater_Than_B187(Z_Q228,0.0,Not_Greater_Than_Q187,Greater_Than_Q187);vec4 Linear_Q251;Linear_Q251.rgb=clamp(_Left_Color_.rgb*_Left_Color_.rgb,0.0,1.0);Linear_Q251.a=_Left_Color_.a;vec4 Linear_Q252;Linear_Q252.rgb=clamp(_Right_Color_.rgb*_Right_Color_.rgb,0.0,1.0);Linear_Q252.a=_Right_Color_.a;vec3 Difference_Q211=vec3(0,0,0)-Normal_World_N_Q210;vec4 Out_Color_Q184=vec4(X_Q228,Y_Q228,Z_Q228,1);float Result_Q186;Conditional_Float_B186(Greater_Than_Q187,_Bevel_Back_,_Bevel_Front_,Result_Q186);float Result_Q244;Conditional_Float_B186(Greater_Than_Q187,_Bevel_Back_Stretch_,_Bevel_Front_Stretch_,Result_Q244);vec3 New_P_Q280;vec2 New_UV_Q280;float Radial_Gradient_Q280;vec3 Radial_Dir_Q280;vec3 New_Normal_Q280;Move_Verts_B280(Anisotropy_Q179,position,Result_Q219,Result_Q186,normal,Anisotropy_Q203,Result_Q244,New_P_Q280,New_UV_Q280,Radial_Gradient_Q280,Radial_Dir_Q280,New_Normal_Q280);float X_Q248;float Y_Q248;X_Q248=New_UV_Q280.x;Y_Q248=New_UV_Q280.y;vec3 Pos_World_Q162;Object_To_World_Pos_B162(New_P_Q280,Pos_World_Q162);vec3 Nrm_World_Q182;Object_To_World_Normal_B182(New_Normal_Q280,Nrm_World_Q182);vec4 Blob_Info_Q173;+#if BLOB_ENABLE+Blob_Vertex_B173(Pos_World_Q162,Nrm_World_Q176,Tangent_World_N_Q177,Binormal_World_N_Q178,_Blob_Position_,_Blob_Intensity_,_Blob_Near_Size_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_,_Blob_Fade_,Blob_Info_Q173);+#else+Blob_Info_Q173=vec4(0,0,0,0);+#endif+vec4 Blob_Info_Q174;+#if BLOB_ENABLE_2+Blob_Vertex_B174(Pos_World_Q162,Nrm_World_Q176,Tangent_World_N_Q177,Binormal_World_N_Q178,_Blob_Position_2_,_Blob_Intensity_,_Blob_Near_Size_2_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_2_,_Blob_Fade_2_,Blob_Info_Q174);+#else+Blob_Info_Q174=vec4(0,0,0,0);+#endif+float Out_Q255;Remap_Range_B255(0.0,1.0,0.0,1.0,X_Q248,Out_Q255);float X_Q236;float Y_Q236;float Z_Q236;To_XYZ_B228(Nrm_World_Q182,X_Q236,Y_Q236,Z_Q236);vec4 Color_At_T_Q247=mix(Linear_Q251,Linear_Q252,Out_Q255);float Minus_F_Q237=-Z_Q236;float R_Q249;float G_Q249;float B_Q249;float A_Q249;R_Q249=Color_At_T_Q247.r; G_Q249=Color_At_T_Q247.g; B_Q249=Color_At_T_Q247.b; A_Q249=Color_At_T_Q247.a;float ClampF_Q238=clamp(0.0,Minus_F_Q237,1.0);float Result_Q243;Conditional_Float_B243(_Decal_Front_Only_,ClampF_Q238,1.0,Result_Q243);vec4 Vec4_Q239=vec4(Result_Q243,Radial_Gradient_Q280,G_Q249,B_Q249);vec3 Position=Pos_World_Q162;vec3 Normal=Nrm_World_Q182;vec2 UV=XY_Q235;vec3 Tangent=Tangent_World_N_Q177;vec3 Binormal=Difference_Q211;vec4 Color=Out_Color_Q184;vec4 Extra1=Vec4_Q239;vec4 Extra2=Blob_Info_Q173;vec4 Extra3=Blob_Info_Q174;gl_Position=viewProjection*vec4(Position,1);vPosition=Position;vNormal=Normal;vUV=UV;vTangent=Tangent;vBinormal=Binormal;vColor=Color;vExtra1=Extra1;vExtra2=Extra2;vExtra3=Extra3;}`;+br.ShadersStore[F4] || (br.ShadersStore[F4] = mF);+class bF extends hc {+ constructor() {+ super(), this.SKY_ENABLED = !0, this.BLOB_ENABLE_2 = !0, this.IRIDESCENCE_ENABLED = !0, this._needNormals = !0, this._needUVs = !0, this.rebuild();+ }+}+class Ct extends uc {+ constructor(i, d) {+ super(i, d), this.radius = 0.157, this.bevelFront = 0.065, this.bevelFrontStretch = 0.077, this.bevelBack = 0.031, this.bevelBackStretch = 0, this.radiusTopLeft = 1, this.radiusTopRight = 1, this.radiusBottomLeft = 1, this.radiusBottomRight = 1, this.bulgeEnabled = !1, this.bulgeHeight = -0.323, this.bulgeRadius = 0.73, this.sunIntensity = 2, this.sunTheta = 0.937, this.sunPhi = 0.555, this.indirectDiffuse = 1, this.albedo = new Gr(0.0117647, 0.505882, 0.996078, 1), this.specular = 0, this.shininess = 10, this.sharpness = 0, this.subsurface = 0.31, this.leftGradientColor = new Gr(0.0117647, 0.505882, 0.996078, 1), this.rightGradientColor = new Gr(0.0117647, 0.505882, 0.996078, 1), this.reflection = 0.749, this.frontReflect = 0, this.edgeReflect = 0.09, this.power = 8.1, this.skyColor = new Gr(0.0117647, 0.960784, 0.996078, 1), this.horizonColor = new Gr(0.0117647, 0.333333, 0.996078, 1), this.groundColor = new Gr(0, 0.254902, 0.996078, 1), this.horizonPower = 1, this.width = 0.02, this.fuzz = 0.5, this.minFuzz = 1e-3, this.clipFade = 0.01, this.hueShift = 0, this.saturationShift = 0, this.valueShift = 0, this.blobPosition = new Se(0, 0, 0.1), this.blobIntensity = 0.5, this.blobNearSize = 0.01, this.blobFarSize = 0.03, this.blobNearDistance = 0, this.blobFarDistance = 0.08, this.blobFadeLength = 0.576, this.blobPulse = 0, this.blobFade = 1, this.blobPosition2 = new Se(0.2, 0, 0.1), this.blobNearSize2 = 0.01, this.blobPulse2 = 0, this.blobFade2 = 1, this.blobTexture = new Wr("", this.getScene()), this.leftIndexPosition = new Se(0, 0, 1), this.rightIndexPosition = new Se(-1, -1, -1), this.leftIndexMiddlePosition = new Se(0, 0, 0), this.rightIndexMiddlePosition = new Se(0, 0, 0), this.decalScaleXY = new mo(1.5, 1.5), this.decalFrontOnly = !0, this.rimIntensity = 0.287, this.rimHueShift = 0, this.rimSaturationShift = 0, this.rimValueShift = -1, this.iridescenceIntensity = 0, this.useGlobalLeftIndex = 1, this.useGlobalRightIndex = 1, this.globalLeftIndexTipProximity = 0, this.globalRightIndexTipProximity = 0, this.globalLeftIndexTipPosition = new fi(0.5, 0, -0.55, 1), this.globaRightIndexTipPosition = new fi(0, 0, 0, 1), this.globalLeftThumbTipPosition = new fi(0.5, 0, -0.55, 1), this.globalRightThumbTipPosition = new fi(0, 0, 0, 1), this.globalLeftIndexMiddlePosition = new fi(0.5, 0, -0.55, 1), this.globalRightIndexMiddlePosition = new fi(0, 0, 0, 1), this.alphaMode = Is.ALPHA_DISABLE, this.backFaceCulling = !1;+ const g = Lr.GetAssetUrl(Ct.BLUE_GRADIENT_TEXTURE_URL);+ this._blueGradientTexture = new Wr(g, d, !0, !1, Wr.NEAREST_SAMPLINGMODE), this._decalTexture = new Wr("", this.getScene()), this._reflectionMapTexture = new Wr("", this.getScene()), this._indirectEnvTexture = new Wr("", this.getScene());+ }+ needAlphaBlending() {+ return !1;+ }+ needAlphaTesting() {+ return !1;+ }+ getAlphaTestTexture() {+ return null;+ }+ // Methods+ isReadyForSubMesh(i, d) {+ const g = d._drawWrapper;+ if (this.isFrozen && g.effect && g._wasPreviouslyReady)+ return !0;+ d.materialDefines || (d.materialDefines = new bF());+ const y = d.materialDefines, M = this.getScene();+ if (!this._blueGradientTexture.isReady())+ return !1;+ if (this._isReadyForSubMesh(d))+ return !0;+ const N = M.getEngine();+ if (vd(i, y, !1, !1), y.isDirty) {+ y.markAsProcessed(), M.resetCachedMaterial();+ const O = new _d();+ y.FOG && O.addFallback(1, "FOG"), wd(y, O), y.IMAGEPROCESSINGPOSTPROCESS = M.imageProcessingConfiguration.applyByPostProcess;+ const F = [Yt.PositionKind];+ y.NORMAL && F.push(Yt.NormalKind), y.UV1 && F.push(Yt.UVKind), y.UV2 && F.push(Yt.UV2Kind), y.VERTEXCOLOR && F.push(Yt.ColorKind), y.TANGENT && F.push(Yt.TangentKind), yd(F, y);+ const ne = "mrdlSliderThumb", $ = y.toString(), Q = [+ "world",+ "viewProjection",+ "cameraPosition",+ "_Radius_",+ "_Bevel_Front_",+ "_Bevel_Front_Stretch_",+ "_Bevel_Back_",+ "_Bevel_Back_Stretch_",+ "_Radius_Top_Left_",+ "_Radius_Top_Right_",+ "_Radius_Bottom_Left_",+ "_Radius_Bottom_Right_",+ "_Bulge_Enabled_",+ "_Bulge_Height_",+ "_Bulge_Radius_",+ "_Sun_Intensity_",+ "_Sun_Theta_",+ "_Sun_Phi_",+ "_Indirect_Diffuse_",+ "_Albedo_",+ "_Specular_",+ "_Shininess_",+ "_Sharpness_",+ "_Subsurface_",+ "_Left_Color_",+ "_Right_Color_",+ "_Reflection_",+ "_Front_Reflect_",+ "_Edge_Reflect_",+ "_Power_",+ "_Sky_Color_",+ "_Horizon_Color_",+ "_Ground_Color_",+ "_Horizon_Power_",+ "_Reflection_Map_",+ "_Indirect_Environment_",+ "_Width_",+ "_Fuzz_",+ "_Min_Fuzz_",+ "_Clip_Fade_",+ "_Hue_Shift_",+ "_Saturation_Shift_",+ "_Value_Shift_",+ "_Blob_Position_",+ "_Blob_Intensity_",+ "_Blob_Near_Size_",+ "_Blob_Far_Size_",+ "_Blob_Near_Distance_",+ "_Blob_Far_Distance_",+ "_Blob_Fade_Length_",+ "_Blob_Pulse_",+ "_Blob_Fade_",+ "_Blob_Texture_",+ "_Blob_Position_2_",+ "_Blob_Near_Size_2_",+ "_Blob_Pulse_2_",+ "_Blob_Fade_2_",+ "_Left_Index_Pos_",+ "_Right_Index_Pos_",+ "_Left_Index_Middle_Pos_",+ "_Right_Index_Middle_Pos_",+ "_Decal_",+ "_Decal_Scale_XY_",+ "_Decal_Front_Only_",+ "_Rim_Intensity_",+ "_Rim_Texture_",+ "_Rim_Hue_Shift_",+ "_Rim_Saturation_Shift_",+ "_Rim_Value_Shift_",+ "_Iridescence_Intensity_",+ "_Iridescence_Texture_",+ "Use_Global_Left_Index",+ "Use_Global_Right_Index",+ "Global_Left_Index_Tip_Position",+ "Global_Right_Index_Tip_Position",+ "Global_Left_Thumb_Tip_Position",+ "Global_Right_Thumb_Tip_Position",+ "Global_Left_Index_Middle_Position;",+ "Global_Right_Index_Middle_Position",+ "Global_Left_Index_Tip_Proximity",+ "Global_Right_Index_Tip_Proximity"+ ], X = ["_Rim_Texture_", "_Iridescence_Texture_"], he = [];+ fc({+ uniformsNames: Q,+ uniformBuffersNames: he,+ samplers: X,+ defines: y,+ maxSimultaneousLights: 4+ }), d.setEffect(M.getEngine().createEffect(ne, {+ attributes: F,+ uniformsNames: Q,+ uniformBuffersNames: he,+ samplers: X,+ defines: $,+ fallbacks: O,+ onCompiled: this.onCompiled,+ onError: this.onError,+ indexParameters: { maxSimultaneousLights: 4 }+ }, N), y);+ }+ return !d.effect || !d.effect.isReady() ? !1 : (y._renderId = M.getRenderId(), g._wasPreviouslyReady = !0, !0);+ }+ bindForSubMesh(i, d, g) {+ if (!g.materialDefines)+ return;+ const M = g.effect;+ M && (this._activeEffect = M, this.bindOnlyWorldMatrix(i), this._activeEffect.setMatrix("viewProjection", this.getScene().getTransformMatrix()), this._activeEffect.setVector3("cameraPosition", this.getScene().activeCamera.position), this._activeEffect.setFloat("_Radius_", this.radius), this._activeEffect.setFloat("_Bevel_Front_", this.bevelFront), this._activeEffect.setFloat("_Bevel_Front_Stretch_", this.bevelFrontStretch), this._activeEffect.setFloat("_Bevel_Back_", this.bevelBack), this._activeEffect.setFloat("_Bevel_Back_Stretch_", this.bevelBackStretch), this._activeEffect.setFloat("_Radius_Top_Left_", this.radiusTopLeft), this._activeEffect.setFloat("_Radius_Top_Right_", this.radiusTopRight), this._activeEffect.setFloat("_Radius_Bottom_Left_", this.radiusBottomLeft), this._activeEffect.setFloat("_Radius_Bottom_Right_", this.radiusBottomRight), this._activeEffect.setFloat("_Bulge_Enabled_", this.bulgeEnabled ? 1 : 0), this._activeEffect.setFloat("_Bulge_Height_", this.bulgeHeight), this._activeEffect.setFloat("_Bulge_Radius_", this.bulgeRadius), this._activeEffect.setFloat("_Sun_Intensity_", this.sunIntensity), this._activeEffect.setFloat("_Sun_Theta_", this.sunTheta), this._activeEffect.setFloat("_Sun_Phi_", this.sunPhi), this._activeEffect.setFloat("_Indirect_Diffuse_", this.indirectDiffuse), this._activeEffect.setDirectColor4("_Albedo_", this.albedo), this._activeEffect.setFloat("_Specular_", this.specular), this._activeEffect.setFloat("_Shininess_", this.shininess), this._activeEffect.setFloat("_Sharpness_", this.sharpness), this._activeEffect.setFloat("_Subsurface_", this.subsurface), this._activeEffect.setDirectColor4("_Left_Color_", this.leftGradientColor), this._activeEffect.setDirectColor4("_Right_Color_", this.rightGradientColor), this._activeEffect.setFloat("_Reflection_", this.reflection), this._activeEffect.setFloat("_Front_Reflect_", this.frontReflect), this._activeEffect.setFloat("_Edge_Reflect_", this.edgeReflect), this._activeEffect.setFloat("_Power_", this.power), this._activeEffect.setDirectColor4("_Sky_Color_", this.skyColor), this._activeEffect.setDirectColor4("_Horizon_Color_", this.horizonColor), this._activeEffect.setDirectColor4("_Ground_Color_", this.groundColor), this._activeEffect.setFloat("_Horizon_Power_", this.horizonPower), this._activeEffect.setTexture("_Reflection_Map_", this._reflectionMapTexture), this._activeEffect.setTexture("_Indirect_Environment_", this._indirectEnvTexture), this._activeEffect.setFloat("_Width_", this.width), this._activeEffect.setFloat("_Fuzz_", this.fuzz), this._activeEffect.setFloat("_Min_Fuzz_", this.minFuzz), this._activeEffect.setFloat("_Clip_Fade_", this.clipFade), this._activeEffect.setFloat("_Hue_Shift_", this.hueShift), this._activeEffect.setFloat("_Saturation_Shift_", this.saturationShift), this._activeEffect.setFloat("_Value_Shift_", this.valueShift), this._activeEffect.setVector3("_Blob_Position_", this.blobPosition), this._activeEffect.setFloat("_Blob_Intensity_", this.blobIntensity), this._activeEffect.setFloat("_Blob_Near_Size_", this.blobNearSize), this._activeEffect.setFloat("_Blob_Far_Size_", this.blobFarSize), this._activeEffect.setFloat("_Blob_Near_Distance_", this.blobNearDistance), this._activeEffect.setFloat("_Blob_Far_Distance_", this.blobFarDistance), this._activeEffect.setFloat("_Blob_Fade_Length_", this.blobFadeLength), this._activeEffect.setFloat("_Blob_Pulse_", this.blobPulse), this._activeEffect.setFloat("_Blob_Fade_", this.blobFade), this._activeEffect.setTexture("_Blob_Texture_", this.blobTexture), this._activeEffect.setVector3("_Blob_Position_2_", this.blobPosition2), this._activeEffect.setFloat("_Blob_Near_Size_2_", this.blobNearSize2), this._activeEffect.setFloat("_Blob_Pulse_2_", this.blobPulse2), this._activeEffect.setFloat("_Blob_Fade_2_", this.blobFade2), this._activeEffect.setVector3("_Left_Index_Pos_", this.leftIndexPosition), this._activeEffect.setVector3("_Right_Index_Pos_", this.rightIndexPosition), this._activeEffect.setVector3("_Left_Index_Middle_Pos_", this.leftIndexMiddlePosition), this._activeEffect.setVector3("_Right_Index_Middle_Pos_", this.rightIndexMiddlePosition), this._activeEffect.setTexture("_Decal_", this._decalTexture), this._activeEffect.setVector2("_Decal_Scale_XY_", this.decalScaleXY), this._activeEffect.setFloat("_Decal_Front_Only_", this.decalFrontOnly ? 1 : 0), this._activeEffect.setFloat("_Rim_Intensity_", this.rimIntensity), this._activeEffect.setTexture("_Rim_Texture_", this._blueGradientTexture), this._activeEffect.setFloat("_Rim_Hue_Shift_", this.rimHueShift), this._activeEffect.setFloat("_Rim_Saturation_Shift_", this.rimSaturationShift), this._activeEffect.setFloat("_Rim_Value_Shift_", this.rimValueShift), this._activeEffect.setFloat("_Iridescence_Intensity_", this.iridescenceIntensity), this._activeEffect.setTexture("_Iridescence_Texture_", this._blueGradientTexture), this._activeEffect.setFloat("Use_Global_Left_Index", this.useGlobalLeftIndex), this._activeEffect.setFloat("Use_Global_Right_Index", this.useGlobalRightIndex), this._activeEffect.setVector4("Global_Left_Index_Tip_Position", this.globalLeftIndexTipPosition), this._activeEffect.setVector4("Global_Right_Index_Tip_Position", this.globaRightIndexTipPosition), this._activeEffect.setVector4("Global_Left_Thumb_Tip_Position", this.globalLeftThumbTipPosition), this._activeEffect.setVector4("Global_Right_Thumb_Tip_Position", this.globalRightThumbTipPosition), this._activeEffect.setVector4("Global_Left_Index_Middle_Position", this.globalLeftIndexMiddlePosition), this._activeEffect.setVector4("Global_Right_Index_Middle_Position", this.globalRightIndexMiddlePosition), this._activeEffect.setFloat("Global_Left_Index_Tip_Proximity", this.globalLeftIndexTipProximity), this._activeEffect.setFloat("Global_Right_Index_Tip_Proximity", this.globalRightIndexTipProximity), this._afterBind(d, this._activeEffect, g));+ }+ /**+ * Get the list of animatables in the material.+ * @returns the list of animatables object used in the material+ */+ getAnimatables() {+ return [];+ }+ dispose(i) {+ super.dispose(i), this._reflectionMapTexture.dispose(), this._indirectEnvTexture.dispose(), this._blueGradientTexture.dispose(), this._decalTexture.dispose();+ }+ clone(i) {+ return Eo.Clone(() => new Ct(i, this.getScene()), this);+ }+ serialize() {+ const i = super.serialize();+ return i.customType = "BABYLON.MRDLSliderThumbMaterial", i;+ }+ getClassName() {+ return "MRDLSliderThumbMaterial";+ }+ // Statics+ static Parse(i, d, g) {+ return Eo.Parse(() => new Ct(i.name, d), i, d, g);+ }+}+Ct.BLUE_GRADIENT_TEXTURE_URL = "https://assets.babylonjs.com/core/MRTK/MRDL/mrtk-mrdl-blue-gradient.png";+q([+ H()+], Ct.prototype, "radius", void 0);+q([+ H()+], Ct.prototype, "bevelFront", void 0);+q([+ H()+], Ct.prototype, "bevelFrontStretch", void 0);+q([+ H()+], Ct.prototype, "bevelBack", void 0);+q([+ H()+], Ct.prototype, "bevelBackStretch", void 0);+q([+ H()+], Ct.prototype, "radiusTopLeft", void 0);+q([+ H()+], Ct.prototype, "radiusTopRight", void 0);+q([+ H()+], Ct.prototype, "radiusBottomLeft", void 0);+q([+ H()+], Ct.prototype, "radiusBottomRight", void 0);+q([+ H()+], Ct.prototype, "bulgeEnabled", void 0);+q([+ H()+], Ct.prototype, "bulgeHeight", void 0);+q([+ H()+], Ct.prototype, "bulgeRadius", void 0);+q([+ H()+], Ct.prototype, "sunIntensity", void 0);+q([+ H()+], Ct.prototype, "sunTheta", void 0);+q([+ H()+], Ct.prototype, "sunPhi", void 0);+q([+ H()+], Ct.prototype, "indirectDiffuse", void 0);+q([+ H()+], Ct.prototype, "albedo", void 0);+q([+ H()+], Ct.prototype, "specular", void 0);+q([+ H()+], Ct.prototype, "shininess", void 0);+q([+ H()+], Ct.prototype, "sharpness", void 0);+q([+ H()+], Ct.prototype, "subsurface", void 0);+q([+ H()+], Ct.prototype, "leftGradientColor", void 0);+q([+ H()+], Ct.prototype, "rightGradientColor", void 0);+q([+ H()+], Ct.prototype, "reflection", void 0);+q([+ H()+], Ct.prototype, "frontReflect", void 0);+q([+ H()+], Ct.prototype, "edgeReflect", void 0);+q([+ H()+], Ct.prototype, "power", void 0);+q([+ H()+], Ct.prototype, "skyColor", void 0);+q([+ H()+], Ct.prototype, "horizonColor", void 0);+q([+ H()+], Ct.prototype, "groundColor", void 0);+q([+ H()+], Ct.prototype, "horizonPower", void 0);+q([+ H()+], Ct.prototype, "width", void 0);+q([+ H()+], Ct.prototype, "fuzz", void 0);+q([+ H()+], Ct.prototype, "minFuzz", void 0);+q([+ H()+], Ct.prototype, "clipFade", void 0);+q([+ H()+], Ct.prototype, "hueShift", void 0);+q([+ H()+], Ct.prototype, "saturationShift", void 0);+q([+ H()+], Ct.prototype, "valueShift", void 0);+q([+ H()+], Ct.prototype, "blobPosition", void 0);+q([+ H()+], Ct.prototype, "blobIntensity", void 0);+q([+ H()+], Ct.prototype, "blobNearSize", void 0);+q([+ H()+], Ct.prototype, "blobFarSize", void 0);+q([+ H()+], Ct.prototype, "blobNearDistance", void 0);+q([+ H()+], Ct.prototype, "blobFarDistance", void 0);+q([+ H()+], Ct.prototype, "blobFadeLength", void 0);+q([+ H()+], Ct.prototype, "blobPulse", void 0);+q([+ H()+], Ct.prototype, "blobFade", void 0);+q([+ H()+], Ct.prototype, "blobPosition2", void 0);+q([+ H()+], Ct.prototype, "blobNearSize2", void 0);+q([+ H()+], Ct.prototype, "blobPulse2", void 0);+q([+ H()+], Ct.prototype, "blobFade2", void 0);+q([+ H()+], Ct.prototype, "blobTexture", void 0);+q([+ H()+], Ct.prototype, "leftIndexPosition", void 0);+q([+ H()+], Ct.prototype, "rightIndexPosition", void 0);+q([+ H()+], Ct.prototype, "leftIndexMiddlePosition", void 0);+q([+ H()+], Ct.prototype, "rightIndexMiddlePosition", void 0);+q([+ H()+], Ct.prototype, "decalScaleXY", void 0);+q([+ H()+], Ct.prototype, "decalFrontOnly", void 0);+q([+ H()+], Ct.prototype, "rimIntensity", void 0);+q([+ H()+], Ct.prototype, "rimHueShift", void 0);+q([+ H()+], Ct.prototype, "rimSaturationShift", void 0);+q([+ H()+], Ct.prototype, "rimValueShift", void 0);+q([+ H()+], Ct.prototype, "iridescenceIntensity", void 0);+kr("BABYLON.GUI.MRDLSliderThumbMaterial", Ct);+const q4 = "mrdlBackplatePixelShader", vF = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vExtra1;varying vec4 vExtra2;uniform float _Radius_;uniform float _Line_Width_;uniform bool _Absolute_Sizes_;uniform float _Filter_Width_;uniform vec4 _Base_Color_;uniform vec4 _Line_Color_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform float _Rate_;uniform vec4 _Highlight_Color_;uniform float _Highlight_Width_;uniform vec4 _Highlight_Transform_;uniform float _Highlight_;uniform float _Iridescence_Intensity_;uniform float _Iridescence_Edge_Intensity_;uniform vec4 _Iridescence_Tint_;uniform sampler2D _Iridescent_Map_;uniform float _Angle_;uniform bool _Reflected_;uniform float _Frequency_;uniform float _Vertical_Offset_;uniform vec4 _Gradient_Color_;uniform vec4 _Top_Left_;uniform vec4 _Top_Right_;uniform vec4 _Bottom_Left_;uniform vec4 _Bottom_Right_;uniform float _Edge_Width_;uniform float _Edge_Power_;uniform float _Line_Gradient_Blend_;uniform float _Fade_Out_;void FastLinearTosRGB_B353(+vec4 Linear,+out vec4 sRGB)+{sRGB.rgb=sqrt(clamp(Linear.rgb,0.0,1.0));sRGB.a=Linear.a;}+void Round_Rect_Fragment_B332(+float Radius,+float Line_Width,+vec4 Line_Color,+float Filter_Width,+vec2 UV,+float Line_Visibility,+vec4 Rect_Parms,+vec4 Fill_Color,+out vec4 Color)+{float d=length(max(abs(UV)-Rect_Parms.xy,0.0));float dx=max(fwidth(d)*Filter_Width,0.00001);float g=min(Rect_Parms.z,Rect_Parms.w);float dgrad=max(fwidth(g)*Filter_Width,0.00001);float Inside_Rect=clamp(g/dgrad,0.0,1.0);float inner=clamp((d+dx*0.5-max(Radius-Line_Width,d-dx*0.5))/dx,0.0,1.0);Color=clamp(mix(Fill_Color,Line_Color,inner),0.0,1.0)*Inside_Rect;}+void Iridescence_B343(+vec3 Position,+vec3 Normal,+vec2 UV,+vec3 Axis,+vec3 Eye,+vec4 Tint,+sampler2D Texture,+bool Reflected,+float Frequency,+float Vertical_Offset,+out vec4 Color)+{vec3 i=normalize(Position-Eye);vec3 r=reflect(i,Normal);float idota=dot(i,Axis);float idotr=dot(i,r);float x=Reflected ? idotr : idota;vec2 xy;xy.x=fract((x*Frequency+1.0)*0.5+UV.y*Vertical_Offset);xy.y=0.5;Color=texture(Texture,xy);Color.rgb*=Tint.rgb;}+void Scale_RGB_B346(+vec4 Color,+float Scalar,+out vec4 Result)+{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}+void Scale_RGB_B344(+float Scalar,+vec4 Color,+out vec4 Result)+{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}+void Line_Fragment_B362(+vec4 Base_Color,+vec4 Highlight_Color,+float Highlight_Width,+vec3 Line_Vertex,+float Highlight,+out vec4 Line_Color)